赞
踩
当发布PVC之后可以生成PV,还可以在动态服务器上直接生成挂载目录。PVC直接绑定和使用PV。
存储卷插件:k8s本身不支持动态PV创建,不包括NFS。所以需要声明和安装一个外部插件Provisioner(存储分配器)
Provisioner(存储分配器)可以动态的创建PV。根据PVC的请求自动绑定和使用。
StorageClass来定义PV属性、存储类型、大小、回收策略等等。
使用NFS实现动态PV。NFS支持的方式NFS-client。先创建Provisioner来适配NFS-client
需要先创建nfs-client-Provisioner
实验架构图:
serviceAccount:NFS PRovisioner:是一个插件,没有权限是无法在集群当中获取k8s的信息的。插件要有权限才能监听APIserver。获取get,list(获取集中列表资源)create delete.
- 实验架构:
- master01: 20.0.0.32
- ndoe01: 20.0.0.34
- node02: 20.0.0.35
- k8s5: 20.0.0.36 NFS服务
-
- k8s5
- mkdir k8s
- chmod 777 k8s/
- vim /etc/exports
- /opt/k8s 20.0.0.0/24(rw,no_root_squash,sync)
-
- systemctl restart rpcbind
- systemctl restart nfs
- showmount -e
- 确定每台主机上都能查看
-
- serviceAccount:NFS PRovisioner:是一个插件,没有权限是无法在集群当中获取k8s的信息的。插件要有权限才能监听APIserver。获取get,list(获取集中列表资源)create delete.
-
- 给NFS PRovisioner创建一个账户
- [root@master01 ~]# cd /opt/
- [root@master01 opt]# vim nfs-client-rbac.yaml
- #定义账户类型和名称
- apiVersion: v1
- kind: ServiceAccount
- metadata:
- name: nfs-client-provisioner
- #定义账户的名称叫nfs-client-provisioner
- ---
-
- #定义类型名称和权限以及动作
- apiVersion: rbac.authorization.k8s.io/v1
- kind: ClusterRole
- metadata:
- name: nfs-client-provisioner-role
- rules:
- #定义权限
- - apiGroups: [""]
- #apiGroups定义规则可以使用哪个api组的权限
- #[""]:如果为空表示直接使用api的核心资源
- resources: ["persistentvolumes"]
- #定义在核心组中需要的资源.定义获取PV的相关资源
- verbs: ["get","list","watch","create","delete"]
- #表示权限需要哪些动作
- #watch表示监听
- #表示声明的账号可以对PV进行这些操作
- - apiGroups: [""]
- resources: ["persistentvolumeclaims"]
- #定义获取pvc的相关组件
- verbs: ["watch","get","list","update"]
- #表示权限需要哪些动作
- - apiGroups: ["storage.k8s.io"]
- resources: ["storageclass"]
- verbs: ["get","watch","get"]
- - apiGroups: [""]
- #获取核心组件中的事件信息
- #api在调用时候的所有事件信息
- resources: ["events"]
- verbs: ["get","create","watch","update","patch"]
- - apiGroups: [""]
- resources: ["endpoints"]
- #获取服务节点的终端IP地址
- verbs: ["delete","create","get","watch","update","patch","list"]
- #获取权限需要哪些动作
-
- ---
-
- #开始绑定角色和权限
- apiVersion: rbac.authorization.k8s.io/v1
- kind: ClusterRoleBinding
- metadata:
- name: nfs-client-provisioner-bind
- subjects:
- - kind: ServiceAccount
- name: nfs-client-provisioner
- #声明账户的名称需要一一对应
- namespace: default
- #要在哪个有权限就声明使用哪个命名空间
- roleRef:
- kind: ClusterRole
- name: nfs-client-provisioner-role
- #声明调用权限的名称
- apiGroup: rbac.authorization.k8s.io
- #声明api的组名
- #将定义好的集群规则定义好的权限都赋给nfs-client-provisioner账户
- kubectl apply -f nfs-client-rbac.yaml
- 角色和权限都创建完毕
NFS-privisioner。使用deployment来部署插件 pod
1.20之后又一个新的机制
selfLink:API的资源对象之一,消失资源对象在集权当中滋生的一个连接。self Link是一个唯一表示符号。可以用于表示k8s集群当中每个资源的对象。
selfLink的值是一个URL。指向该资源对象的k8s的api路径
更好的实现资源对象的查找和引用。
- [root@master01 opt]# vim /etc/kubernetes/manifests/kube-apiserver.yaml
- - --feature-gates=RemoveSelfLink=false
- #feature-gates:在不破坏现在又规则以及功能基础上引入新功能或者修改现在又的功能机制。禁用不影响之前的规则
- [root@master01 opt]# kubectl apply -f /etc/kubernetes/manifests/kube-apiserver.yaml
- [root@master01 opt]# kubectl get pod -n kube-system
- kubectl delete pod -n kube-system kube-apiserver
-
- 部署nfs-provisioner的插件
- nfs的provisioner的客户端,以pod的方式运行在集群中监听k8s当中的pv请求。动态的创建于nfs服务相关的PV
- 容器使用的配置,在provisioner当中定义好环境变量。传给容器。storageclass的名称、nfs服务器的地址以及nfs的目录
- 开始部署:
- [root@master01 opt]# vim nfs-client-provisioner.yaml
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: nfs-provisioner
- labels:
- app: nfs1
- spec:
- replicas: 1
- selector:
- matchLabels:
- app: nfs1
- template:
- metadata:
- labels:
- app: nfs1
- spec:
- serviceAccountName: nfs-client-provisioner
- containers:
- #指定容器
- - name: nfs1
- image: quay.io/external_storage/nfs-client-provisioner:latest
- volumeMounts:
- - name: nfs
- mountPath: /persistentvolumes
- env:
- - name: PROVISIONER_NAME
- value: nfs-storage
- #配置provisioner的账户名称。要和storageclass的资源名称一致
- - name: NFS_SERVER
- #nfs共享服务器的地址
- value: 20.0.0.36
- - name: NFS_PATH
- value: /opt/k8s
- #把变量传递给内部容器,设置共享服务器和共享目录
- volumes:
- - name: nfs
- nfs:
- server: 20.0.0.36
- path: /opt/k8s
- #表示后续在哪创建存储卷。定义后续存储卷存储的位置。
- #provisioner的作用就是创建pv
- #定义pv的属性
- #告诉你nfs共享的服务器
- #告诉你共享目录
- #容器和本地目录进行挂载
- #当有符合storageclass的pvc请求来了之后
- #这个nfs-client-provisioner就会往定义的服务器上自动创建存储目录
-
- [root@master01 opt]# kubectl apply -f nfs-client-provisioner.yaml
- [root@master01 opt]# vim nfs-client-storageclass.yaml
- apiVersion: storage.k8s.io/v1
- kind: StorageClass
- metadata:
- name: nfs-client-storageclass
- #匹配provisioner
- provisioner: nfs-storage
- #定义pv的相关属性
- parameters:
- archiveOnDelete: "false"
- #表示当pvc被删除之后pv的状态。有false和true两种
- #如果是false。pvc如果被删除那么pv的状态将是released。可以人工调整继续使用
- #如果定义是true,那么pv的状态将是Archived。表示pv将不再可用。
- #一般来说都用false
- reclaimPolicy: Retain
- #定义pv的回收策略。reclaimPolicy定义的只支持两种retain和delete
- allowVolumeExpansion: true
- #pv的存储空间可以动态的扩缩容
-
- [root@master01 opt]# kubectl apply -f nfs-client-storageclass.yaml
- [root@master01 opt]# kubectl get storageclasses.storage.k8s.io
- NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
- nfs-client-storageclass nfs-storage Retain Immediate true
- name:storageclass的名称
- PROVISIONER:对应的创建pv的PROVISIONER插件
- RECLAIMPOLICY:回收策略。保留
- VOLUMEBINDINGMODE:卷绑定模式。lmmediate表示pvc请求创建pv时,系统会立即绑定一个可用的pv
- waitForFirstConsumer:第一个使用者出现之后再绑定pv
- ALLOWVOLUMEEXPANSION:true表示可以再运行时对pv进行扩容
- AGE:生命周期
- [root@master01 opt]# vim pvc-pod.yaml
- #创建PVC
- apiVersion: v1
- kind: PersistentVolumeClaim
- metadata:
- name: nfs-pvc
- spec:
- accessModes:
- - ReadWriteMany
- storageClassName: nfs-client-storageclass
- resources:
- requests:
- storage: 2Gi
- #创建一个pvc,名称为nfs-pvc,使用的pv属性是nfs-client-storageclass定义的属性
- #创建的pv大小是2Gi最后由provisioner
-
- ---
-
- apiVersion: apps/v1
- kind: Deployment
- metadata:
- name: nginx1
- 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: html
- mountPath: /usr/share/nginx/html
- volumes:
- - name: html
- persistentVolumeClaim:
- #指定pvc
- claimName: nfs-pvc
- #pod引用上面的pvc
- [root@k8s5 k8s]# cd /opt/k8s
- [root@k8s5 k8s]# ls
- [root@k8s5 k8s]# cd default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc/
- [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# ls
- [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# echo 123 > index.html
- [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# ls
-
- [root@master01 opt]# curl 10.244.2.147:80
- 123
- [root@master01 opt]# vim nfs-client-storageclass.yaml
- apiVersion: storage.k8s.io/v1
- kind: StorageClass
- metadata:
- name: nfs-client-storageclass
- #匹配provisioner
- provisioner: nfs-storage
- #定义pv的相关属性
- parameters:
- archiveOnDelete: "false"
- #表示当pvc被删除之后pv的状态。有false和true两种
- #如果是false。pvc如果被删除那么pv的状态将是released。可以人工调整继续使用
- #如果定义是true,那么pv的状态将是Archived。表示pv将不再可用。
- #一般来说都用false
- reclaimPolicy: Retain
- allowVolumeExpansion: true
- #pv的存储空间可以动态的扩缩容
-
- 开始测试资源回收策略:
- reclaimPolicy: Retain
-
- root@k8s5 k8s]# cd default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc/
- [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# ls
- [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# echo 123 > index.html
- [root@k8s5 default-nfs-pvc-pvc-3771a7a5-381e-4934-a9a7-ae3a675628fc]# ls
- index.html
-
- [root@master01 opt]# kubectl get pod -o wide
- [root@master01 opt]# curl 10.244.2.147:80
- [root@master01 opt]# kubectl delete deployments.apps nginx2
- #删除控制器
- [root@master01 opt]# kubectl delete pvc nfs-pvc2
- #删除PVC
- [root@master01 opt]# kubectl delete pv pvc-c15e8810-62e5-49eb-a7f1-282b5292347
- #删除PV
- 回到k8s5查看共享目录依旧存在
- [root@master01 opt]# vim nfs-client-storageclass.yaml
- apiVersion: storage.k8s.io/v1
- kind: StorageClass
- metadata:
- name: nfs-client-storageclass
- #匹配provisioner
- provisioner: nfs-storage
- #定义pv的相关属性
- parameters:
- archiveOnDelete: "false"
- #表示当pvc被删除之后pv的状态。有false和true两种
- #如果是false。pvc如果被删除那么pv的状态将是released。可以人工调整继续使用
- #如果定义是true,那么pv的状态将是Archived。表示pv将不再可用。
- #一般来说都用false
- reclaimPolicy: Delete
- allowVolumeExpansion: true
- #pv的存储空间可以动态的扩缩容
-
- reclaimPolicy: Delete
-
- [root@k8s5 k8s]# cd default-nfs-pvc2-pvc-c15e8810-62e5-49eb-a7f1-282b5292347b
- [root@k8s5 default-nfs-pvc2-pvc-c15e8810-62e5-49eb-a7f1-282b5292347b]# ls
- [root@k8s5 default-nfs-pvc2-pvc-c15e8810-62e5-49eb-a7f1-282b5292347b]# echo 456 > index.html
- [root@k8s5 default-nfs-pvc2-pvc-c15e8810-62e5-49eb-a7f1-282b5292347b]# cd /opt/k8s/
- [root@k8s5 k8s]# ls
-
- [root@master01 opt]# kubectl delete deployments.apps nginx2
- #删除控制器
- [root@master01 opt]# kubectl delete pvc nfs-pvc2
- #删除PVC
- [root@master01 opt]# kubectl delete pv pvc-c15e8810-62e5-49eb-a7f1-282b5292347
- #删除PV
- 回到k8s5查看共享目录自动消失
- 实验完成!!!!
rbac:Role-based ACCESS CONTROL:基础权限配置。用来定义角色在集群当中可以使用的权限。
provisioner的作用就是创建pv
nfs-client-provisioner.yaml的作用就是定义pv的属性告诉你nfs共享的服务器。告诉你共享目录。容器和本地目录进行挂载。当有符合storageclass的pvc请求来了之后这个nfs-client-provisioner就会往定义的服务器上自动创建存储目录
工作流程图:
动态pv的两个组件:
provisioner插件:支持nfs。创建pv目录
strogeclass:定义pv的属性。
动态pv的默认策略是删除
动态pv删除pvc的状态。最好设置为releassed
给卷插件创建账号,确保集群可以在集群内部通信,获取资源,监听事件。创建和删除以及更新pv
创建卷插件的pod。由卷插件的pod创建pv
定义storageclass给pv赋予属性。属性包括:pvc被删除之后pv的状态,以及回收策略。
创建pvc
实验完成
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。