在docker container和k8s pod中挂载主机上的硬盘(排坑指南)

有一些业务需求要求我们在k8s pod或者docker container中用程序挂载本机的硬盘执行mount操作,下面我们以k8s pod为例,讲解一下在实现过程中遇到的各种坑。

至于docker container的实现方法和k8s原理一致,查一下相关参数就好

containers:
        - name: xxx
          terminationMessagePath: "/tmp/termination-log"  # 重要
          securityContext:
            privileged: true  # 重要
          image: xxx-image
          imagePullPolicy: Always
          command: ["/bin/sh"]
          args:
            [
              "-c",
              "sleep inf",
            ]
          volumeMounts:
            - name: mount-volume
              mountPath: /disks_mount_point
              mountPropagation: Bidirectional  # 重要
      volumes:
        - name: mount-volume
          hostPath:
            path: /disks_mount_point
            type: Directory

1. 没有权限mount

首先我们在docker image中已经指定了user=root,但是我们在pod里面尝试进行mount操作的时候,可以看到disk read-only,所以我们需要设置pod的权限:

参考:https://kubernetes.io/docs/concepts/policy/pod-security-policy/

securityContext:
	privileged: true

2. 在k8s pod中挂载的硬盘,在宿主机上看不到

经过上面的设置,我们可以成功的在pod中挂载硬盘,但是在宿主机执行lsblk,可以看到硬盘并没有被挂载

如果我们的业务场景是,需要在其他pod中进行硬盘上的数据处理,那么就行不通。

volumeMounts:
    - name: mount-volume
    mountPath: /disks_mount_point
    mountPropagation: Bidirectional

所以我们需要设置mountPropagation,这个设置等同于docker中的rshared,这样设置后,在pod中mount,我们也可以在宿主机上看到mount的硬盘了

参考:https://kuboard.cn/learning/k8s-intermediate/persistent/volume-mount-point.html#%E6%8C%82%E8%BD%BD%E4%BC%A0%E6%92%AD


3. mount /dev 目录失败

如果尝试mount /dev目录到k8s pod的话,我们可能得到报错:

Error: failed to start container "xxx": Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: process_linux.go:545: container init caused: rootfs_linux.go:76: mounting "/var/lib/kubelet/pods/c337b284-1aea-472e-9b10-4afecd3e56e0/containers/xxx/e983d0ba" to rootfs at "/dev/termination-log" caused: mount through procfd: possibly malicious path detected -- refusing to operate on /var/lib/docker/overlay2/d72bbf76d11b215231e7c2776a18239797c5281b21223f5746397f5bc5ed7c7b/merged/dev/termination-log (deleted): unknown

可以看到与/dev/termination-log 目录有关,所以我们需要设置:

terminationMessagePath: "/tmp/termination-log"

参考:https://kubernetes.io/zh/docs/tasks/debug-application-cluster/determine-reason-pod-failure/

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 在Kubernetes,可以通过在Pod定义使用volumeMounts字段来挂载硬盘。在引用\[1\]的示例,volumeMounts字段用于指定要挂载的卷的名称、挂载路径和挂载传播方式。在这种情况下,如果需要在其他Pod进行硬盘上的数据处理,是行不通的。因为挂载的卷是特定于Pod的,其他Pod无法直接访问该卷的数据。\[1\] 关于挂载/dev目录失败的问题,引用\[2\]提供了一个参考链接,其介绍了挂载传播的相关内容。在某些情况下,可能会遇到无法挂载/dev目录的问题。这可能是由于安全策略的限制导致的。例如,在引用\[3\]提到的Pod安全策略,如果没有设置privileged为true,那么Pod将无法挂载/dev目录。因此,需要确保Pod的安全策略允许挂载/dev目录。 另外,需要注意的是,在Kubernetes挂载硬盘在宿主机上是看不到的。这是因为Kubernetes使用容器化技术,每个Pod都运行在自己的容器,与宿主机隔离。因此,挂载硬盘只能在Pod内部访问,无法直接在宿主机上查看。\[2\] #### 引用[.reference_title] - *1* *2* *3* [在docker containerk8s pod挂载主机上的硬盘排坑指南)](https://blog.csdn.net/qq_43355223/article/details/122169460)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值