使用命令调用或运行命令功能访问专用 Azure Kubernetes 服务 (AKS) 群集

在访问专用 AKS 群集时,需要从群集虚拟网络、对等互连网络或通过已配置的专用终结点连接到群集。 这些方法需要配置 VPN、Express Route、在群集虚拟网络中部署 jumpbox,或在另一个虚拟网络中创建专用终结点。

通过 Azure CLI,可以使用 command invoke 访问专用群集,而无需配置 VPN 或快速路由。 使用 command invoke,可以通过 Azure API 在专用群集上远程调用 kubectlhelm 等命令,而无需直接连接到群集。 Microsoft.ContainerService/managedClusters/runcommand/actionMicrosoft.ContainerService/managedclusters/commandResults/read 操作控制使用 command invoke 的权限。

通过 Azure 门户,可以使用 Run command 功能在专用群集上运行命令。 Run command 功能会使用相同的 command invoke 功能在群集上运行命令。

Run command 创建的 Pod 提供了 kubectlhelm 来操作群集。 jqxargsgrepawk 可用于 Bash 支持。

开始之前

在开始之前,请确保拥有以下资源和权限:

  • 现有的专用群集。 如果还没有群集,请参阅创建专用 AKS 群集
  • Azure CLI 2.24.0 或更高版本。 运行 az --version 即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI
  • 对群集上的 Microsoft.ContainerService/managedClusters/runcommand/actionMicrosoft.ContainerService/managedclusters/commandResults/read 角色的访问权限。

限制

此功能旨在简化群集访问,并非设计用于以编程方式进行访问。 应通过 Bastion、VPN 或 Express Route 利用直接 API 访问,以编程方式调用群集。

如果使用 Run command 让一个程序调用 Kubernetes,将会有以下缺点:

  • 你只会收到 exitCode 和文本输出,而会丢失 API 级别详细信息。
  • 一个额外的跃点会引入额外的故障点。

Run command创建的 Pod 具有200m CPU500Mi memory请求,并且有500m CPU1Gi memory限制。 如果所有节点已满或超额分配,Pod 可能无法在 ARM API 超时 60 秒内进行调度。 这意味着 Run command 调用会失败。

command invoke 从群集运行命令,因此以这种方式运行的任何命令都受配置的网络限制和任何其他已配置的限制的约束。 确保群集中存在足够的节点和资源来调度此命令 pod。

注意

command invoke 的输出大小限制为 512kB。

在 AKS 群集上运行命令

下面是如何使用 az aks command invoke 对专用 AKS 群集执行命令的示例。 这些示例假定你有一个现有的资源组和 AKS 群集。

使用 command invoke 运行单个命令

可以使用该命令在群集 az aks command invoke --command 上运行命令。 以下示例命令在 kubectl get pods -n kube-systemmyPrivateCluster 群集上运行 命令。

首先,为资源组和群集名称设置环境变量,以便在后续命令中使用。

export AKS_RESOURCE_GROUP="myResourceGroup"
export AKS_CLUSTER_NAME="myPrivateCluster"

上述环境变量允许在后续部分中运行 AKS 命令,而无需重写其名称。

若要在 AKS 群集上运行单个 kubectl 命令,请执行以下作:

az aks command invoke \
  --resource-group $AKS_RESOURCE_GROUP \
  --name $AKS_CLUSTER_NAME \
  --command "kubectl get pods -n kube-system"

使用 command invoke 运行多个命令

还可以运行多个命令。 以下示例在群集上按顺序执行三 helm 个命令。

az aks command invoke \
  --resource-group $AKS_RESOURCE_GROUP \
  --name $AKS_CLUSTER_NAME \
  --command "helm repo add bitnami https://charts.bitnami.com/bitnami && helm repo update && helm install my-release bitnami/nginx"

使用 command invoke 运行附带文件的命令

将参数与 --file 一起使用 az aks command invoke时,该文件必须存在,并且可在当前工作目录中访问。 下面,我们将创建一个用于演示的最小部署文件。

若要运行附加了文件的命令,请先创建一个名为 deployment.yaml 的 Kubernetes 清单文件。 以下示例创建一个小型 nginx 部署并将其应用于 command invoke

cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.21.6
        ports:
        - containerPort: 80
EOF

az aks command invoke \
  --resource-group $AKS_RESOURCE_GROUP \
  --name $AKS_CLUSTER_NAME \
  --command "kubectl apply -f deployment.yaml -n default" \
  --file deployment.yaml

使用 command invoke 运行附加了当前目录中所有文件的命令

仅使用较小的必要文件以避免超过系统大小限制。 下面,将创建两个最小的 YAML 文件,然后附加它们。

cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-demo
  template:
    metadata:
      labels:
        app: nginx-demo
    spec:
      containers:
      - name: nginx
        image: nginx:1.21.6
        ports:
        - containerPort: 80
EOF

cat <<EOF > configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: nginx-config
data:
  welcome-message: "Hello from configmap"
EOF

az aks command invoke \
  --resource-group $AKS_RESOURCE_GROUP \
  --name $AKS_CLUSTER_NAME \
  --command "kubectl apply -f deployment.yaml -f configmap.yaml -n default" \
  --file deployment.yaml \
  --file configmap.yaml

禁用 Run command

可以通过将Run command来禁用.properties.apiServerAccessProfile.disableRunCommand功能。

故障排除

有关 az aks command invoke 的最常见问题及其解决方法的信息,请参阅解决 az aks command invoke 失败

后续步骤

本文介绍了如何访问专用群集并在该群集上运行命令。 有关 AKS 群集的详细信息,请参阅以下文章: