持续集成部署-k8s-配置与存储-配置管理:HostPath 的使用

持续集成部署-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 文件内容,然后再回到容器内部看下,发现宿主机上修改后,容器内也是可以马上看到的。

有了这个功能之后,我们可以将宿主机上的文件跟我们的容器内部实现了共享。

相关推荐
yBmZlQzJ17 小时前
财运到内网穿透域名解析技术机制与中立评估
运维·经验分享·docker·容器·1024程序员节
sim202018 小时前
把某个pod固定到某个节点
kubernetes
yBmZlQzJ19 小时前
内网穿透工具通过端口转发实现内外网通信
运维·经验分享·docker·容器·1024程序员节
DeepHacking19 小时前
Overleaf 本地Docker部署
运维·docker·容器
孤岛悬城20 小时前
46 Docker资源管理
docker·容器·云计算
学Linux的语莫1 天前
kompose、docker转k8s
docker·容器·kubernetes
光头熊1 天前
一次 nerdctl prune -a 导致 Kubernetes 节点不可用的复盘
kubernetes
一点晖光1 天前
docker配置npm环境变量出现问题
docker·容器·npm
一分半心动1 天前
windows docker desktop 安装VibeVoice
运维·docker·容器
LucidX1 天前
Docker核心操作实战
运维·docker·容器