我正在使用Kubernetes的Mount propagation功能来检查某种类型的挂载点的健康状况。我创建一个守护进程并运行一个脚本,在这些挂载点上执行一个简单的ls
。我注意到没有从pod中列出新的挂载点。这是预期的行为。
volumeMounts:
- mountPath: /host
name: host-kubelet
mountPropagation: HostToContainer
volumes:
- name: host-kubelet
hostPath:
path: /var/lib/kubelet
相关问题:hostPath containing mounts do not update as they change on the host #44713
答案 0 :(得分:1)
简而言之,挂载传播允许将Container挂载的卷共享到同一Pod中的其他Container,甚至同一节点上的其他Pod。
卷的传播传播由mountPropagation
中的Container.volumeMounts
字段控制。它的价值是:
HostToContainer
- 单向传播,从主机到容器。如果你
在卷内安装任何东西,容器都会在那里看到它。Bidirectional
- 除了从主机到容器的传播,
Container创建的所有卷安装都将传播回
主机,因此使用相同卷的所有Pod的所有容器都将
也看得出来。基于documentation,群集传播功能处于群集v1.9的alpha状态,并将在v1.10上成为beta版
我已经在kubernetes v1.9.2上复制了您的案例,发现它完全忽略了MountPropagation
配置参数。如果您尝试检查DaemonSet
或Deployment
的当前状态,则会在列出的yaml配置中看到此选项丢失
$ kubectl get daemonset --export -o yaml
如果您尝试仅使用mount传播选项运行docker容器,您可能会看到它按预期工作:
docker run -d -it -v /tmp/mnt:/tmp/mnt:rshared ubuntu
将Docker容器配置与卷装入部分中的kubernetes pod容器进行比较,您可能会发现kubernetes容器中缺少最后一个标志(shared
/ rshared
)。
这就是为什么它发生在Google kubernetes clusters并且可能发生在由其他提供商管理的集群中的原因:
为了确保稳定性和生产质量,正常的Kubernetes发动机 群集仅启用beta或更高版本的功能。 Alpha功能 在普通群集上未启用,因为它们不是 生产就绪或可升级。
由于Kubernetes Engine自动升级Kubernetes控件 飞机,在生产中启用alpha功能可能会危及 如果新的数据发生重大变化,则集群的可靠性 版本
Alpha level features availability:致力于主要的kubernetes回购;出现在正式版中;默认情况下禁用功能,但可以通过标志启用(如果您能够设置标志)
在挂载传播可以在某些部署(CoreOS,RedHat / Centos,Ubuntu)上正常工作之前,必须在Docker中正确配置挂载共享,如下所示。
编辑Docker的systemd
服务文件。设置MountFlags
如下:
MountFlags=shared
或者,如果存在,请移除MountFlags=slave
。然后重启Docker守护程序:
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker