kubernetes:从init容器中安装卷

时间:2017-05-22 09:25:08

标签: 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"
        }]
    }
]'

但它似乎不起作用。添加volumeMounts会导致容器init-myserver进入CrashLoop。如果没有它,pod会成功创建,但它无法达到我想要的效果。

在< 1.5中是否无法在init容器中安装卷? 怎么样1.6 +?

1 个答案:

答案 0 :(得分:3)

您不需要执行hostPath卷来共享init-container生成的数据与Pod的容器。您可以使用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

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

HTH。