Ansible Kubernetes插件未切换集群上下文,无法连接远程集群
一、修复kubernetes.core.k8s模块(如k8s_info)的连接问题
这十有八九是Ansible没正确加载cluster-2的kubeconfig或认证信息,按以下步骤排查修正:
直接指定kubeconfig与context
在playbook任务中明确指定目标集群的配置文件和上下文,避免依赖默认路径:- name: 获取cluster-2的Pod列表 kubernetes.core.k8s_info: kind: Pod kubeconfig: "/path/to/cluster-2-kubeconfig.yaml" context: "cluster-2-context-name" # 对应kubeconfig里的集群上下文名称若用k8s库存插件,也要确保inventory配置指向正确的kubeconfig:
# inventory/k8s_inventory.yaml plugin: kubernetes.core.k8s kubeconfig: /path/to/cluster-2-kubeconfig.yaml context: cluster-2-context-name排查ansible.cfg的全局冲突
检查ansible.cfg是否存在全局覆盖kubeconfig的配置,比如:[defaults] kubernetes.core.kubeconfig = /path/to/wrong-kubeconfig.yaml有就删掉,或者在playbook中通过模块参数/变量强制覆盖。
验证kubeconfig本身有效性
手动执行kubectl --kubeconfig=/path/to/cluster-2-kubeconfig.yaml get pods,确认能正常获取cluster-2的Pod,排除配置文件本身的错误(比如服务器地址写错、证书过期、token无效)。
二、修复shell模块执行kubectl的连接问题
shell模块执行kubectl时会用当前环境的默认kubeconfig,必须显式指定目标集群:
命令行直接指定kubeconfig
- name: 通过kubectl获取cluster-2的Pod列表 shell: kubectl --kubeconfig=/path/to/cluster-2-kubeconfig.yaml --context=cluster-2-context-name get pods register: cluster2_pods通过环境变量传递配置
不想每次加参数的话,可设置环境变量:- name: 设置kubeconfig环境变量并执行kubectl shell: kubectl get pods environment: KUBECONFIG: "/path/to/cluster-2-kubeconfig.yaml" KUBECTL_CONTEXT: "cluster-2-context-name"
三、全局排查要点
检查执行用户权限
确保Ansible执行用户(比如ansible用户或你的登录用户)能读取cluster-2的kubeconfig文件,文件权限设为600(符合Kubernetes安全规范)。从-vvvv日志找线索
重点看这些日志内容:- 是否有
kubeconfig path的记录,确认路径是否指向cluster-2的配置 - 是否出现
Using context的日志,检查上下文是否为cluster-2 - shell模块执行kubectl时,是否传递了正确的kubeconfig参数或环境变量
- 是否有
验证库存插件加载结果
执行ansible-inventory -i inventory/k8s_inventory.yaml --list,查看输出是否包含cluster-2的节点和资源,确认库存插件是否正确连接目标集群。
内容的提问来源于stack exchange,提问作者RNK

