K8S 持久化之 静态PV (NFS)
K8S部署见上篇:
https://blog.csdn.net/oToyix/article/details/117963839

一、概念

Persistent volume

Persistent Volume (持久存储卷)简称PV,是一个K8S资源对象,所以我们可以单独创建一个PV。它不和Pod直接发生关系,而是通过Persistent Volume Claim(PV索取),简称PVC来实现动态绑定。Pod定义里指定的是PVC,然后PVC会根据Pod的要求去自动绑定合适的PV给Pod使用。

PV的访问模式有三种:

1、ReadWriteOnce:

是最基本的方式,可读可写,但只支持被单个Pod挂载。简称:RWO – ReadWriteOnce

2、ReadOnlyMany:

可以以只读的方式被多个Pod挂载。 简称:ROX – ReadOnlyMany

3、ReadWriteMany:

简称:RWX – ReadWriteMany。这种存储可以以读写的方式被多个Pod共享。不是每一种存储都支持

这三种方式,像共享方式,目前支持的还比较少,比较常用的是NFS。

PVC绑定PV时通常根据两个条件来绑定,“存储的大小” 及 “访问模式”。

创建PV有两种方式:

静态PV

管理员手动创建一堆PV,组成一个PV池,供PVC来绑定。

动态PV

在现有PV不满足PVC的请求时,可以使用存储分类(StorageClass),描述具体过程为:PV先创建分类,PVC请求已创建的某个类(StorageClass)的资源,这样就达到动态配置的效果。即通过一个叫 Storage Class的对象由存储系统根据PVC的要求自动创建。

PV创建完后状态会变成Available,等待被PVC绑定。一旦被PVC邦定,PV的状态会变成Bound,就可以被定义了相应PVC的Pod使用。Pod使用完后会释放PV,PV的状态变成Released。变成Released的PV会根据定义的回收策略做相应的回收工作。

PV有三种回收策略:

1、Retain

Retain就是保留现场,K8S什么也不做,等待用户手动去处理PV里的数据,处理完后,再手动删除PV。

2、Delete

Delete 策略,K8S会自动删除该PV及里面的数据。

3、Recycle。

Recycle方式,K8S会将PV里的数据删除,然后把PV的状态变成Available,又可以被新的PVC绑定使用。

在实际使用场景里,PV的创建和使用通常不是同一个人。一般为:管理员创建一个PV池,开发人员创建Pod和PVC,PVC里定义了Pod所需存储的大小和访问模式,然后PVC会到PV池里自动匹配最合适的PV给Pod使用。

二、K8S+NFS静态存储模式案例:

1、基于Linux平台构建NFS网络文件系统,配置指令如下:

#安装NFS文件服务;	
yum install nfs-utils -y
#配置共享目录&权限;
mkdir -p /data/nginx/conf
mkdir -p /data/nginx/html
vim /etc/exports
/data/ *(rw,sync,no_root_squash)
#启动NFS服务;
service nfs restart

写一个index.html文件进去,一会测试使用

 echo "PV ReadWriteMany" >/data/nginx/html/index.html

2、PV存储卷创建

创建持久化PV存储卷,pv.yaml文件内容如下:

cat>pv-nginx-nfs.yaml<<-EOF
apiVersion: v1
kind: PersistentVolume
metadata:
  name: nginx-nfs-pv
  namespace: default
spec:
  capacity:
    storage: 20G
  accessModes:
    - ReadWriteMany
  nfs:
    # FIXME: use the right IP
    server: 192.168.0.37
    path: /data/nginx/html/
EOF

PV配置参数说明:

Capacity 指定 PV 的容量为 100M;
accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:
ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。
ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。
ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。
persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:
Retain – 需要管理员手工回收。
Recycle – 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*;
Delete – 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure、Disk、OpenStack Cinder Volume 等。
storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。
path:指定 PV 在 NFS 服务器上对应的目录。

3、PVC存储卷创建

创建持久化PVC存储卷索取,pvc.yaml文件内容如下:

cat>pvc-nginx-nfs.yaml<<-EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nginx-nfs-pvc
  namespace: default
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: ""
  resources:
    requests:
      storage: 10G
EOF

4、Nginx POD使用 PV存储卷

1)创建Nginx POD容器使用PVC存储卷索取,nginx.yaml文件内容如下:

cat>nginx-deployments.yaml<<-EOF
kind: Deployment
apiVersion: apps/v1
metadata:
  name: nginx-v1
  namespace: default
  labels:
    k8s-app: nginx-v1

spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: nginx-v1
  template:
    metadata:
      name: nginx-v1
      labels:
        k8s-app: nginx-v1
    spec:
      containers:
        - name: nginx-v1
          image: 'nginx:latest'
          imagePullPolicy: Always
          volumeMounts:
          - mountPath: /usr/share/nginx/html
            name: nginx-data
          ports:
          - containerPort: 80
      volumes:
      - name: nginx-data
        persistentVolumeClaim:
          claimName: nginx-nfs-pvc
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600
EOF

2)、创建Nginx-service.yaml,一会方便测试

kind: Service
apiVersion: v1
metadata:
  name: nginx-v1
  namespace: default
  labels:
    k8s-app: nginx-v1

spec:
  type: LoadBalancer
  ports:
    - name: tcp-8888-80-rpxsl
      protocol: TCP
      port: 8888
      targetPort: 80
      nodePort: 30680
  selector:
    k8s-app: nginx-v1
  clusterIP: 10.10.214.146
  clusterIPs:
    - 10.10.214.146
EOF

5、kubectl 应用4个yaml文件

创建nfs支持- 各节点

mkdir -p /data/k8s/pv
cd /data/k8s/pv
yum install -y nfs-utils
[root@master1 pv]# kubectl create -f pv-nginx-nfs.yaml 
persistentvolume/nginx-nfs-pv created
[root@master1 pv]# kubectl create -f pvc-nginx-nfs.yaml 
persistentvolumeclaim/nginx-nfs-pvc created
[root@master1 pv]# kubectl create -f nginx-deployments.yaml 
replicationcontroller/nginx-v1 created
[root@master1 pv]# kubectl create -f nginx-service.yaml 
service/nginx-v1 created

PV这里
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

注:所有节点都要安装nfs客户端
yum install nfs-utils -y

---------------------------------------------end

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐