部署未检测到 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
自从 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