持续集成部署-k8s-配置与存储-配置管理:HostPath 的使用
- [1. 简介](#1. 简介)
- [2. 创建一个 Pod 使用 HostPath 的方式挂载目录](#2. 创建一个 Pod 使用 HostPath 的方式挂载目录)
1. 简介
在 Kubernetes 中,HostPath
是一种用于挂载宿主机上文件或目录到容器中的卷类型。使用 HostPath
卷类型,可以让你在容器内部访问宿主机上的文件或目录。
具体来说,当你在 Pod
中定义了 HostPath
卷类型时,Kubernetes
将会在宿主机上创建指定的目录,并将其挂载到容器中。这个目录的位置是由你自己指定的,通常是在宿主机上一个已经存在的目录或文件。在容器内部,你可以像访问普通的文件系统一样访问这个挂载的目录或文件。
将节点上的文件或目录挂载到 Pod 上,此时该目录会变成持久化存储目录,即使 Pod 被删除后重启,也可以重新加载到该目录,该目录下的文件不会丢失。
2. 创建一个 Pod 使用 HostPath 的方式挂载目录
新建文件:volume-test-pd.yaml
yaml
apiVersion: v1
kind: Pod
metadata:
name: test-volume-pd
spec:
containers:
- image: nginx
name: nginx-volume
volumeMounts:
- mountPath: /test-pd # 挂载到容器的哪个目录
name: test-volume # 挂载哪个 volume
volumes:
- name: test-volume
hostPath: # 与主机共享目录,加载主机中的指定目录到容器中
path: /data # 节点中的目录
type: DirectoryOrCreate # 检查类型,在挂载前对挂载目录做什么检查操作,有多种选项,默认为空字符串,不做任何检查
这里新建了一个 Nginx 的 Pod 和 一个名为 test-volume
的 Volume,并且配置的是 hostPath
,这里对应的path
是宿主机上的目录。
其中 type
的类型支持以下几种:
- 空字符串:默认类型,不做任何检查
- DirectoryOrCreate:如果给定的 path 不存在,就创建一个 755 的空目录
- Directory:这个目录必须存在
- FileOrCreate:如果给定的文件不存在,则创建一个空文件,权限为 644
- File:这个文件必须存在
- Socket:UNIX 套接字,必须存在
- CharDevice:字符设备,必须存在
- BlockDevice:块设备,必须存在
当 type 的校验未满足时,创建 Pod 时会报错。
接着创建 Pod :kubectl create -f volume-test-pd.yaml
sh
[root@docker-54 volumes]# kubectl get po
NAME READY STATUS RESTARTS AGE
dns-test 1/1 Running 1 (41d ago) 41d
fluentd-p2znm 1/1 Running 0 39d
fluentd-qx22q 1/1 Running 0 39d
nginx-deploy-bcc5c945c-988wb 1/1 Running 44 (4m9s ago) 44h
nginx-deploy-bcc5c945c-ptqc6 1/1 Running 148 (4m39s ago) 6d4h
private-image-pull-pod 0/1 Completed 0 5d21h
test-configfile-po 0/1 Completed 0 20d
test-volume-pd 0/1 ContainerCreating 0 7s
[root@docker-54 volumes]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
dns-test 1/1 Running 1 (41d ago) 41d 10.244.1.35 docker-55 <none> <none>
fluentd-p2znm 1/1 Running 0 39d 10.244.1.44 docker-55 <none> <none>
fluentd-qx22q 1/1 Running 0 39d 10.244.2.62 docker-56 <none> <none>
nginx-deploy-bcc5c945c-988wb 1/1 Running 44 (4m53s ago) 44h 10.244.1.60 docker-55 <none> <none>
nginx-deploy-bcc5c945c-ptqc6 1/1 Running 148 (5m23s ago) 6d4h 10.244.2.96 docker-56 <none> <none>
private-image-pull-pod 0/1 Completed 0 5d21h 10.244.2.98 docker-56 <none> <none>
test-configfile-po 0/1 Completed 0 20d 10.244.2.71 docker-56 <none> <none>
test-volume-pd 1/1 Running 0 51s 10.244.2.113 docker-56 <none> <none>
[root@docker-54 volumes]#
[root@docker-54 volumes]#
可以看到,这个 test-volume-pd
是运行在 我的 docker-56
节点上的。
连接到 docker-56
节点,来到 /data
目录下,新建一个文件:index.html
接着进入 Pod 容器里面看下这个文件是否存在:
sh
[root@docker-54 volumes]# kubectl exec -it test-volume-pd -- sh
# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys test-pd tmp usr var
# cd /data
sh: 2: cd: can't cd to /data
# cd /test-pd
# ls
index.html
#
可以看到,我们进入容器后,直接到 /data
目录下,发现目录是不存在的,是因为这个目录是宿主机的目录,而映射到我们的容器内部的路径是 /test-pd
,这个 index.html
文件确实存在。
接着我们在容器内,给这个 index.html
添加点儿 内容:
sh
# echo 'Hello Volume, HostPath....' > index.html
# ls
index.html
# cat index.html
Hello Volume
然后回到宿主机docker-56
节点上,看下这个文件:
sh
[root@docker-56 data]# touch index.html
[root@docker-56 data]#
[root@docker-56 data]# cat index.html
Hello Volume, HostPath....
[root@docker-56 data]#
可以看到,宿主机上确实存在该文件最新的内容了。
接着我们在宿主机上修改这个index.html
文件内容,然后再回到容器内部看下,发现宿主机上修改后,容器内也是可以马上看到的。
有了这个功能之后,我们可以将宿主机上的文件跟我们的容器内部实现了共享。