我如何迫使库伯内斯重新拉出一幅图像?

kb5ga3dv  于 2022-09-20  发布在  Kubernetes
关注(0)|答案(7)|浏览(126)

我在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

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

z0qdvdin

z0qdvdin1#

如果出现以下任一情况,Kubernetes将启动Pod创建(请参阅更新图像文档):

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

这是很棒的,如果你想一直拉。但如果您想按需执行此操作:例如,如果您想使用some-public-image:latest,但只想在请求时手动拉出较新的版本。您目前可以:

  • imagePullPolicy设置为IfNotPresentNever,并Pre-Pull:在每个集群节点上手动拉取镜像,以便缓存最新的镜像,然后执行kubectl rolling-update或类似的操作来重新启动Pods(丑陋、容易损坏的黑客!)
    **临时*更改imagePullPolicy、执行kubectl apply、重新启动Pod(例如kubectl rolling-update)、恢复imagePullPolicy、重做kubectl apply(丑陋!)
    *拉入并推送some-public-image:latest到您的专用存储库,然后执行kubectl rolling-update(Heavy!)

对于按需拉入,没有好的解决方案。如果这一点发生变化,请发表评论;我会更新这个答案。

hxzsmxv2

hxzsmxv22#

必须将imagePullPolicy分组到容器数据中,而不是规范数据中。然而,我对此提交了一份issue,因为我觉得这很奇怪。此外,没有错误消息。

因此,此规范代码片段可以工作:

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

iovurdzv3#

有一个命令可以直接做到这一点:

创建执行滚动重新启动展开的新kubectl rollout restart命令。

已合并pull request。它是版本1.15(changelog)或更高版本的一部分。

igetnqfo

igetnqfo4#

我在开发期间的诀窍是更改我的部署清单,以添加最新的标记,并总是这样拉

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

然后我手动删除Pod

kubectl delete pod my-app-3498980157-2zxhd

因为是部署,Kubernetes会自动重新创建Pod并拉取最新的镜像。

tmb3ates

tmb3ates5#

一种流行的解决方法是使用虚拟注解(或标签)修补展开:

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

假设您的部署满足这些要求,这将导致K8拉出任何新的镜像并重新部署。

ttisahbt

ttisahbt6#

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

z4bn682m

z4bn682m7#

1.将策略指定为:

strategy: 
    type: Recreate
    rollingUpdate: null

1.确保每个部署都有不同的注解。Helm是这样做的:

template:
    metadata:
      labels:
        app.kubernetes.io/name: AppName
        app.kubernetes.io/instance: ReleaseName
      annotations:
        rollme: {{ randAlphaNum 5 | quote }}

1.指定镜像拉取策略-始终

containers:
        - name: {{ .Chart.Name }}
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: Always

相关问题