首页 > 其他分享 >k8s数据卷 Volume 之 hostPath 与 emptyDir

k8s数据卷 Volume 之 hostPath 与 emptyDir

时间:2023-07-27 12:22:05浏览次数:53  
标签:name Volume hostPath emptyDir pod k8s data Pod

一、为什么需要 volume(数据卷)?

容器中的文件在磁盘上是临时存放的,这给容器中运行比较重要的应用程序带来一些问题。

  • 问题1:当容器升级或者崩溃时,kubelet会重建容器,容器内文件会丢失
  • 问题2:一个Pod中运行多个容器需要共享文件。

Kubernetes 卷(Volume) 这一抽象概念能够解决这两个问题。

二、常用数据卷

  • 本地(emptyDir,hostPath)
  • 网络(NFS,Ceph,GlusterFS)
  • 公有云(AWS EBS)
  • K8S资源(configmap,secret)

三、empryDir

emptyDir卷: 是一个自动创建的、 Pod 所在node主机上的临时目录(node上预设定好的存储位置),与Pod生命周期绑定在一起,如果Pod删除了,emptyDir卷也会被删除。
应用场景: Pod中容器之间数据共享,常用于同一个pod内容器(container)之间直接的数据传输。

例子

# 做一个测试yaml
vi emptydir.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod1
spec:
  containers:
  - name: write # 业务容器(写数据)
    image: centos
    command: ["bash","-c","for i in {1..100};do echo $i >> /data/hello;sleep 1;done"]
    volumeMounts:
      - name: data
        mountPath: /data
  - name: read # 辅助容器(读数据)
    image: centos
    command: ["bash","-c","tail -f /data/hello"]
    volumeMounts:
      - name: data
        mountPath: /data
  volumes:
  - name: data
    emptyDir: {}
kubectl apply -f emptydir.yaml

执行后,可以看到两个文件data是共享的,测试可以看到两个文件是共享的。

empryDir在k8s中的存储位置

一般在 /var/lib/kubelet/pods/{pod-id}/volumes/kubernetes.io~empty-dir 下。

四、hostPath

hostPath卷: 挂载Node文件系统(Pod所在节点)上文件或者目录到Pod中的容器。
应用场景: Pod中容器需要访问宿主机文件。但不适合做持久化。

示例

vi hostPath.yaml

apiVersion: v1
kind: Pod
metadata:
  name: pod2
spec:
  containers:
  - name: write # 业务容器(写数据)
    image: centos
    command: ["bash","-c","for i in {1..1000};do echo $i >> /data/hello;sleep 1;done"]
    volumeMounts:
      - name: data
        mountPath: /ttt
  volumes:
  - name: data
    hostPath:
      path: /tmp
      type: Directory # 文件类型:定义node主机上的 /tmp 是文件夹还是文件。

测试,在 pod 的 /ttt 目录下写入一个123文件后,查看此pod所处节点

# 查看 pod 所在的 node 
kubectl get pods -o wide

进入node1节点tmp下查看

成功

五、emptyDir 与 hostPath 的区别

相同点

  • emptyDir 和 hostPath 类型都可用于 container 之间数据共享。

区别

  • emptyDir 是 pod 级别的。pod 销毁后, emptyDir 也会销毁。

  • emptyDir 被初始化后里面是空的。所有在同一个 pod 中的 container 都可以通过挂载emptyDir后对其进行读写操作。

  • emptyDir 主要用于同一个 pod 中的 container 之间共享数据。(如:log 日志目录)

  • emptyDir 使用 emptyDir 这种 volume 时,一个pod中一般会有2个以上的 container。

  • hostPath 是 node 级别的,node 是持久化的。一个 node 可以创建 N 个 pod 。

emptyDir


apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-app
    image: my-app-image
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  - name: sidecar
    image: busybox
    volumeMounts:
    - mountPath: /cache
      name: cache-volume
  volumes:
  - name: cache-volume
    emptyDir: {}

hostPath


apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-app
    image: my-app-image
    volumeMounts:
      - name: test-volume
        mountPath: /test-pd
  volumes:
  - name: test-volume 
    hostPath:
      path: /data      # directory on host
      type: Directory  # optional 

# type:
# Other values for type are 'DirectoryOrCreate', 'File', 'FileOrCreate'. 

标签:name,Volume,hostPath,emptyDir,pod,k8s,data,Pod
From: https://www.cnblogs.com/eddyz/p/17584633.html

相关文章

  • BC-Linux for Euler部署K8S-1.27
    目录1、介绍及说明1.1主机信息1.2部署组件及规划2、基础优化2.1开启ipv62.2修改文件最大数2.3配置hosts解析2.4内核参数优化2.5selinux关闭2.6防火墙2.7ipvs支持2.8内核版本要求2.9yum源配置3、部署3.1docker及cri-docker安装及配置-所有主机3.1.1docker3.1.2cri-......
  • k8s中如何固定一个pod的IP地址?该集群网络插件是calico
    1、首先查看calico的CIDR地址范围[root@nccztsjb-node-17~]#calicoctlgetippoolNAMECIDRSELECTORdefault-pool172.23.0.0/16all() 2、然后呢,在这个地址范围内,给pod选择一个固定的IP地址比如:172.23.45.27 通过在pod中加入annotat......
  • k8s 部署dashboard 2.7.0
    查看dashboard版本兼容性Kubernetesversion1.221.231.241.25Compatibility???✓准备dashboardyaml文件#wgethttps://raw.githubusercontent.com/kubernetes/dashboard/v2.7.0/aio/deploy/recommended.yaml准备image#dockerpulldocker.io/kubernete......
  • k8s1.20二进制包安装
    集群环境准备主机规划主机IP地址主机名主机角色主机配置软件列表10.58.32.31k8s-master01master,LB2C4Gkube-apiserver、kube-controller-manager、kube-scheduler、etcd、kubelet、kube-proxy、docker,haproxy、keepalived10.58.32.32k8s-master02master,LB......
  • 【容器架构】你知道有 Docker 为什么还要 K8s 吗?
    ......
  • k8s上搭建elasticsearch单节点集群(固定存储)
    因为Elasticsearch需要保持数据在固定的磁盘上,属于有状态的应用服务,因此采用k8s的StatefulSet模式部署。创建PersistentVolumes和Claim#es-persistent-volume.yamlapiVersion:v1kind:PersistentVolumemetadata:name:es-nfs-pvlabels:pv:es-nfs-pvspec:......
  • k8s使用token访问集群apiserver
    exportTOKEN=eyJhbGciOiJSUzI1NiIsImtpZCI6InRjMEs2b2tyVUFjdHZuazNTS1VrM0s3LWFHMlVjek5NTUJnVUVSTTVHQnMifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJzaGlvcmlrbyIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY29......
  • k8s pod,pvc,pv无法删除问题
    一般删除步骤为:先删pod再删pvc最后删pv但是遇到pv始终处于“Terminating”状态,而且delete不掉1、查看pvc被哪个pod使用[root@hadoop03storageclass]#kubectldescribepvcPVC-NAME|grepMountedMountedBy:busybox-deployment-8588b74c4b-vw8jdpvpvc删不掉解决方......
  • 搭建k8s集群
    一、k8smaster部署Master节点上会运行的组件:etcd,kube-apiserver,kube-controller-manager,kuctl,kubeadm.kubelet,kube-proxy,flannel,docker Kubeadm,官方k8s一键部署工具Flannel,网络插件,确保节点间能够互相通信 环境初始化: 1)hosts解析cat>>/etc/hosts <<EOF0.......
  • k8s中删除节点之后再添加节点
    删除节点先标记为不可调度,驱逐节点上的pod#先标记节点$kubectldraincentos7909--delete-emptydir-data--force--ignore-daemonsetsnode/centos7909alreadycordonedWARNING:ignoringDaemonSet-managedPods:kube-flannel/kube-flannel-ds-hnmmg,kube-system/kube......