存储卷:
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
在随便一个节点上添加:
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
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的路径
更好的实现资源对象的查找和引用
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
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
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-------完成