HostPath存储卷能将主机节点文件系统上的文件或目录挂载直接挂载到业务Pod 中。由于该方式存在诸多安全风险,且不适用于高可用场景,一般业务应用不推荐使用。
背景信息
云容器引擎服务兼容kubernetes原生HostPath本地挂载方案,关于HostPath特定场景使用用法及注意点参见:Kubernetes官方
使用限制
- HostPath 存储卷可能会暴露特权系统凭据(例如 Kubelet)或特权 API(例如容器运行时套接字),可用于容器逃逸或攻击集群的其他服务;
- 具有相同配置(例如基于同一 PodTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为;
- 主机节点上特定文件或目录只能由 root 用户写入。如需访问这些文件,需要在特权容器中以 root 身份运行进程,或者修改主机上的文件权限以便容器能够写入 hostPath 卷。
挂载模式
HostPath支持以下几种挂载模式:
类型 | 描述 |
---|---|
空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。 | |
DirectoryOrCreate | 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 kubelet 相同的组和属主信息。 |
Directory | 在给定路径上必须存在的目录。 |
FileOrCreate | 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 kubelet 相同的组和所有权。 |
File | 在给定路径上必须存在文件。 |
使用示例
pod中直接使用HostPath
- 使用kubectl连接集群,创建示例yaml文件hostpath-pod-example.yaml:
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: registry.k8s.io/test-webserver
name: test-container
volumeMounts:
- mountPath: /test-pd
name: test-volume
volumes:
- name: test-volume
hostPath:
# 主机节点上目录位置
path: /data
# 此字段为可选
type: Directory
执行以下命令,创建Pod
kubectl apply -f hostpath-pod-example.yaml
- 查看创建的Pod:
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“工作负载”——“容器组”,在列表查看。
PV和PVC方式定义HostPath
- 使用kubectl连接集群,创建示例yaml文件hostpath-pv-example.yaml:
apiVersion: v1
kind: PersistentVolume
metadata:
name: hostpath-pv
labels:
type: local
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/data"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: hostpath-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
volumeName: "hostpath-pv"
- 执行以下命令,创建PV、PVC
kubectl apply -f hostpath-pv-example.yaml
- 查看创建的PV、PVC:
登录“云容器引擎”管理控制台;
在集群列表页点击进入指定集群;
进入主菜单“存储”,在持久卷和持久卷声明列表查看。