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

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


当前回答

看了所有其他的答案,我还不满意,我在这里找到了更好的解决方案:https://cloud.google.com/kubernetes-engine/docs/how-to/updating-apps

它不使用latest标签或imagePullPolicy: Always。如果您通过指定image sha256文摘将新图像推到相同的标记,它也可以工作。

步骤:

从docker hub获取SHA256图像(见下图) Kubectl set image deploy /<your-deployment> <your_container_name>=<some/image>@sha256:<your sha> Kubectl规模部署<your-deployment>——replicas=0 Kubectl规模部署<your-deployment>——replicas=原始副本计数

注意:Rollout也可以代替scale工作,但在我的情况下,我们没有足够的硬件资源来创建另一个实例,k8s卡住了。

其他回答

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

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

or

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

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

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

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

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

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

指定策略为:

  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

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

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

pull请求被合并了。它是1.15(更新日志)或更高版本的一部分。