Ubuntu环境下Ansible调用K8s模块时缺失kubernetes.dynamic模块问题
核心问题定位
你搞反了依赖安装的位置——Ansible是在Docker容器里运行的,所以需要安装kubernetes Python包的是Docker容器内的Python环境,而不是Kubernetes集群节点。集群节点根本不需要装这个包,因为Ansible是通过K8s API远程操作集群,不会在节点上执行本地Python代码。
关于kubernetes.dynamic
kubernetes.dynamic是官方Python Kubernetes客户端的子模块,用来动态生成K8s资源(包括自定义CRD)的操作客户端,Ansible的k8s系列模块(比如k8s、k8s_info)依赖这个模块来处理非内置的K8s资源类型,或者实现更灵活的资源操作逻辑。它是随kubernetes Python包一起发布的,只要安装了对应版本的kubernetes包,这个子模块就会存在。
为什么生产环境报错?
测试环境正常是因为你的测试用Docker容器里已经装了kubernetes包,而生产环境的Docker容器没装,或者装的版本有问题。你提到集群节点装了kubernetes 25.3.0,但这完全没用,因为Ansible根本不会用节点上的Python环境。
解决步骤
检查Docker容器内的Python依赖
进入生产环境的Ansible Docker容器,执行:pip list | grep kubernetes如果没有输出,说明容器里没装
kubernetes包;如果有,确认版本是否和测试环境一致(比如25.3.0)。在Docker镜像中预装依赖
修改你的Ansible Docker镜像的Dockerfile,添加安装命令:RUN pip install --no-cache-dir kubernetes==25.3.0重新构建镜像并部署到生产环境。
确认Ansible使用的Python解释器
如果容器里有多个Python环境,确保Ansible用的是装了kubernetes包的那个。可以在playbook的vars里指定:vars: ansible_python_interpreter: /usr/bin/python3 # 替换成容器内正确的Python路径清理集群节点的无用依赖
既然集群节点不需要kubernetes包,完全可以卸载掉,避免混淆:pip uninstall -y kubernetes
内容的提问来源于stack exchange,提问作者Joseph Gagnon

