如何通过SSH免登录在Azure AKS集群节点执行命令实现批量补丁更新
AKS节点批量补丁更新可行方案
方案1:特权DaemonSet批量执行命令(推荐,无需SSH配置)
该方案利用Kubernetes原生能力实现,不需要开放节点SSH端口,完全规避连接超时问题,适配所有AKS集群。
- 编写补丁更新DaemonSet配置,使用带apt工具的基础镜像,开启特权模式挂载节点根目录,通过chroot进入节点系统执行更新命令:
apiVersion: apps/v1 kind: DaemonSet metadata: name: node-patch-updater namespace: kube-system spec: selector: matchLabels: job: node-patch template: metadata: labels: job: node-patch spec: tolerations: # 容忍所有节点污点,确保覆盖包括主节点在内的所有节点 - operator: Exists hostPID: true hostNetwork: true containers: - name: patch-runner image: ubuntu:18.04 securityContext: privileged: true command: ["chroot", "/host", "/bin/bash", "-c"] args: - | apt update && apt upgrade -y # 若补丁更新后需要重启,可取消注释下方命令,会触发节点按K8s规则排空后重启 # [ -f /var/run/reboot-required ] && systemctl reboot volumeMounts: - name: host-root mountPath: /host volumes: - name: host-root hostPath: path: / restartPolicy: OnFailure
- 批量对接所有AKS集群上下文,循环执行
kubectl apply -f node-patch.yaml下发任务 - 执行
kubectl logs -n kube-system -l job=node-patch查看所有节点的更新日志,确认全部完成后删除任务:kubectl delete ds node-patch-updater -n kube-system
方案2:VMSS RunCommand接口批量执行(Azure原生能力,无需SSH)
AKS节点池底层基于Azure虚拟机规模集(VMSS)实现,可直接调用Azure官方接口在节点内执行命令,不需要配置任何SSH相关规则。
- 先安装Azure CLI并完成账号认证:
az login - 编写批量执行脚本,遍历所有集群、节点池对应的VMSS资源执行更新命令,示例代码如下:
# 遍历订阅下所有AKS集群 for cluster in $(az aks list --query "[].name" -o tsv); do # 获取集群所属资源组 rg=$(az aks show --name $cluster --query "resourceGroup" -o tsv) # 遍历集群下所有节点池对应的VMSS for vmss in $(az aks nodepool list --cluster-name $cluster --resource-group $rg --query "[].vmSetName" -o tsv); do # 对VMSS所有实例触发补丁更新命令 az vmss run-command invoke \ --resource-group $rg \ --name $vmss \ --command-id RunShellScript \ --scripts "apt update && apt upgrade -y" \ --query "value[].{instanceId:instanceId, status:executionState, output:message}" done done
- 该方法默认超时时间为90分钟,可通过
--timeout-in-seconds参数自定义,执行日志会直接在命令返回结果中展示,无需额外排查。
方案3:修复SSH执行配置
SSH无法直接执行命令、连接超时的问题可通过调整配置解决:
- 首先确认客户端机器与AKS节点网络已打通(同VNet、VNet对等或VPN连接),90%的2分钟超时问题由网络不通导致
- 不需要直接访问节点内部IP,可通过kubectl debug命令直接在节点上执行命令,格式如下:
kubectl debug -it node/<节点名称> --image=mcr.microsoft.com/aks/fundamental/base-ubuntu:v0.0.11 -- chroot /host bash -c "待执行的命令"
- 批量执行可先通过
kubectl get nodes -o name获取所有节点名称,循环执行上述命令即可。
内容的提问来源于stack exchange,提问作者Salim
相关产品推荐
相关产品推荐

