如何强制Kubernetes重新拉出图像?

问题描述 投票:86回答:7

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

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

执行滚动更新,但没有重新拉动。为什么?

image pull kubernetes
7个回答
74
投票

如果有的话,Kubernetes将会创建Pod(参见updating-images doc):

  • 使用标记为:latest的图像
  • imagePullPolicy: Always被指定

如果你想总是拉,这很好。但是如果你想按需要这样做会怎么样:例如,如果你想使用some-public-image:latest但只想在你要求的时候手动拉一个更新的版本。你现在可以:

  • imagePullPolicy设置为IfNotPresentNeverpre-pull:在每个群集节点上手动拉动图像,以便最新缓存,然后执行kubectl rolling-update或类似重启Pods(丑陋容易破解黑客!)
  • 暂时改变imagePullPolicy,做一个kubectl apply,重新启动pod(例如kubectl rolling-update),恢复imagePullPolicy,重做kubectl apply(丑陋!)
  • some-public-image:latest并将其推送到您的私人存储库并执行kubectl rolling-update(重!)

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


39
投票

必须将imagePullPolicy分组到容器数据中而不是在规范数据中。但是,我提交了一个issue,因为我发现它很奇怪。此外,没有错误信息。

所以,这个规范片段有效:

spec:
  containers:
  - name: myapp
    image: myregistry.com/myapp:5c3dda6b
    ports:
    - containerPort: 80
    imagePullPolicy: Always
  imagePullSecrets:
    - name: myregistry.com-registry-key

15
投票

我在开发过程中的黑客攻击是更改我的部署清单以添加最新标记,并始终如此拉动

image: etoews/my-image:latest
imagePullPolicy: Always

然后我手动删除pod

kubectl delete pod my-app-3498980157-2zxhd

因为它是一个部署,Kubernetes将自动重新创建pod并提取最新图像。


7
投票

popular workaround是使用虚拟注释(或标签)修补部署:

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

假设您的部署meets these requirements,这将导致K8s提取任何新图像并重新部署。


6
投票

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

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


4
投票

滚动更新命令,当给定图像参数时,assumes that the image is different比复制控制器中当前存在的参数。


1
投票

将有一个新命令直接执行此操作:

创建一个新的kubectl rollout restart命令,用于执行部署的滚动重新启动。

pull request合并了。它将是版本1.15changelog)的一部分

© www.soinside.com 2019 - 2024. All rights reserved.