我有以下复制控制器在Kubernetes上的GKE:

apiVersion: v1
kind: ReplicationController
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 2
  selector:
    app: myapp
    deployment: initial
  template:
    metadata:
      labels:
        app: myapp
        deployment: initial
    spec:
      containers:
      - name: myapp
        image: myregistry.com/myapp:5c3dda6b
        ports:
        - containerPort: 80
      imagePullPolicy: Always
      imagePullSecrets:
        - name: myregistry.com-registry-key

现在,如果我说

kubectl rolling-update myapp --image=us.gcr.io/project-107012/myapp:5c3dda6b

执行滚动更新,但不重新拉取。为什么?


当前回答

现在,命令kubectl rollout restart deploy your - deployment结合imagePullPolicy: Always策略将允许您使用最新版本的映像重新启动所有pod。

其他回答

如果你想在特定的pod上执行直接的图像更新,你也可以使用kubectl set image。

https://kubernetes.io/docs/concepts/workloads/controllers/deployment/

您可以在部署文件中定义imagePullPolicy: Always。

显然,现在当您使用与现有容器映像相同的——image参数运行滚动更新时,还必须指定一个——image-pull-policy。下面的命令应该强制拉出与容器图像相同的图像:

Kubectl滚动更新myapp——image=us.gcr。io/project-107012/myapp:5c3dda6b——

# Linux

kubectl patch deployment <name> -p "{\"spec\":{\"template\":{\"metadata\":{\"annotations\":{\"date\":\"`date +'%s'`\"}}}}}"

# windows

kubectl patch deployment <name> -p (-join("{\""spec\"":{\""template\"":{\""metadata\"":{\""annotations\"":{\""date\"":\""" , $(Get-Date -Format o).replace(':','-').replace('+','_') , "\""}}}}}"))

Kubernetes将在Pod创建时拉动(参见updates -images doc):

使用标记为:最新的图像 imagePullPolicy:始终被指定

如果你想一直拉,这很好。但如果您想按需执行该操作:例如,如果您想使用某些公共映像:latest,但只希望在您要求时手动提取更新的版本。您目前可以:

将imagePullPolicy设置为IfNotPresent或Never并预拉:在每个集群节点上手动拉出最新的图像,以便缓存最新的图像,然后执行kubectl滚动更新或类似的重启Pods(丑陋的容易破坏的hack!) 临时更改imagePullPolicy,执行kubectl apply,重新启动pod(例如kubectl roll -update),恢复imagePullPolicy,重做kubectl apply(难看!) Pull - push一些公共映像:最新的到您的私有存储库,并执行kubectl滚动更新(重!)

没有好的解决方案按需拉。如果有变化,请评论;我会更新这个答案。