我有以下复制控制器在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

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


当前回答

要么你已经手动删除了所有的豆荚,以再次拉出图像来重新创建。

or

运行下面的命令 Kubectl rollout重启deploy /deployment_name Kubectl rollout重启部署/nginx

这个命令应该重新创建所有的pod。

对于这两种情况,imagepullPolicy应该设置为Always。

其他回答

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

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

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滚动更新(重!)

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

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

一个流行的解决方法是用一个虚拟注释(或标签)修补部署:

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

假设您的部署满足这些要求,这将导致k8提取任何新映像并重新部署。

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