去类似美团网站做软件开发,网站 中文版与英文版的后台有什么不同,延安软件开发公司,wordpress玉娇龙儿当我要发布pvc可以生成pv#xff0c;还可以共享服务器上直接生成挂载目录。pvc直接绑定pv。 动态pv需要两个组件
1、卷插件#xff1a;k8s本生支持的动态pv创建不包括nfs#xff0c;需要声明和安装一个外部插件
Provisioner: 存储分配器。动态创建pv,然后根据pvc的请求自动…当我要发布pvc可以生成pv还可以共享服务器上直接生成挂载目录。pvc直接绑定pv。 动态pv需要两个组件
1、卷插件k8s本生支持的动态pv创建不包括nfs需要声明和安装一个外部插件
Provisioner: 存储分配器。动态创建pv,然后根据pvc的请求自动绑定和使用。
2、StorageClass来定义pv的属性存储类型、大小。回收策略。
还是用nfs支持动态pvNfs支持的方式NFS-clientProvisioner来适配NFS-client
nfs-client-Provisioner卷插件。
框架 实验
master192.168.10.10
node01192.168.10.20
node02192.168.10.30 创建账号给卷插件能够在集群内部通信获取资源监听事件创建、删除、更新pv创建卷插件pod卷插件的pod插件pvstorageclass:给pv赋予属性 (pvc被删除之后pv的状态以及回收策略)创建pvc-------完成。
node04192.168.10.40
mkdir /opt/k8svim /etc/exports
/opt/k8s 192.168.10.0/24(rw,no_root_squash,sync)#注意按先后顺序
systemctl restart rpcbind
systemctl restart nfs#查看暴露的nfs共享文件
showmount -e
master192.168.10.1
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-role
rules:- apiGroups: []
#apigroup定义了规则可以使用哪个api组的权限空字符表示直接使用api的核心组的资源。resources: [persistentvolumes]verbs: [get,list,watch,create,delete]
#表示权限的当中- apiGroups: []resources: [persistentvolumeclaims]verbs: [watch,get,list,update]
#定义pv属性- apiGroups: [storage.k8s.io]resources: [storageclasses]verbs: [get,watch,list]- apiGroups: []resources: [events]verbs: [list,create,watch,update,patch]- apiGroups: []resources: [endpoints]verbs: [delete,create,get,watch,update,patch,list]
---
#集群角色绑定 kubectl explain ClusterRoleBinding 查看字段详情
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:name: nfs-client-provisioner-bind
subjects:
- kind: ServiceAccountname: nfs-client-provisionernamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-roleapiGroup: rbac.authorization.k8s.io serviceAccount
NFS Provisioner 是一个插件没有权限是无法再集群当中获取k8s的信息。插件要有权限能够监听apiserver获取getlist(获取集群的列表资源)create delete。 rbacRole-bases-access-control 定义角色在集群当中使用的权限
vim nfs-client-provisioner.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-provisionerlabels:app: nfs1
spec:replicas: 1selector:matchLabels:app: nfs1template:metadata:labels:app: nfs1spec:serviceAccountName: nfs-client-provisioner
#指定Service Account账户containers:- name: nfs1image: quay.io/external_storage/nfs-client-provisioner:latestvolumeMounts:- name: nfsmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: nfs-storage
#配置provisioner的账户名称确保该名称与StorageClass资源中的provisioner名称保持一致- name: NFS_SERVERvalue: 192.168.10.40
#指定的是nfs共享服务器的地址- name: NFS_PATHvalue: /opt/k8s
#配置绑定的nfs服务器目录#声明nfs数据卷volumes:- name: nfsnfs:server: 192.168.10.40 path: /opt/k8s
1.20之后有一个新的机制
selfLink: AP的资源对象之一表示资源对象在集群当中自身的一个连接selflink是一个唯一的表示符号可以用于标识每一个资源对象
self link的值是一个URL,指向该资源对象的k8sapi的路径更好的实现资源对象的查找和引用。
kubectl apply -f nfs-client-provisioner.yaml kubectl get pod
NAME READY STATUS RESTARTS AGE
nfs-client-provisioner-cd6ff67-sp8qd 1/1 Running 0 14s vim /etc/kubernetes/manifests/kube-apiserver.yaml
......
spec:containers:- command:- kube-apiserver- --feature-gatesRemoveSelfLinkfalse #添加这一行- --advertise-address192.168.10.10
......
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
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的状态定义的是falsepvc被删除,pv的状态将是released,可以人工调用继续使用
#如果是truepv的将是Archived,表示pv不再可用
reclaimPolicy: Delete
#定义pv的回收策略retain,另一个是delete,不支持回收
allowVolumeExpansion: true
#pv的存储空间可以动态扩缩容仅云平台。kubectl apply -f nfs-client-storageclass.yaml [rootmaster01 auto-volumn]# kubectl get storageclasses.storage.k8s.io
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-client-storageclass nfs-storage Delete Immediate true 114mvim pvc.yaml apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc
spec:accessModes:- ReadWriteManystorageClassName: nfs-client-storageclassresources:requests:storage: 2Gi
#创建一个pvc名称为nfs-pvc使用的pv属性是nfs-client-storageclass
---
apiVersion: apps/v1
kind: Deployment
metadata:labels:app: nginx1name: nginx1
spec:replicas: 3selector:matchLabels:app: nginx1template:metadata:labels:app: nginx1spec:containers:- image: nginx:1.22name: nginx1volumeMounts:- name: htmlmountPath: /usr/share/nginx/htmlvolumes:- name: htmlpersistentVolumeClaim:claimName: nfs-pvckubectl apply -f test-pvc-pod.yaml//PVC 通过 StorageClass 自动申请到空间
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs-pvc Bound pvc-7dcb826f-dbd8-4abb-8a3f-e4f669a741fd 2Gi RWX nfs-client-storageclass 55m删除
kubectl delete deployments.apps nginx1
kubectl delete pvc nfs-pvc
删除后如果是Retainpv可以保留复用 如果是Deletepv将会被直接删除
动态pv的默认策略Delete。 总结
provisioner插件-..--支持nfs
5troageclass: 定义pv的属性
动态pv的默认策略是删除。没有回收
动态pv删除pvc后的状态released
创建账号给卷插件能够在集群内部通信获取资源监听事件创建、删除、更新pv创建卷插件pod卷插件的pod插件pvstorageclass:给pv赋予属性 (pvc被删除之后pv的状态以及回收策略)创建pvc-------完成。