如何在GKE指定节点池自动部署Pod并更新镜像
解决方案:GKE自动部署+指定节点调度+镜像更新生效
一、修复镜像更新不生效问题
确保镜像标签唯一生成
在GitHub Action中添加标签生成步骤,保证每次代码推送都生成全新的日期标签:- name: Generate unique image tag id: date run: echo "date=$(date +'%Y-%m-%d-%H%M')" >> $GITHUB_OUTPUT修正部署脚本的拼写错误
原脚本中集群名称devpops-prod-standard疑似笔误,应为devops-prod-standard,同时添加可选的重启命令确保更新触发:- name: Deploy to PROD Env (GKE) run: | gcloud components install gke-gcloud-auth-plugin gcloud container clusters get-credentials devops-prod-standard --region us-central1 --project devops-production kubectl set image deployment/devops-test devops-test=${{ env.GAR_LOCATION }}-docker.pkg.dev/${{ env.PROD_PROJECT }}/${{ env.REPOSITORY }}/${{ env.IMAGE }}:${{ steps.date.outputs.date }} -n devops # 可选:强制重启Deployment,确保Pod拉取新镜像 kubectl rollout restart deployment devops-test -n devops确认镜像拉取策略
现有Deployment中imagePullPolicy: Always配置正确,无需修改,该配置会确保Pod启动时拉取最新镜像。
二、配置Pod仅调度到指定节点
步骤1:给目标节点添加自定义标签
通过kubectl给指定的2个节点打上统一标签,方便后续调度管理:
kubectl label nodes gke-devops-prod-stan-devops-node-pool-8836938a-9gpw dedicated=devops-test-node kubectl label nodes gke-devops-prod-stan-devops-node-pool-bc9b2051-5zvg dedicated=devops-test-node
步骤2:修改Deployment的节点亲和性配置
替换原有affinity字段,配置强制亲和性,确保Pod只能调度到打了上述标签的节点:
apiVersion: apps/v1 kind: Deployment metadata: name: devops-test namespace: devops spec: replicas: 2 selector: matchLabels: app: devops-test template: metadata: labels: app: devops-test spec: containers: - name: devops-test image: us-south1-docker.pkg.dev/xxxxxxxxxxxxxxx:2024-07-29-1532 imagePullPolicy: Always ports: - containerPort: 8080 resources: requests: cpu: 1000m memory: 1024Mi limits: cpu: 2000m memory: 2048Mi # 强制节点亲和性配置 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: dedicated operator: In values: - devops-test-node
说明:
requiredDuringSchedulingIgnoredDuringExecution表示Pod必须满足亲和性条件才能被调度,且运行时忽略节点标签变化。如果需要直接通过节点名称调度,可将key改为kubernetes.io/hostname,values填入两个节点的名称,但自定义标签的方式更灵活(节点替换时无需修改Deployment)。
三、验证配置
部署完成后,执行以下命令验证效果:
- 检查Pod运行节点:
kubectl get pods -n devops -o wide - 检查镜像标签是否为最新:
kubectl get deployment devops-test -n devops -o jsonpath='{.spec.template.spec.containers[0].image}' - 确认滚动更新状态:
kubectl rollout status deployment devops-test -n devops
内容的提问来源于stack exchange,提问作者cloudnetwork
相关产品推荐
相关产品推荐

