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

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


当前回答

我已经使用kubectl rollout restart我的springboot api和它的工作。

kubectl rollout restart -f pod-staging.yml --namespace test

部署的Yaml:

apiVersion: "apps/v1"
kind: "Deployment"
metadata:
    name: "my-api"
    labels:
      app: "my-api"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "my-api"
  template:
    metadata:
      labels:
        app: "my-api"
    spec:
      containers:
        - name: my-api
          image: harbor.url.com/mycompany/my-api:staging
          ports:
            - containerPort: 8099
              protocol: TCP
          imagePullPolicy: Always
          livenessProbe:
            httpGet:
              path: /actuator/health/liveness
              port: 8099
            initialDelaySeconds: 90
            periodSeconds: 10
          readinessProbe:
            httpGet:
              path: /actuator/health/readiness
              port: 8099
            initialDelaySeconds: 90
            periodSeconds: 5
          envFrom:
            - configMapRef:
                name: "my-api-configmap"
          env:
            - name: "TOKEN_VALUE"
              valueFrom:
                secretKeyRef:
                  name: "my-api-secret"
                  key: "TOKEN_VALUE"
          resources:
            requests:
              memory: "512Mi"
              cpu: "500m"
            limits:
              memory: "2048Mi"
              cpu: "1000m"
      imagePullSecrets:
        - name: "my-ci-user"

其他回答

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

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

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

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

我在开发期间的黑客是改变我的部署清单,以添加最新的标签,总是这样拉

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

然后我手动删除pod

kubectl delete pod my-app-3498980157-2zxhd

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

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

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

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

看了所有其他的答案,我还不满意,我在这里找到了更好的解决方案: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卡住了。