部署未检测到 init-container 中容器映像标签的更改

Deployment not detecting change of container image tag in init-container

自从 init-container 可用以来我一直在使用它,并且发现它们非常有用。我的核心镜像(下面是 web-dev)变化不大,但是我的 init-container 镜像(下面是 web-data-dev)确实经常变化。

init-container 使用带有版本号的容器镜像。我将此版本号更改为最新值,然后执行 kubectl apply -f deployment.yaml

比如我把eu.gcr.io/project/web-data-dev:187改成了eu.gcr.io/project/web-data-dev :188 在 运行 应用 kubectl 之前。

然而,当我这样做时,没有部署发生,如果我对 init-container 使用的图像进行任何更改,部署仍然不会发生。我认为这是因为未检测到 init-container 更改。

然后我尝试在图像字段中放置一些垃圾,如下所示:"image":"thisIsNotAnImage" 和 运行 kubectl apply -f 再次,但仍未应用更新。

我的问题是 - 如何让 kubectl apply -f 检测 init-container 中的图像标签更改?我是不是做错了什么,这是一个错误,还是因为初始化容器是 Alpha 版而尚未实现?

下面是完整的部署 YAML。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: web-deployment
spec:
  replicas: 1
  strategy:
    rollingUpdate:
      maxUnavailable: 0
  template:
    metadata:
      labels:
        app: web
        tier: frontend
      annotations:
        pod.alpha.kubernetes.io/init-containers: '[
            {
                "name": "initialiser1",
                "image": "eu.gcr.io/project/web-data-dev:187",
                "command": ["cp", "-r", "/data-in/", "/opt/"],
                "volumeMounts": [
                    {
                        "name": "file-share",
                        "mountPath": "/opt/"
                    }
                ]
            }
        ]'
    spec:
      containers:

        - image: eu.gcr.io/project/web-dev:20
          name: web
          resources:
            requests:
              cpu: 10m
              memory: 40Mi
          ports:
            - containerPort: 80
              name: http
            - containerPort: 443
              name: https
          volumeMounts:
            - name: file-share
              mountPath: /opt/

      volumes:
        - name: file-share
          emptyDir: {}

如果您使用的是 Kubernetes 1.4,请尝试将 pod.alpha.kubernetes.io/init-containers 更改为 pod.beta.kubernetes.io/init-containers

我在 GitHub 上找不到合适的问题,但这两个注释的行为是不同的。我可以对第二个执行 kubectl apply -f,部署将被更新。

您可以使用以下示例对其进行测试:

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: nginx
spec:
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        pod.beta.kubernetes.io/init-containers: '[
            {
                "name": "install",
                "image": "busybox",
                "command": ["/bin/sh", "-c", "echo foo > /work-dir/index.html"],
                "volumeMounts": [
                  {
                    "name": "workdir",
                    "mountPath": "/work-dir"
                    }
                ]
            }
        ]'
    spec:
      volumes:
        - name: workdir
          emptyDir: {}
      containers:
        - name: nginx
          image: nginx
          ports:
            - containerPort: 80
          volumeMounts:
            - name: workdir
              mountPath: /usr/share/nginx/html

尝试把foo改成bar看看结果:

$ cat nginx.yaml | kubectl apply -f -
deployment "nginx" created
$ curl $(minikube service nginx --url)
Waiting, endpoint for service is not ready yet...
foo
$ cat nginx.yaml | sed -e 's/foo/bar/g' | kubectl apply -f -
deployment "nginx" configured
$ curl $(minikube service nginx --url)
Waiting, endpoint for service is not ready yet...
bar

同样的事情使用 pod.alpha.kubernetes.io/init-containers:

$ curl $(minikube service nginx --url)
Waiting, endpoint for service is not ready yet...
foo
$ cat nginx.yaml | sed -e 's/foo/bar/g' | kubectl apply -f -
deployment "nginx" configured
$ curl $(minikube service nginx --url)
foo