You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kubernetes Deployment文件中配置镜像名为变量及AWS CodePipeline部署Kubernetes应用的技术问询

Kubernetes Deployment镜像变量配置与AWS CodePipeline部署方案

一、如何在Deployment文件中将镜像名称配置为变量

这里有几种实用的实现方式,你可以根据场景选择最合适的:

1. 使用envsubst做静态变量替换

先写一个带占位符的Deployment模板(比如命名为deployment-template.yaml):

apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app-container
        image: ${IMAGE_REPO}:${IMAGE_TAG}
        ports:
        - containerPort: 80

部署前通过环境变量替换占位符,再执行部署:

# 设置镜像相关环境变量
export IMAGE_REPO=123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app
export IMAGE_TAG=v1.0.0
# 生成最终配置并部署
envsubst < deployment-template.yaml | kubectl apply -f -

2. 用Kustomize动态替换镜像

Kustomize是K8s官方的配置管理工具,无需模板语法,直接在kustomization.yaml中定义替换规则:

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- deployment.yaml  # 指向你原本的Deployment文件(即使里面是固定镜像名也可以)
images:
- name: old-image-name  # 原Deployment里的镜像名称
  newName: 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app  # 替换后的镜像仓库
  newTag: v1.0.0  # 替换后的标签

部署时直接运行:

kubectl apply -k .

3. 复杂场景用Helm模板

如果你的应用配置较多,Helm的模板能力会更灵活。先在values.yaml中定义镜像参数:

image:
  repository: 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app
  tag: v1.0.0

然后在Deployment模板(templates/deployment.yaml)中引用变量:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: {{ .Release.Name }}-my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: {{ .Release.Name }}-my-app
  template:
    metadata:
      labels:
        app: {{ .Release.Name }}-my-app
    spec:
      containers:
      - name: my-app-container
        image: {{ .Values.image.repository }}:{{ .Values.image.tag }}
        ports:
        - containerPort: 80

部署时可以直接指定参数覆盖默认值:

helm install my-app ./my-chart --set image.tag=v1.0.1

二、AWS CodePipeline场景下的Deployment部署方案

你已经完成了CodeBuild推送镜像到ECR,接下来分两种场景处理:

场景1:修改Git仓库中的Deployment镜像名,基于新版本部署

这个方案适合GitOps模式,步骤如下:

  1. 在CodeBuild阶段生成唯一镜像标签:比如用Git commit hash作为标签,在buildspec.yml中添加:
env:
  variables:
    ECR_REPO_URI: 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app
phases:
  build:
    commands:
      # 截取commit hash前7位作为唯一标签
      - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
      - IMAGE_TAG=$COMMIT_HASH
      - docker build -t $ECR_REPO_URI:$IMAGE_TAG .
      - docker push $ECR_REPO_URI:$IMAGE_TAG
  post_build:
    commands:
      # 替换Deployment文件中的镜像标签
      - sed -i "s|image: $ECR_REPO_URI:.*|image: $ECR_REPO_URI:$IMAGE_TAG|" k8s/deployment.yaml
      # 提交修改到Git仓库(需要给CodeBuild配置Git写入权限,比如SSH密钥或IAM权限)
      - git config --global user.name "CodeBuild Bot"
      - git config --global user.email "codebuild@example.com"
      - git add k8s/deployment.yaml
      - git commit -m "Update image tag to $IMAGE_TAG"
      - git push origin main
  1. 添加CodePipeline部署阶段:可以用Argo CD(监听Git仓库变化自动触发部署),或者用CodeBuild执行kubectl apply -f k8s/deployment.yaml(需要给CodeBuild角色配置K8s集群访问权限,比如通过OIDC身份认证)。

场景2:保持镜像名称不变(比如用latest标签),直接部署新版本

这种情况无需修改Git文件,直接在部署阶段触发K8s滚动更新:

  1. 在CodePipeline中添加部署阶段:用CodeBuild作为部署动作,buildspec.yml内容如下:
env:
  variables:
    ECR_REPO_URI: 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-app
    DEPLOYMENT_NAME: my-app
    CONTAINER_NAME: my-app-container
phases:
  build:
    commands:
      # 配置kubectl访问EKS集群
      - aws eks update-kubeconfig --name my-eks-cluster --region us-east-1
      # 触发滚动更新:强制拉取最新镜像(即使标签不变)
      - kubectl set image deployment/$DEPLOYMENT_NAME $CONTAINER_NAME=$ECR_REPO_URI:latest --record
      # 或者直接重启Deployment触发更新
      - kubectl rollout restart deployment/$DEPLOYMENT_NAME
  1. 权限配置:确保CodeBuild的服务角色拥有eks:UpdateKubeconfig权限,同时K8s集群的IAM角色绑定了CodeBuild角色的权限,允许执行kubectl set image或kubectl rollout命令。

内容的提问来源于stack exchange,提问作者Waseem Mir

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 11:32:46