pv和pvc存储卷

存储卷:

1、emptyDir容器内部,随着pod销毁,emptyDir也会消失,不能做数据持久化

2、hostPath:持久化存储数据,可以和节点上目录做挂载。pod被销毁了数据还在

3、NFS:一台机器,提供pod内容器所有的挂载点

pv和pvc:

pvc就是pod发起的挂载的请求

pv:持久化存储的目录,ReadWriteMany

                      ReadOnlyMany

                      ReadWriteOnce

NFS:可以支持三种方式

hostPath:支持ReadWriteOnce

ISCSI不支持ReadWriteMany

pv的回收策略:Retain  released需要人工设置,调整回Available

               Recycle回收,自动调整回Available

               Delete:删除

静态pv和pvc:

运维负责pv:创建好持久化存储卷,声明好读写和挂载类型,以及可以提供的存储空间

pvc开发做,要和开发沟通好,你期望的读写和挂载类型,以及存储空间

当物品发布pvc之后可以生成pv,还可以在共享服务器上直接生成挂载目录

pvc直接绑定和使用pv

动态pv需要两个组件:

1、卷插件,k8s本身支持的动态pv创建不包括nfs,需要声明和安装一个外部插件

Provisioner:存储分配器,可以动态的创建pv,然后根据pvc的请求自动绑定和使用

2、StorageClass:来定义pv的属性,存储类型,大小,回收策略

还是用nfs来实现动态pv,nfs支持的方式NFS-client,Provisioner来适配nfs-client

nfs-client-provisioner卷插件

serviceAccount

NFS PRovisioner:是一个插件,没有权限是无法在集群当中获取k8s的消息。插件要有权限能够监听apiserver,获取get,list(获取集群的列表资源)create delete

 

StorageClass + nfs-client-provisioner搭建动态创建pv

步骤一:在stor01节点上安装nfs,并配置nfs服务

在随便一个节点上添加:

mkdir /opt/k8s

chmod 777 /opt/k8s/

vim /etc/exports

/opt/k8s 192.168.233.0/24(rw,no_root_squash,sync)

systemctl restart nfs

步骤二:创建 Service Account,用来管理 NFS Provisioner 在 k8s 集群中运行的权限和动态规则
设置 nfs-client 对 PV,PVC,StorageClass 等的规则

rbac:Role-based ACCESS CONTROL

定义角色在集群当中可以使用的权限

vim nfs-client-rbac.yaml

#创建 Service Account 账户,用来管理 NFS Provisioner 在 k8s 集群中运行的权限

apiVersion: v1

kind: ServiceAccount

metadata:

  name: nfs-client-provisioner

---

#创建集群角色

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRole

metadata:

  name: nfs-client-provisioner-clusterrole

rules:

  - apiGroups: [""]

#apigroup定义了规则使用哪个api的组,空字符””,直接使用API的核心组的资源

    resources: ["persistentvolumes"]

verbs: ["get", "list", "watch", "create", "delete"]

#表示权限的动作

  - apiGroups: [""]

    resources: ["persistentvolumeclaims"]

    verbs: ["get", "list", "watch", "update"]

  - apiGroups: ["storage.k8s.io"]

    resources: ["storageclasses"]

    verbs: ["get", "list", "watch"]

  - apiGroups: [""]

    resources: ["events"]

    verbs: ["list", "watch", "create", "update", "patch"]

  - apiGroups: [""]

    resources: ["endpoints"]

    verbs: ["create", "delete", "get", "list", "watch", "patch", "update"]

---

#集群角色绑定

apiVersion: rbac.authorization.k8s.io/v1

kind: ClusterRoleBinding

metadata:

  name: nfs-client-provisioner-clusterrolebinding

subjects:

- kind: ServiceAccount

  name: nfs-client-provisioner

  namespace: default

roleRef:

  kind: ClusterRole

  name: nfs-client-provisioner-clusterrole

  apiGroup: rbac.authorization.k8s.io

kubectl apply -f nfs-client-rbac.yaml

角色权限都已经创建完毕

部署插件:

NFS-privisioner。deployment来创捷插件,pod

1.20之后有一个新的机制

selfLink:API的资源对象之一,表示资源对象在集群当中自身的一个连接,self-link是一个唯一标识符号,可以用于标识k8s集群当中每个资源的对象

self link的值是一个URL,指向该资源对象的k8s api的路径

更好的实现资源对象的查找和引用

步骤三:使用 Deployment 来创建 NFS Provisioner 

vim /etc/kubernetes/manifests/kube-apiserver.yaml

spec:

  containers:

  - command:

    - kube-apiserver

- --feature-gates=RemoveSelfLink=false       #添加这一行

#feature-gates:在不破坏现有规则以及功能基础上引入新功能或者修改现有功能的机制

#禁用不影响之前的规则

    - --advertise-address=192.168.73.105

......

kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml

kubectl delete pods kube-apiserver -n kube-system

kubectl get pods -n kube-system | grep apiserver

部署nfs-provisioner的插件

nfs的provisioner的客户端以pod的方式运行在集群当中,监听k8s集群当中pv的请求,动态的创建与NFS服务器相关的pv

容器里使用的配置,在provisioner当中定义好环境变量,传给容器。storageclass的名称,nfs服务器的地址,以及nfs的目录

#创建 NFS Provisioner

vim nfs-client-provisioner.yaml

kind: Deployment

apiVersion: apps/v1

metadata:

  name: nfs-client-provisioner

spec:

  replicas: 1

  selector:

    matchLabels:

      app: nfs-client-provisioner

  strategy:

    type: Recreate

  template:

    metadata:

      labels:

        app: nfs-client-provisioner

    spec:

      serviceAccountName: nfs-client-provisioner      

#指定Service Account账户

      containers:

        - name: nfs-client-provisioner

          image: quay.io/external_storage/nfs-client-provisioner:latest

          imagePullPolicy: IfNotPresent

          volumeMounts:

            - name: nfs-client-root

              mountPath: /persistentvolumes

          env:

            - name: PROVISIONER_NAME

              value: nfs-storage       

#配置provisioner的账户名称,确保该名称与StorageClass资源中的provisioner名称保持一致

            - name: NFS_SERVER

              value: 192.168.233.94      

#配置绑定的nfs服务器

            - name: NFS_PATH

              value: /opt/k8s          

#配置绑定的nfs服务器目录

      volumes:              

#申明nfs数据卷

        - name: nfs-client-root

          nfs:

            server: 192.168.233.94

            path: /opt/k8s

kubectl apply -f nfs-client-provisioner.yaml

步骤四:创建 StorageClass,负责建立 PVC 并调用 NFS provisioner 进行预定的工作,并让 PV 与 PVC 建立关联

vim nfs-client-storageclass.yaml

apiVersion: storage.k8s.io/v1

kind: StorageClass

metadata:

  name: nfs-client-storageclass

provisioner: nfs-storage     

#这里的名称要和provisioner配置文件中的环境变量PROVISIONER_NAME保持一致

parameters:

  archiveOnDelete: "false"   

#false表示在删除PVC时不会对数据目录进行打包存档,即删除数据;为ture时就会自动对数据目录进行打包存档,存档文件以archived开头

reclaimPolicy: Retain

#定义pv的回收策略,retain,另一个是delete。不支持回收

allowVolumeExpansion: true

#pv的存储空间可以动态的扩缩容

  

kubectl apply -f nfs-client-storageclass.yaml

name:storageclass的名称

PROVISIONER:对应的创建pv的PROVISIONER的插件

PECLAIMPOLICY:回收策略,保留

VOLUMEBINDINGMODE:卷绑定模式,immediate标识pvc请求创建pv时,系统会立即绑定一个可以的pv

步骤五: 创建 PVC 和 Pod 测试

vim test-pvc-pod.yaml

apiVersion: v1

kind: PersistentVolumeClaim

metadata:

  name: test-nfs-pvc

  #annotations: volume.beta.kubernetes.io/storage-class: "nfs-client-storageclass"     

#另一种SC配置方式

spec:

  accessModes:

    - ReadWriteMany

  storageClassName: nfs-client-storageclass    

#关联StorageClass对象

  resources:

    requests:

      storage: 1Gi

---

apiVersion: v1

kind: Pod

metadata:

  name: test-storageclass-pod

spec:

  containers:

  - name: busybox

    image: busybox:latest

    imagePullPolicy: IfNotPresent

    command:

    - "/bin/sh"

    - "-c"

    args:

    - "sleep 3600"

    volumeMounts:

    - name: nfs-pvc

      mountPath: /mnt

  restartPolicy: Never

  volumes:

  - name: nfs-pvc

    persistentVolumeClaim:

      claimName: test-nfs-pvc      

#与PVC名称保持一致

  

  

kubectl apply -f test-pvc-pod.yaml

总结:动态pv

provisioner插件----支持nfs

stroageclass:定义pv的属性

*动态pv的默认策略是删除

动态pv删除pvc之后的状态,released

1、创建账户,给卷插件能够在集群内部通信,获取资源,监听事件,创建,删除,更新pv

2、创建卷插件pod,卷插件的pod创建pv

3、storageclass:给pv赋予属性(pvc被删除之后pv的状态,以及回收策略)

4、创建pvc-------完成

Logo

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

更多推荐