Kubernetes的动态pv

pv和pvc存储卷

存储卷:

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

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

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

pv和pvc:

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

pv:持久化存储的目录,ReadwriteMan、ReadOnlyMany、ReadWriteOnce

只有NFS支持ReadWriteOnce、ReadOnlyMany 、readwriteMany

hostPath只支持ReadWriteOnce

ISCI:不支持ReadWriteMany

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

Reycle回收,自动调整回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-clent-provisioner卷插件

Kubernetes的动态pv_第1张图片

serviceAccount

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

kind ServiceAccount

rbac:Role-based ACCESS CONTROL #定义校色在集群当中可以使用的权限

角色、权限都已经创建完毕

部署插件:NFS-privisioner deployment来创建插件 pod

1.20之后又一个新的机制

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

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

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

--feature-gates=RemoveSelfLink=false

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

禁用不影响之前的规则。

部署bfs-provisioner的插件:

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

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

provisioner作用创建pv

name: storageclass的名称

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

RECLAIMPOLICY:回收策略,保留

VOLUMEBINDINGMODE:卷绑定模式。immediate表示pvc请求创建pv时,系统会立即绑定一个可用的pv

ALLOWVOUMEEXPANSION:true表示可以在运行时对pv进行扩容

waitForFirstConsumer:第一个使用者出现之后再绑定pv。

总结核心:动态pv

两个组件provisioner插件---支持nfs

storageclass:定义pv的属性插件创建pv属性

动态pv的默认策略是删除

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

主要就是创建账号给卷插件能够在集群内部通信,获取资源,监听事件,创建和删除更新pv

第二件事就是创建卷插件pod由卷插件的pod创建pv

第三件事:创storageclass:给pv赋予属性(pvc被删除之后pv的状态,以及回收的策略)

第四件事创建pvc>完成pvc

动态pv的过程

在stor01节点上安装nfs,并配置nfs服务


mkdir /opt/k8s
chmod 777 /opt/k8s/
 
vim /etc/exports
/opt/k8s 20.0.0.0/24(rw,no_root_squash,sync)

systemctl restart rpcbind
systemctl restart nfs


vim nfs-client-rbac.yaml
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: [""]
    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
使用 Deployment 来创建 NFS Provisioner
vim /etc/kubernetes/manifests/kube-apiserver.yaml
spec:
  containers:
  - command:
    - kube-apiserver
    - --feature-gates=RemoveSelfLink=false #添加这一行
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
vim nfs-client-provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs1
    spec:
      serviceAccountName: nfs-client-provisioner   	  
      containers:
        - name: nfs1
          image: quay.io/external_storage/nfs-client-provisioner:latest
          imagePullPolicy: IfNotPresent
          volumeMounts:
            - name: nfs
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: nfs-storage               
			                               
            - name: NFS_SERVER
              value: 20.0.0.95            
            - name: NFS_PATH
              value: /opt/k8s                   
      volumes:                                  
        - name: nfs
          nfs:
            server: 20.0.0.95
            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
provisioner: nfs-storage
parameters:
  archiveOnDelete: "false"
#pvc被删除之后pv的状态,如果定义的false,pvc如果被删除,pv的状态将是released,可以人工调整,
继续使用,如果是true,pv的状态将是Archived,表示pv不再可用
reclaimPolicy: Retain
#定义pv的回收策略,只支持retain和delete,不支持回收
allowVolumeExpansion: true
#表示pv的存储空间可以动态的扩缩容
 kubectl apply -f nfs-client-storageclass.yaml                                                                                          
                                                                           
vim test-pvc-pod.yaml
piVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  accessModes:
    - ReadWriteMany
  storageClassName: nfs-client-storageclass
  resources:
    requests:
      storage: 2Gi
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: test-storageclass-deployment
  labels:
    app: nginx1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx1
        image: nginx:1.22
        volumeMounts:
        - name: nfs-pvc
          mountPath: /usr/share/nginx/html
      volumes:
      - name: nfs-pvc
        persistentVolumeClaim:
          claimName: nfs-pvc

kubectl apply -f test-pvc-pod.yaml

Kubernetes的动态pv_第2张图片

你可能感兴趣的:(kubernetes,容器,云原生)