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文件格式或者单词不对造成。

k8s Volume(hostpath)持久卷_k8s Volume(hostpath)

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失败。

k8s Volume(hostpath)持久卷_hostpath_02

查看发现node1和node2和master节点连接失败,故障排完看到pod运行正常。

k8s Volume(hostpath)持久卷_hostpath_03 

测试:

登录pod容器,创建文件,查看本地/data目录变化。

登录pod挂载目录内创建文件:

创建完1.txt后退出当前pod。

[root@master volume]# kubectl exec -it test-pd -- /bin/bash

k8s Volume(hostpath)持久卷_k8s_04

切换到pod部署node查看挂载目录内容:

查看node1的/data目录:

[root@node1 ~]# cat /data/1.txt

k8s Volume(hostpath)持久卷_k8s Volume(hostpath)_05