如何用Python实现kubectl apply -f逻辑创建Deployment避免更新警告
Kubernetes Python客户端创建资源后kubectl apply警告解决方案
问题原因
你提到的警告是因为kubectl apply依赖kubectl.kubernetes.io/last-applied-configuration注解做配置变更的三方合并对比,Python客户端的create_namespaced_deployment接口对应kubectl create的逻辑,默认不会自动注入该注解,因此触发警告。
可行解决方案
方案1:使用服务端Apply接口(完全等价kubectl apply逻辑)
Kubernetes 1.16及以上版本支持服务端Apply能力,Python客户端可以通过该接口实现和kubectl apply -f完全一致的效果,无需手动处理注解,资源不存在时自动创建,存在时自动更新,同时自动维护对应注解:
- 调用
patch_namespaced_deployment方法时指定content_type='application/apply-patch+yaml',同时设置field_manager='kubectl'和kubectl默认的字段管理者保持一致即可。
示例代码:
from kubernetes import client, config config.load_kube_config() apps_v1_api = client.AppsV1Api() # 你的完整Deployment配置字典 deployment_manifest = { "apiVersion": "apps/v1", "kind": "Deployment", "metadata": {"name": "frontend-deployment"}, # 剩余spec配置... } resp = apps_v1_api.patch_namespaced_deployment( name=deployment_manifest["metadata"]["name"], namespace="default", body=deployment_manifest, content_type="application/apply-patch+yaml", field_manager="kubectl", # 存在字段管理冲突时可开启force强制覆盖 # force=True )
方案2:创建资源时手动注入注解(兼容现有create逻辑)
如果不想修改现有创建流程,只需要在调用create_namespaced_deployment前,给Deployment的metadata.annotations手动注入对应注解,值为创建用的配置的JSON序列化字符串即可:
示例代码:
import json from kubernetes import client, config config.load_kube_config() apps_v1_api = client.AppsV1Api() deployment_body = { "apiVersion": "apps/v1", "kind": "Deployment", "metadata": { "name": "frontend-deployment", "annotations": {} }, # 剩余spec配置... } # 注入kubectl apply所需注解 deployment_body["metadata"]["annotations"]["kubectl.kubernetes.io/last-applied-configuration"] = json.dumps(deployment_body) # 执行原有创建逻辑 resp = apps_v1_api.create_namespaced_deployment( namespace="default", body=deployment_body )
方案3:无需修改代码的临时修复方式
如果不想调整Python侧逻辑,首次手动执行kubectl apply时添加--save-config参数,kubectl会自动给已有资源补全缺失的注解,后续再执行apply操作就不会触发警告:
kubectl apply -f your-deployment.yaml --save-config
内容的提问来源于stack exchange,提问作者amanaganti ramreddy
相关产品推荐
相关产品推荐

