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卷插件
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