在 kubernetes 中挂载传播
Mount propagation in kubernetes
我正在使用 Kubernetes 的 Mount propagation 功能来检查特定类型挂载点的健康状况。我创建了一个 daemonset 和 运行 一个脚本,该脚本将在这些挂载点上执行简单的 ls
。我注意到 pods 中没有列出新的挂载点。这是预期的行为吗?
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
简而言之,挂载传播 允许将容器挂载的卷共享给同一 Pod 中的其他容器,甚至共享给同一节点上的其他 Pods。
卷的安装传播由 Container.volumeMounts
中的 mountPropagation
字段控制。它的值是:
HostToContainer
- 单向传播,从主机到容器。如果你
在卷内安装任何东西,容器会在那里看到它。
Bidirectional
- 除了从主机传播到容器,
容器创建的所有卷安装都将传播回
主机,因此所有 Pods 使用相同卷的所有 Container 都将
也看到了。
基于 documentation 集群 v1.9 的装载传播功能处于 alpha 状态,并将在 v1.10 上成为 beta
我在 kubernetes v1.9.2 上重现了你的案例,发现它完全忽略了 MountPropagation
配置参数。如果您尝试检查 DaemonSet
或 Deployment
的当前状态,您会发现列出的 yaml 配置中缺少此选项
$ kubectl get daemonset --export -o yaml
如果您尝试 运行 只是 docker 带有挂载传播选项的容器,您可能会看到它按预期工作:
docker run -d -it -v /tmp/mnt:/tmp/mnt:rshared ubuntu
比较 docker 容器配置与卷挂载部分中的 kubernetes pod 容器,您可能会看到 kubernetes 容器中缺少最后一个标志 (shared
/rshared
)。
这就是为什么它会发生在 Google kubernetes clusters 中,并且可能会发生在其他提供商管理的集群中:
To ensure stability and production quality, normal Kubernetes Engine
clusters only enable features that are beta or higher. Alpha features
are not enabled on normal clusters because they are not
production-ready or upgradeable.
Since Kubernetes Engine automatically upgrades the Kubernetes control
plane, enabling alpha features in production could jeopardize the
reliability of the cluster if there are breaking changes in a new
version.
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
我正在使用 Kubernetes 的 Mount propagation 功能来检查特定类型挂载点的健康状况。我创建了一个 daemonset 和 运行 一个脚本,该脚本将在这些挂载点上执行简单的 ls
。我注意到 pods 中没有列出新的挂载点。这是预期的行为吗?
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
简而言之,挂载传播 允许将容器挂载的卷共享给同一 Pod 中的其他容器,甚至共享给同一节点上的其他 Pods。
卷的安装传播由 Container.volumeMounts
中的 mountPropagation
字段控制。它的值是:
HostToContainer
- 单向传播,从主机到容器。如果你 在卷内安装任何东西,容器会在那里看到它。Bidirectional
- 除了从主机传播到容器, 容器创建的所有卷安装都将传播回 主机,因此所有 Pods 使用相同卷的所有 Container 都将 也看到了。
基于 documentation 集群 v1.9 的装载传播功能处于 alpha 状态,并将在 v1.10 上成为 beta
我在 kubernetes v1.9.2 上重现了你的案例,发现它完全忽略了 MountPropagation
配置参数。如果您尝试检查 DaemonSet
或 Deployment
的当前状态,您会发现列出的 yaml 配置中缺少此选项
$ kubectl get daemonset --export -o yaml
如果您尝试 运行 只是 docker 带有挂载传播选项的容器,您可能会看到它按预期工作:
docker run -d -it -v /tmp/mnt:/tmp/mnt:rshared ubuntu
比较 docker 容器配置与卷挂载部分中的 kubernetes pod 容器,您可能会看到 kubernetes 容器中缺少最后一个标志 (shared
/rshared
)。
这就是为什么它会发生在 Google kubernetes clusters 中,并且可能会发生在其他提供商管理的集群中:
To ensure stability and production quality, normal Kubernetes Engine clusters only enable features that are beta or higher. Alpha features are not enabled on normal clusters because they are not production-ready or upgradeable.
Since Kubernetes Engine automatically upgrades the Kubernetes control plane, enabling alpha features in production could jeopardize the reliability of the cluster if there are breaking changes in a new version.
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