kubernetes:从初始化容器内安装卷

lan*_*ng2 4 kubernetes

我正在尝试使用 init 容器在主容器启动之前准备一些文件。在 init 容器中,我想挂载一个hostPath卷,以便我可以共享为主容器准备一些文件。

我的集群使用 1.6 版之前的 kubernetes,所以我使用的meta.annotation语法是:

pod.beta.kubernetes.io/init-containers: '[
    {
        "name": "init-myservice",
        "image": "busybox",
        "command": ["sh", "-c", "mkdir /tmp/jack/ && touch cd /tmp/jack && touch a b c"],
        "volumeMounts": [{
          "mountPath": "/tmp/jack",
          "name": "confdir"
        }]
    }
]'
Run Code Online (Sandbox Code Playgroud)

但它似乎不起作用。添加volumeMounts导致容器init-myserver进入 CrashLoop。没有它,pod 会成功创建,但它没有实现我想要的。

在 <1.5 中不可能在 init 容器中安装卷吗?1.6+呢?

sur*_*ajd 5

你不需要做hostPathvolume来与Pod的容器共享init-container生成的数据。您可以使用emptyDir来实现相同的结果。使用的好处emptyDir是您不需要在主机上做任何事情,即使您无权访问该集群上的节点,这也适用于任何类型的集群。

使用的另一组问题hostPath是在主机上的该文件夹上设置适当的权限,如果您使用任何启用 SELinux 的发行版,则必须在该目录上设置正确的上下文。

apiVersion: v1
kind: Pod
metadata:
  name: init
  labels:
    app: init
  annotations:
    pod.beta.kubernetes.io/init-containers: '[
        {
            "name": "download",
            "image": "axeclbr/git",
            "command": [
                "git",
                "clone",
                "https://github.com/mdn/beginner-html-site-scripted",
                "/var/lib/data"
            ],
            "volumeMounts": [
                {
                    "mountPath": "/var/lib/data",
                    "name": "git"
                }
            ]
        }
    ]'
spec:
  containers:
  - name: run
    image: docker.io/centos/httpd
    ports:
      - containerPort: 80
    volumeMounts:
    - mountPath: /var/www/html
      name: git
  volumes:
  - emptyDir: {}
    name: git
Run Code Online (Sandbox Code Playgroud)

查看上面的示例,其中 init-container 和 pod 中的容器共享同一个名为git. 卷的类型是emptyDir。我只希望 init-container 在每次这个 pod 出现时提取数据,然后从httpdpod的容器中提供数据。

哈。