使用Kubernetes 1.7版本,通过 “kubectl apply” 命令重新创建初始化容器

首先

在Kubernetes中有一个名为init container的功能。init container可以定义在pod启动之前运行的容器,在创建pod之前,例如可以将静态文件(如资产)存储在共享卷中,并使用nginx进行分发。然而,在Kubernetes的1.8版本之前,存在一个问题,即在更改配置并重新应用后,init container不会被重新创建。

解决方案 (Solution)

只需提供一种选项,以下是对原文的汉语释义:

在该问题中,可以通过在注释部分中添加 pod.alpha.kubernetes.io/init-containers: null 和 pod.beta.kubernetes.io/init-containers: null 来解决。
参考链接:https://github.com/kubernetes/kubernetes/issues/47264

举个例子的话,会像下面这样的感觉。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        pod.alpha.kubernetes.io/init-containers: null
        pod.beta.kubernetes.io/init-containers: null
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
        volumeMounts:
        - name: workdir
          mountPath: /usr/share/nginx/html
      # These containers are run during pod initialization
      initContainers:
      - name: install
        image: busybox
        command:
        - wget
        - "-O"
        - "/work-dir/index.html"
        - http://kubernetes.io
        volumeMounts:
        - name: workdir
          mountPath: "/work-dir"
      dnsPolicy: Default
      volumes:
      - name: workdir
        emptyDir: {}

顺便说一句,如果处于这个状态,执行”kubectl apply”命令时会触发验证错误,可以通过添加”–validate=false”选项来避免。根据貌似kubernetes1.8已经解决了这个问题,所以如果使用最新的集群,则不需要上述的解决方案。