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

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


当前回答

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

其他回答

Image pull策略将总是在每次创建新pod时帮助拉出图像(这可以在任何情况下,如缩放副本,或pod死亡,并创建新pod)

但是如果你想要更新当前运行的pod的映像,部署是最好的方法。它让你完美无缺的更新没有任何问题(主要是当你有一个持久的卷附加到豆荚):)

指定策略为:

  strategy: 
    type: Recreate
    rollingUpdate: null

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

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

指定图像提取策略- Always

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

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

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

# 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('+','_') , "\""}}}}}"))

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

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