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

如何在GKE指定节点池自动部署Pod并更新镜像

解决方案:GKE自动部署+指定节点调度+镜像更新生效

一、修复镜像更新不生效问题

  1. 确保镜像标签唯一生成
    在GitHub Action中添加标签生成步骤,保证每次代码推送都生成全新的日期标签:

    - name: Generate unique image tag
      id: date
      run: echo "date=$(date +'%Y-%m-%d-%H%M')" >> $GITHUB_OUTPUT
    
  2. 修正部署脚本的拼写错误
    原脚本中集群名称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
    
  3. 确认镜像拉取策略
    现有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)。

三、验证配置

部署完成后,执行以下命令验证效果:

  1. 检查Pod运行节点:
    kubectl get pods -n devops -o wide
    
  2. 检查镜像标签是否为最新:
    kubectl get deployment devops-test -n devops -o jsonpath='{.spec.template.spec.containers[0].image}'
    
  3. 确认滚动更新状态:
    kubectl rollout status deployment devops-test -n devops
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:54:53