Kubernetes创建Pod时hostPath挂载目录内子目录未生效问题
排查步骤
- 确认Pod调度节点
hostPath挂载的是Pod调度到的工作节点上的目录,而非kubectl执行节点的目录,执行以下命令获取Pod所在节点:kubectl get pod ts-engine -o wide
拿到输出中NODE列对应的节点名称,登录该节点验证/workspace目录下是否存在预期的子目录。若Pod处于Pending状态,可查看事件确认是否是目标节点不存在/workspace目录,可将hostPath的type修改为DirectoryOrCreate让K8s自动创建不存在的目录。 - 检查目录权限
宿主机/workspace目录的权限需要与容器运行用户的权限匹配,执行以下命令查看目录权限:ls -ld /workspace && ls -l /workspace
可临时授予目录全局可读可写权限验证:chmod 777 -R /workspace
若测试后挂载正常,按需调整目录所属用户/组和权限即可,无需保留777权限。 - 验证目录是否为软链接
hostPath默认不跟随软链接,若宿主机/workspace是软链接,会直接挂载软链接本身而非指向的目标路径,执行以下命令验证:ls -l / | grep workspace
若为软链接,将hostPath的path替换为软链接指向的实际路径即可。 - 排查SELinux限制
若集群节点为CentOS/RHEL系列系统,默认开启的SELinux会阻止容器访问宿主机目录,可临时关闭SELinux验证:setenforce 0
若验证后挂载正常,可通过以下命令给目录打容器访问标签解决:chcon -R -t container_file_t /workspace
生产环境不建议直接关闭SELinux。 - 确认集群部署类型
若使用kind/k3d/minikube等容器化部署的K8s集群,集群的工作节点本身是运行在物理机上的容器,物理机的本地目录默认不会同步到集群节点容器内,此时挂载的是集群节点容器内的/workspace而非物理机的目录,需要在创建集群时配置物理机目录到集群节点的挂载规则。
临时验证方案
可创建测试Pod直接进入容器查看挂载目录,排除command命令的异常:
apiVersion: v1 kind: Pod metadata: name: test-hostpath spec: nodeName: <替换为你确认存在/workspace目录的节点名> containers: - image: busybox:latest name: test command: ["/bin/sh", "-c", "sleep 3600"] volumeMounts: - mountPath: /workspace name: workspace volumes: - name: workspace hostPath: path: /workspace type: Directory
创建后执行kubectl exec -it test-hostpath -- ls /workspace直接查看挂载结果。
内容的提问来源于stack exchange,提问作者GiwoongLee
相关产品推荐
相关产品推荐

