使用Kustomization更新Deployment镜像版本时遇报错及镜像未更新问题
Kustomize部署问题排查与解决
1. 初始error: no objects passed to apply错误原因
Kustomize是基于已有资源进行定制的工具,必须在Kustomization.yaml中通过resources字段指定要处理的原始资源文件。你最初的配置缺少这个字段,导致kubectl无法识别要操作的对象,因此报错。
2. 镜像版本未更新的核心问题
你的Deployment中镜像字段的写法不符合规范:
image: <image>0.0.1
这种写法没有用冒号分隔镜像名和标签,Kustomize会把<image>0.0.1当作完整的镜像名称,而你在Kustomization.yaml中指定的images.name是<image>,两者无法匹配,所以镜像替换规则完全不生效。
3. Patch操作的潜在问题
你当前的patch使用path: /spec/template/spec/containers/0/env/0加add操作,这会在env数组的第0个位置插入新变量,直接覆盖原来的databse_url环境变量,这大概率不是你想要的效果。
修正后的配置
第一步:修正Deployment.yaml的镜像字段
把镜像名和标签用冒号分隔,符合Docker镜像的标准写法:
apiVersion: v1 kind: Namespace metadata: name: booking --- apiVersion: apps/v1 kind: Deployment metadata: name: booking-deployment namespace: booking labels: app: booking-app spec: replicas: 1 selector: matchLabels: app: booking-app template: metadata: labels: app: booking-app spec: containers: - name: booking-pod # 修正:用冒号分隔镜像名与标签 image: <image>:0.0.1 ports: - containerPort: 8080 env: - name: databse_url value: <db_url> - name: databse_username value: <db_username> - name: databse_password value: <db_password>
第二步:修正Kustomization.yaml
添加resources字段指定原始资源,同时调整patch路径避免覆盖原有环境变量:
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization # 指定要处理的原始资源文件 resources: - Deployment.yaml patches: - target: kind: Deployment name: booking-deployment patch: |- - op: add # 使用/-/表示在env数组末尾添加新元素,不会覆盖原有变量 path: /spec/template/spec/containers/0/env/- value: name: coupon_service_url value: <url_to_coupon_service> images: - name: <image> newName: docker.io/<username>/<image> newTag: 0.0.9
验证与部署
- 先执行
kubectl kustomize .查看生成的YAML,确认镜像版本和环境变量是否符合预期 - 执行
kubectl apply -k .应用配置 - 检查Pod镜像是否更新:
kubectl get pods -n booking -o jsonpath='{.items[0].spec.containers[0].image}'
内容的提问来源于stack exchange,提问作者Rushikesh Yadav
相关产品推荐
相关产品推荐

