如何在每次部署时提取kubernetes上的映像

如何在每次部署时提取kubernetes上的映像,kubernetes,cloud,google-kubernetes-engine,google-cloud-build,Kubernetes,Cloud,Google Kubernetes Engine,Google Cloud Build,嗨,我正试图通过云构建在我的gke集群上部署。我能够部署。但每次我推送新映像时。我的集群不会拾取新映像,而是仅使用旧映像部署pod(没有任何更改)。当我删除pod并触发cloudbuild时,它会拾取新映像。我还添加了ImagePullPolicy=Always。 下面是我的cloudbuild.yaml文件 - id: 'build your instance' name: 'maven:3.6.0-jdk-8-slim' entrypoint: mvn args: ['clean','p

嗨,我正试图通过云构建在我的gke集群上部署。我能够部署。但每次我推送新映像时。我的集群不会拾取新映像,而是仅使用旧映像部署pod(没有任何更改)。当我删除pod并触发cloudbuild时,它会拾取新映像。我还添加了ImagePullPolicy=Always。 下面是我的cloudbuild.yaml文件

  - id: 'build your instance'
name: 'maven:3.6.0-jdk-8-slim'
entrypoint: mvn
args: ['clean','package','-Dmaven.test.skip=true']
- id: "docker build"  
name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/PID/test', '.']
name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/PID/TEST']
- id: 'Deploy image to kubernetes'
name: 'gcr.io/cloud-builders/gke-deploy'
args:
- run
- --filename=./run/helloworld/src
- --location=us-central1-c
- --cluster=cluster-2
我的舱单是这样的

apiVersion: v1
kind: Pod
metadata:
  name: Test
  labels:
     app: hello
spec:
  containers:
   - name: private-reg-containers
     image: gcr.io/PID/test
     imagePullPolicy: "Always"

非常感谢您的帮助。

这是一种预期行为,您可能会混淆
imagePullPolicy的用法:“始终”
。这一点在以下方面得到了很好的解释:

库伯内特斯并没有关注这幅图像的新版本。映像提取策略指定如何获取映像以运行容器。总是意味着每次启动容器时,它都会尝试拉取一个新版本。要查看更新,您需要删除Pod(而不是部署)-新创建的Pod将运行新映像。

没有直接的方法让Kubernetes自动用新图像更新正在运行的容器。这将是连续交付系统的一部分(可能使用kubectl set image和新的sha256sum或图像标签,但不是最新的)

这就是为什么当你重新创建豆荚时,这些豆荚会得到最新的图像。因此,您的问题的答案是明确告诉K8s获取最新图像。在我与您共享的示例中,我使用了两个标记,clasic
latest
,它更用于使用友好名称共享图像,以及使用
$BUILD\u ID
的标记,它用于更新GKE中的图像。在这个例子中,我更新了一个部署的映像,所以您只需要将它更改为更新一个独立的pod,这应该是您的小“家庭作业”

步骤:
#建筑形象
-名称:“gcr.io/cloud builders/docker”
id:BuildLoona
args:
-建造
---tag=${u LOONA}:$BUILD\u ID
---tag=${u LOONA}:最新
- .
dir:'loona/'
等待:['-']
#推送图像(这将推送带有两个标记的图像)
-名称:“gcr.io/cloud builders/docker”
id:push-loona
args:
-推
-${u LOONA}
等待:
-建造卢纳
#部署到GKE
-名称:“gcr.io/cloudbuilders/gke部署”
id:部署gke
args:
-跑
---文件名=k8s/
---位置=${u计算\ u区域}
---cluster=${u cluster\u NAME}
#更新图像
-名称:“gcr.io/cloud builders/kubectl”
id:更新loona
args:
-设置
-形象
-部署/loona部署
-loona=${u loona}:$BUILD\u ID
环境:
-'CLOUDSDK_COMPUTE_ZONE=${u COMPUTE_ZONE}'
-'CLOUDSDK_容器_集群=${u集群_名称}'
等待:
-部署gke
替换:
_集群名称:我的集群
_计算区:us-central1
_LOONA:gcr.io/${PROJECT_ID}/LOONA

我认为这是预期的行为。您需要以某种方式告诉K8SAPI服务器更新正在运行的版本。如果您使用的是k8s部署,您可以使用类似于kubectl卷展栏命令的命令。但是,我如何使它在管道中工作,因为它已经部署,即使我使用卷展栏,部署阶段也会触发任何方式。