amb*_*air 2 mount daemon volume kubernetes
我正在使用Kubernetes 的挂载传播功能来检查某种类型的挂载点的健康状况。我创建了一个 daemonset 并运行一个脚本,该脚本可以ls在这些挂载点上做一个简单的操作。我注意到新的挂载点没有从 pod 中列出。这是预期的行为吗?
volumeMounts:
- mountPath: /host
name: host-kubelet
mountPropagation: HostToContainer
volumes:
- name: host-kubelet
hostPath:
path: /var/lib/kubelet
Run Code Online (Sandbox Code Playgroud)
简而言之,Mount 传播允许将 Container 挂载的卷共享到同一 Pod 中的其他 Container,甚至是同一节点上的其他 Pod。
卷的安装传播由 中的mountPropagation字段控制Container.volumeMounts。它的值是:
HostToContainer- 从主机到容器的一种传播方式。如果您在卷内挂载任何内容,Container 将在那里看到它。Bidirectional - 除了从主机到容器的传播之外,容器创建的所有卷挂载都将传播回主机,因此使用相同卷的所有 Pod 的所有容器也会看到它。基于文档,Mount 传播功能对于集群 v1.9 处于 alpha 状态,并将在 v1.10 上进行测试
我在 kubernetes v1.9.2 上复制了你的案例,发现它完全忽略了MountPropagation配置参数。如果您尝试检查DaemonSetor 的当前状态Deployment,您将看到列出的 yaml 配置中缺少此选项
$ kubectl get daemonset --export -o yaml
Run Code Online (Sandbox Code Playgroud)
如果您尝试仅使用挂载传播选项运行 docker 容器,您可能会看到它按预期工作:
docker run -d -it -v /tmp/mnt:/tmp/mnt:rshared ubuntu
Run Code Online (Sandbox Code Playgroud)
在卷挂载部分将 docker 容器配置与 kubernetes pod 容器进行比较,您可能会看到最后一个标志(shared/rsharedkubernetes 容器中缺少 )。
这就是为什么它发生在Google kubernetes 集群中并且可能发生在由其他提供商管理的集群中的原因:
为确保稳定性和生产质量,普通 Kubernetes Engine 集群仅启用测试版或更高版本的功能。Alpha 功能未在普通集群上启用,因为它们不可用于生产或升级。
由于 Kubernetes Engine 会自动升级 Kubernetes 控制平面,如果新版本发生重大更改,在生产中启用 alpha 功能可能会危及集群的可靠性。
Alpha 级功能可用性:致力于主要 kubernetes 存储库;出现在正式版本中;默认情况下禁用功能,但可以通过标志启用(如果您能够设置标志)
在挂载传播可以在某些部署(CoreOS、RedHat/Centos、Ubuntu)上正常工作之前,必须在 Docker 中正确配置挂载共享,如下所示。
编辑 Docker 的systemd服务文件。设置MountFlags如下:
MountFlags=shared
Run Code Online (Sandbox Code Playgroud)
或者,删除(MountFlags=slave如果存在)。然后重启 Docker 守护进程:
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5729 次 |
| 最近记录: |