我正在尝试使用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 +?
答案 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。