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

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

相关推荐
景天科技苑3 小时前
【云原生开发】K8S多集群资源管理平台架构设计
云原生·容器·kubernetes·k8s·云原生开发·k8s管理系统
wclass-zhengge3 小时前
K8S篇(基本介绍)
云原生·容器·kubernetes
颜淡慕潇3 小时前
【K8S问题系列 |1 】Kubernetes 中 NodePort 类型的 Service 无法访问【已解决】
后端·云原生·容器·kubernetes·问题解决
川石课堂软件测试5 小时前
性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台
运维·javascript·深度学习·jmeter·docker·容器·grafana
昌sit!11 小时前
K8S node节点没有相应的pod镜像运行故障处理办法
云原生·容器·kubernetes
A ?Charis14 小时前
Gitlab-runner running on Kubernetes - hostAliases
容器·kubernetes·gitlab
wclass-zhengge15 小时前
Docker篇(Docker Compose)
运维·docker·容器
北漂IT民工_程序员_ZG15 小时前
k8s集群安装(minikube)
云原生·容器·kubernetes
IT-民工2111017 小时前
CI/CD 实践总结
运维·ci/cd·自动化
梦魇梦狸º18 小时前
腾讯轻量云服务器docker拉取不到镜像的问题:拉取超时
docker·容器·github