k8s Hostpath属性说明:
HostPath卷将主机节点的文件系统中的文件或目录挂载到集群中
Hostpath的用途如下:
运行需要访问docker内部的容器:使用/var/lib/docker的hostpath
在容器中运行cAdvisor;使用/dev/cgroups的hostPath
允许pod指定给定的hostPath是否应该在Pod运行之前存在,是否应该创建,以及它应该以什么形式存在
除了所需的path属性之外,用户还可以为hostPath卷指定type
值 |
|
| 空字符串(默认)用于向后兼容,这意味着挂载hostPath卷之前不会执行任何检查。 |
DirectoryOrCreate | 如果在给定的路径上没有任何东西存在,那么将根据需要再哪里创建一个空目录,权限设置为0755,与kubelet具有相同的组合所有权。 |
Directory | 给定的路径下必须存在目录 |
FileOrCreate | 如果在给定的路径上没有任何东西存在,那么会根据需要创建一个空文件,权限设置为0644,与kubelet具有相同的组和所有权。 |
File | 给定的路径下必须存在文件 |
Socket | 给定的路径下必须存在UNIX套接字 |
CharDevice | 给定的路径下必须存在字符设备 |
BlockDevice | 给定的路径下必须存在块设备 |
使用这种卷类型需要注意:
1由于每个节点上的文件都不同,具有相同配置(例如从podTemplate创建)的pod在不同节点上的行为可能会有所不同
2 当kubernetes按照计划添加资源感知调度时,无法考虑hostPath使用的资源
3 在底层主机上创建的文件或目录只能由root写入。您需要再特权容器中以root身份运行进程,或修改主机上的文件权限以便写入hostPath卷。
所以所有node节点都需要创建挂载目录,因为多个副本pod的部署是随机的。
运行测试yaml报错处理:
[root@master volume]# kubectl apply -f test.yaml
error: error validating "test.yaml": error validating data: kind not set; if you choose to ignore these errors, turn validation off with --validate=false
报错原因:Yaml文件格式或者单词不对造成。
Yaml文件如下:
[root@master volume]# cat test.yaml
apiVersion: v1
kind: Pod
metadata:
name: test-pd
spec:
containers:
- image: nginx
name: nginx-example
volumeMounts:
- mountPath: /test-nginx
name: test-volume
volumes:
- name: test-volume
hostPath:
path: /data
type: Directory
Pod运行报错处理:
报错信息:
Warning FailedScheduling <unknown> default-scheduler 0/3 nodes are available: 3 node(s) had taints that the pod didn't tolerate.
Warning FailedScheduling <unknown> default-scheduler 0/3 nodes are available: 3 node(s) had taints that the pod didn't tolerate.
Pod没有节点可以部署,scheduler调度器没办法调度,查看发现node失败。
查看发现node1和node2和master节点连接失败,故障排完看到pod运行正常。
测试:
登录pod容器,创建文件,查看本地/data目录变化。
登录pod挂载目录内创建文件:
创建完1.txt后退出当前pod。
[root@master volume]# kubectl exec -it test-pd -- /bin/bash
切换到pod部署node查看挂载目录内容:
查看node1的/data目录:
[root@node1 ~]# cat /data/1.txt