k8s hostPath

hostPath

hostPath 卷能将主机节点文件系统上的文件或目录挂载到您的 Pod 中。 虽然这不是大多数 Pod 需要的,但是它为一些应用程序提供了强大的逃生舱。

例如,hostPath 的一些用法有:

  • 运行一个需要访问 Docker 引擎内部机制的容器;请使用 hostPath 挂载 /var/lib/docker 路径。
  • 在容器中运行 cAdvisor 时,以 hostPath 方式挂载 /sys
  • 允许 Pod 指定给定的 hostPath 在运行 Pod 之前是否应该存在,是否应该创建以及应该以什么方式存在。

除了必需的 path 属性之外,用户可以选择性地为 hostPath 卷指定 type

支持的 type 值如下:

取值 行为
  空字符串(默认)用于向后兼容,这意味着在安装 hostPath 卷之前不会执行任何检查。
DirectoryOrCreate 如果在给定路径上什么都不存在,那么将根据需要创建空目录,权限设置为 0755,具有与 Kubelet 相同的组和所有权。
Directory 在给定路径上必须存在的目录。
FileOrCreate 如果在给定路径上什么都不存在,那么将在那里根据需要创建空文件,权限设置为 0644,具有与 Kubelet 相同的组和所有权。
File 在给定路径上必须存在的文件。
Socket 在给定路径上必须存在的 UNIX 套接字。
CharDevice 在给定路径上必须存在的字符设备。
BlockDevice 在给定路径上必须存在的块设备。

当使用这种类型的卷时要小心,因为:

  • 具有相同配置(例如从 podTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为。
  • 当 Kubernetes 按照计划添加资源感知的调度时,这类调度机制将无法考虑由 hostPath 使用的资源。
  • 基础主机上创建的文件或目录只能由 root 用户写入。您需要在 特权容器 中以 root 身份运行进程,或者修改主机上的文件权限以便容器能够写入 hostPath 卷。

Pod 示例

test-pd.yaml

apiVersion: v1
kind: Pod
metadata:
  name: test-pd
spec:
  containers:
  - image: nginx
    name: test-container
    volumeMounts:
       # 在容器中的路径    node节点上的内容被关联到 pod containr的 /test-pd路径下 exec进入pod容器的路径内可以看到节点上的内容
    - mountPath: /test-pd
      name: test-volume
  volumes:
  - name: test-volume
    hostPath:
      # directory location on host  绑定的节点的文件路径
      path: /data
      # this field is optional  此路径类型为必须存在
      type: Directory

注意:

 创建pod

[root@192 ~]# kubectl create -f test-pd.yaml 
[root@192 ~]# kubectl get pod -o wide
NAME       READY   STATUS    RESTARTS   AGE     IP            NODE    NOMINATED NODE   READINESS GATES
test-pd    1/1     Running   0          65s     10.244.0.25   node1              
[root@192 ~]# kubectl exec -it  test-pd /bin/sh
# ls
bin   dev		   docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  test-pd  usr
boot  docker-entrypoint.d  etc			 lib   media  opt  root  sbin  sys  tmp      var
# cd test-pd      #进入到上边yaml文件中的目录可以见到目录中有很多文件
# ls
a.txt  aaa  b.txt  file1  log  my_app01  my_app01.tar.gz  nginx  test  test02

在node1节点上看/data目录中的文件

[root@node1 /]# cd data/
[root@node1 data]# ls
aaa  a.txt  b.txt  file1  log  my_app01  my_app01.tar.gz  nginx  test  test02
[root@node1 data]# pwd
/data

可以看到,pod容器中 指定的test-pd 路径下的内容与 /data路径下的内容一致

在容器中添加一个文件,观察对应的node节点是否有了此文件‘

# echo "ccc"^[[C>c.txt
# ls
a.txt  aaa  b.txt  c.txt  file1  log  my_app01	my_app01.tar.gz  nginx	test  test02
[root@node1 data]# ls
aaa  a.txt  b.txt  c.txt  file1  log  my_app01  my_app01.tar.gz  nginx  test  test02

 

你可能感兴趣的:(k8s hostPath)