在访问专用 AKS 群集时,需要从群集虚拟网络、对等互连网络或通过已配置的专用终结点连接到群集。 这些方法需要配置 VPN、Express Route、在群集虚拟网络中部署 jumpbox,或在另一个虚拟网络中创建专用终结点。
通过 Azure CLI,可以使用 command invoke
访问专用群集,而无需配置 VPN 或快速路由。 使用 command invoke
,可以通过 Azure API 在专用群集上远程调用 kubectl
和 helm
等命令,而无需直接连接到群集。
Microsoft.ContainerService/managedClusters/runcommand/action
和 Microsoft.ContainerService/managedclusters/commandResults/read
操作控制使用 command invoke
的权限。
通过 Azure 门户,可以使用 Run command
功能在专用群集上运行命令。
Run command
功能会使用相同的 command invoke
功能在群集上运行命令。
Run command
创建的 Pod 提供了 kubectl
和 helm
来操作群集。
jq
、xargs
、grep
和 awk
可用于 Bash 支持。
开始之前
在开始之前,请确保拥有以下资源和权限:
- 现有的专用群集。 如果还没有群集,请参阅创建专用 AKS 群集。
- Azure CLI 2.24.0 或更高版本。 运行
az --version
即可查找版本。 如果需要进行安装或升级,请参阅安装 Azure CLI。 - 对群集上的
Microsoft.ContainerService/managedClusters/runcommand/action
和Microsoft.ContainerService/managedclusters/commandResults/read
角色的访问权限。
限制
此功能旨在简化群集访问,并非设计用于以编程方式进行访问。 应通过 Bastion、VPN 或 Express Route 利用直接 API 访问,以编程方式调用群集。
如果使用 Run command
让一个程序调用 Kubernetes,将会有以下缺点:
- 你只会收到 exitCode 和文本输出,而会丢失 API 级别详细信息。
- 一个额外的跃点会引入额外的故障点。
由Run command
创建的 Pod 具有200m CPU
和500Mi memory
请求,并且有500m CPU
和1Gi 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-system
的 myPrivateCluster 群集上运行 命令。
首先,为资源组和群集名称设置环境变量,以便在后续命令中使用。
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 群集的详细信息,请参阅以下文章: