K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)

  • 1、K8S-emptyDir(pod挂载到真机节点目录,随着容器删除而删除)
  • 2、K8S-hostPath(真机节点目录挂载到pod,pod删除真机节点目录不删除)
    • 2.1不指定节点,让pod自动挂载
    • 2.2 指定节点,指定pod的挂载点
  • 3、K8S-NFS 共享存储
  • 4、K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)

1、K8S-emptyDir(pod挂载到真机节点目录,随着容器删除而删除)

搭建K8S文档:yum安装K8S
ansible搭建K8S集群:ansible搭建K8S
准备至少3个机器搭建好K8S集群

节点名称 IP
k8s-master 192.168.116.134
k8s-node1 192.168.116.135
k8s-node2 192.168.116.136

官网介绍:k8s-emptyDir
emptyDir:在k8s集群中,当pod指定挂载emptyDir卷时,pod创建在某个节点上,节点就会自动生成一个挂载目录存放pod的指定目录内容,这个目录不会随着pod重建而删除,但是pod真正被删除后,数据就会被删除。
emptyDir 的一些用途:

  • 缓存空间,例如基于磁盘的归并排序。指定emptyDir.medium字段为Memory时,如果节点重启,数据会丢失。
  • 为耗时较长的计算任务提供检查点,以便任务能方便地从崩溃前状态恢复执行。
  • 在 Web 服务器容器服务数据时,保存内容管理器容器获取的文件。

在master创建pod

vi nginx-volume-emptydir.yml   创建pod

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-emptydir
  name: nginx-emptydir-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-emptydir
  template:
    metadata:
      labels:
        app: nginx-emptydir
    spec:
      containers:
      - name: nginx-emptydir
        image: docker.io/library/nginx:1.18.0-alpine
        volumeMounts:
        - mountPath: /emptydir #指定被挂载的容器目录
          name: nginx-volume   #指定节点挂载的目录名字
      volumes:
      - name: nginx-volume     #指定卷名字
        emptyDir: {}           #设置卷属性为emtyDir

kubectl apply -f nginx-volume-emptydir.yml    创建pod
kubectl get pod -o wide                       查看pod创建在了k8s-node2节点

查看这个名字default-token-gxjmw,查看挂载目录需要用到
kubectl describe pod nginx-emptydir-deployment-899d6c77-8rj5q |grep SecretName
进入容器
kubectl exec -it nginx-emptydir-deployment-899d6c77-8rj5q /bin/sh
进入目录,创建文件
cd emptydir/
echo test >test.txt

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第1张图片
在k8s-node2查看挂载的目录

df -Th   通过名字default-token-gxjmw可以看到节点挂载的目录
通过指定前半部分就可以找到节点的挂载目录
ll /var/lib/kubelet/pods/c43bd831-e5a1-4159-9665-9d86be634a54/volumes/kubernetes.io~empty-dir/

在目录下查看刚才pod创建的文件
cat /var/lib/kubelet/pods/c43bd831-e5a1-4159-9665-9d86be634a54/volumes/kubernetes.io~empty-dir/nginx-volume/test.txt 

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第2张图片
在master删除pod,确认k8s-node2的目录会自动删除

kubectl delete -f nginx-volume-emptydir.yml  删除pod
kubectl get pod -o wide  可以看到没有pod运行

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第3张图片
在k8s-node2查看目录是否被删除

df -Th   可以看到没有刚才挂载的目录

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第4张图片

2、K8S-hostPath(真机节点目录挂载到pod,pod删除真机节点目录不删除)

官网介绍:k8s-hostPath
hostPath:在K8S集群中,当需要把真机节点的目录挂载到pod中,就需要使用这种挂载方式,挂载时最好是以只读方式挂载,不然可能出现pod被黑导致真机瘫痪的情况。

注意:

  • HostPath 卷可能会暴露特权系统凭据(例如 Kubelet)或特权
    API(例如容器运行时套接字),可用于容器逃逸或攻击集群的其他部分。
  • 具有相同配置(例如基于同一 PodTemplate 创建)的多个 Pod 会由于节点上文件的不同而在不同节点上有不同的行为。
  • 下层主机上创建的文件或目录只能由 root 用户写入。你需要在 特权容器 中以 root
    身份运行进程,或者修改主机上的文件权限以便容器能够写入 hostPath 卷。

因为pod是根据K8S的调度规则调度到节点生成,所以数据不能确定放在哪个K8S的节点上,一种方式是可以先创建pod,然后把数据转移到节点。也可以通过下面这个文档指定pod创建在节点上。
查看这个文档:k8s亲和

2.1不指定节点,让pod自动挂载

master创建pod

vi nginx-volume-hostpath.yml    创建pod

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-hostpath
  name: nginx-hostpath-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-hostpath
  template:
    metadata:
      labels:
        app: nginx-hostpath
    spec:
      containers:
      - name: nginx-hostpath
        image: docker.io/library/nginx:1.18.0-alpine
        volumeMounts:
        - mountPath: /data   #设置pod的目录
          name: nginx-volume-hostpath  #设置pod的挂载区名字
      volumes:
      - name: nginx-volume-hostpath
        hostPath:
          path: /k8s-hostPath-data   #设置真机节点目录
          type: DirectoryOrCreate    #设置类型为创建目录
          
kubectl apply -f nginx-volume-hostpath.yml  创建pod
kubectl get pod -o wide                     查看pod在k8s-node2节点

在这里插入图片描述
在k8s-node2查看

ll /   可以看到pod自动在节点目录下创建目录,默认权限为0755

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第5张图片
在master连接容器,创建文件后,删除容器

连接容器,创建文件
kubectl exec -it nginx-hostpath-deployment-5f4c88b499-cvhj8 /bin/sh
echo k8s-node2 >/data/test.txt
exit

删除容器
kubectl delete -f volume/nginx-volume-hostpath.yml

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第6张图片
返回k8s-node2,可以看到刚才创建的文件还在,证明这种挂载方式的数据不会随着容器删除而删除数据

ll /k8s-hostPath-data/
cat /k8s-hostPath-data/test.txt 

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第7张图片

2.2 指定节点,指定pod的挂载点

在k8s-node1创建目录

mkdir /k8s-node1/data -p
cp /etc/fstab /k8s-node1/data/    复制文件到目录下

在这里插入图片描述
在master操作

对k8s-node1打上标签
kubectl label nodes  k8s-node1 node-labels=nginx-test
kubectl get nodes --show-labels

在这里插入图片描述
在master创建pod

vi nginx-volume-hostpath2.yml 

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-hostpath2
  name: nginx-hostpath2-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-hostpath2
  template:
    metadata:
      labels:
        app: nginx-hostpath2
    spec:
      containers:
      - name: nginx-hostpath2
        image: docker.io/library/nginx:1.18.0-alpine
        volumeMounts:
        - mountPath: /pod/data         #指定pod的目录
          name: nginx-volume-hostpath2
      volumes:
      - name: nginx-volume-hostpath2
        hostPath:
          path: /k8s-node1/data   #指定节点的真机目录
          type: Directory
      nodeSelector:
        node-labels: nginx-test  #指定创建的节点标签


kubectl apply -f nginx-volume-hostpath2.yml  创建pod
kubectl get pod -o wide   查看pod创建在了k8s-node1节点

连接pod
kubectl exec -it nginx-hostpath2-deployment-559fc49864-lv8fv /bin/sh
ls /pod/data/fstab    可以看到真机的文件挂载到了pod的目录

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第8张图片

3、K8S-NFS 共享存储

官网文档:k8s-NFS
GitHub文档:k8s-github-NFS

全部节点都必须按照NFS服务,要不然在创建pod会挂载不上去

yum install -y nfs-utils

在NFS服务器上创建共享目录

mkdir /nfs/data -p  创建目录
vi /etc/exports     创建配置文件

/nfs/data *(rw,no_root_squash)

systemctl enable nfs-server
systemctl start nfs-server
showmount -e 192.168.116.134    确认服务开启成功

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第9张图片
在master创建pod

vi nginx-volume-nfs.yml   创建pod

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-nfs
  name: nginx-nfs-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-nfs
  template:
    metadata:
      labels:
        app: nginx-nfs
    spec:
      containers:
      - name: nginx-nfs
        image: docker.io/library/nginx:1.18.0-alpine
        volumeMounts:
        - mountPath: /data          #指定pod的目录
          name: nginx-volume-nfs
      volumes:
      - name: nginx-volume-nfs
        nfs:
          server: 192.168.116.134   #指定NFS服务器的IP
          path: /nfs/data           #指定NFS的共享目录


kubectl apply -f nginx-volume-nfs.yml 
kubectl get pod -o wide

连接容器
kubectl exec -it nginx-nfs-deployment-69c7445777-8hhnz /bin/sh
创建文件
echo nfs >/data/nfs.txt
exit

在NFS服务器上查看pod的文件创建在了NFS的目录下
cat /nfs/data/nfs.txt 

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第10张图片
在创建pod的k8s-node2查看挂载可以看到NFS挂载点

df -Th

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第11张图片

4、K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)

官网文档:k8s-PV
官网文档:k8s-PVC

目的:因为文件系统多种多样,所以K8S集群需要一个中间件也就是pv连接各种文件系统,而pvc用来在K8S集群中将pod和pv连接起来,从而使集群更加高效、简洁。

pv:在K8S的集群中创建一个存储卷,主要是和NFS、CephFS、Cinder等其他文件系统绑定,并且通过kubectl可以查看pv信息,方便集群存储管理。

pvc:主要用于定义pod和pv之间的连接规则,比如说这个pod使用多少pv空间,pod访问pv的策略限制。

4.1 以NFS+PV+PVC为例
全部节点都必须按照NFS服务,要不然在创建pod会挂载不上去

yum install -y nfs-utils

在NFS服务器上创建共享目录

mkdir /nfs/data -p  创建目录
vi /etc/exports     创建配置文件

/nfs/data *(rw,no_root_squash)

systemctl enable nfs-server
systemctl start nfs-server
showmount -e 192.168.116.134    确认服务开启成功

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第12张图片
4.2 master创建PV

vi nginx-pv.yml   创建pv

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-pv    #设置pv的名字
  namespace: default
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  nfs:
    server: 192.168.116.134 #设置NFS的服务器IP
    path: /nfs/data         #设置NFS的共享目录


kubectl apply -f nginx-pv.yml
kubectl get pv   默认没绑定pvc的状态是Available

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第13张图片
4.3 在master创建pvc,并且和pv绑定

vi nginx-pvc.yml 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-pvc         #设置pvc的名字
  namespace: default
spec:
  accessModes:
    - ReadWriteOnce       #设置文件读取方式为读写
  volumeName: nginx-pv    #指定pv的名字
  resources:
    requests:
      storage: 2Gi  #可以比pv的容量小,这里可以自定义

kubectl apply -f nginx-pvc.yml  创建pvc
kubectl get pv                  当pv的状态为Bound,证明和pvc绑定了
kubectl get pvc                 当pvc的状态为Bound,证明和pv绑定

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第14张图片
4.4 在master创建pod,通过pvc使用pv空间

vi nginx-volume-nginx-pvc-pv.yml   创建pod

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx-pvc-pv
  name: nginx-pvc-pv-deployment
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx-pvc-pv
  template:
    metadata:
      labels:
        app: nginx-pvc-pv
    spec:
      containers:
      - name: nginx-pvc-pv
        image: docker.io/library/nginx:1.18.0-alpine
        volumeMounts:
        - mountPath: /data   #指定pod的目录
          name: nginx-pvc-pv 
      volumes:
      - name: nginx-pvc-pv
        persistentVolumeClaim:
          claimName: nginx-pvc  #指定pvc的名字


kubectl apply -f nginx-volume-nginx-pvc-pv.yml  创建pod
kubectl get pod -o wide     查看pod的节点

进入容器
kubectl exec -it nginx-pvc-pv-deployment-86f55bd84d-64mml /bin/sh
echo pv-pvc >/data/pv-pvc.txt   创建文件
exit

cat /nfs/data/pv-pvc.txt 查看创建的文件在NFS的共享目录下生成

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第15张图片
4.5 在创建pod的节点上查看挂载方式还是NFS方式挂载

df -Th

K8S的存储卷,K8S-emptyDir,K8S-hostPath,K8S-NFS,K8S-pv(persistent-volumes)和pvc(PersistentVolumeClaim)_第16张图片

你可能感兴趣的:(系统服务,运维,容器,kubernetes,kubelet,集成学习)