Kubernetes 持久化数据存储 StorageClass

白日放歌须纵酒,青春作伴好还乡。这篇文章主要讲述Kubernetes 持久化数据存储 StorageClass相关的知识,希望能为你提供帮助。
https://www.cnsre.cn/posts/210903445142/
PVPVC 模式要先创建好 PV,然后再定义好 PVC 进行一对一的绑定。那么如果遇到大集群,也一一的创建吗?这样来说维护成本很高,工作量大。这个时候就有了 Kubernetes 提供一种自动创建 PV 的机制,叫 StorageClass ,它的作用就是创建 PV 的模板。
StorageClass 会定义两部分:

  • PV的属性:
    比如存储的大小、类型等
  • PV需要使用到的存储插件
    比如Ceph等;
有了这两部分信息,Kubernetes 就能够根据用户提交的 PVC ,找到对应的 StorageClass ,然后 Kubernetes 就会调用 StorageClass 声明的存储插件,自动创建 PV
不过要使用 NFS ,我们就需要一个 nfs-client 的插件。这个插件会使 NFS 服务自动帮我们创建 PV
自动创建的 PV会以 ${namespace}-${pvcName}-${pvName} 的格式存储
如果 PV 被回收,则会以 archieved-${namespace}-${pvcName}-${pvName} 的格式存储
详细可以参考 Github
PV、PVC、NFS不再介绍,没有完成的请查看 kubernetes使用PV和PVC管理数据存储
创建ServiceAccount创建 ServiceAccount 的目的是为了给 nfs-client 授权。
# 下载 rbac.yaml wget https://github.com/kubernetes-retired/external-storage/blob/201f40d78a9d3fd57d8a441cfc326988d88f35ec/nfs-client/deploy/rbac.yaml

部署 rbac.yaml
kubectlapply-frbac.yaml # 输出如下 serviceaccount/nfs-client-provisioner created clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created

创建 nfs-client使用 Deployment 来创建 nfs-client
# 下载 deployment.yaml wget https://github.com/kubernetes-retired/external-storage/blob/201f40d78a9d3fd57d8a441cfc326988d88f35ec/nfs-client/deploy/deployment.yaml

修改 yaml 如下
apiVersion: apps/v1 kind: Deployment metadata: name: nfs-client-provisioner labels: app: nfs-client-provisioner # replace with namespace where provisioner is deployed namespace: default spec: replicas: 1 strategy: type: Recreate selector: matchLabels: app: nfs-client-provisioner template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: quay.io/external_storage/nfs-client-provisioner:latest volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: fuseim.pri/ifs# 这里的供应者名称必须和class.yaml中的provisioner的名称一致,否则部署不成功 - name: NFS_SERVER value: 10.0.10.51# 这里写NFS服务器的IP地址或者能解析到的主机名 - name: NFS_PATH value: /home/bsh/nfs# 这里写NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending) volumes: - name: nfs-client-root nfs: server: 10.0.10.51# NFS服务器的IP或可解析到的主机名 path: /home/bsh/nfs# NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)

?? 注意
value: fuseim.pri/ifs# 这里的供应者名称必须和 class.yaml 中的 provisioner 的名称一致,否则部署不成功
创建检查
# 部署 nfs-client kubectlapply-fdeployment.yaml # 输出如下 deployment.apps/nfs-client-provisioner created

查看pod
kubectl get pod # 输出如下 NAMEREADYSTATUSRESTARTSAGE nfs-client-provisioner-fd74f99b4-wr58j1/1Running130s

创建 StorageClassclass.yaml 内容比较少,可以不用下载,具体内容如下
class.yaml 下载地址
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: managed-nfs-storage provisioner: fuseim.pri/ifs # or choose another name, must match deployment\'s env PROVISIONER_NAME\' parameters: archiveOnDelete: "false"

?? 注意
provisioner 必须和上面得 Deployment 的 YAML 文件中 PROVISIONER_NAME 的值保持一致。
创建 storageclass
# 创建 kubectlapply-fclass.yaml # 输出如下 storageclass.storage.k8s.io/managed-nfs-storage created

查看状态
kubectl get storageclass # 输出如下 NAMEPROVISIONERRECLAIMPOLICYVOLUMEBINDINGMODEALLOWVOLUMEEXPANSIONAGE managed-nfs-storagefuseim.pri/ifsDeleteImmediatefalse53s

创建 PVC创建 tomcat-storageclass-pvc.yaml
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: tomcat annotations: volume.beta.kubernetes.io/storage-class: "managed-nfs-storage" spec: accessModes: - ReadWriteMany resources: requests: storage: 500Mi

部署 yaml
kubectlapply-f tomcat-storageclass-pvc.yaml # 输出如下 persistentvolumeclaim/tomcat created

查看状态
kubectl get pvc # 输出如下 NAMESTATUSVOLUMECAPACITYACCESS MODESSTORAGECLASSAGE tomcatBoundpvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec500MiRWXmanaged-nfs-storage48s

pod 使用添加 pvc【Kubernetes 持久化数据存储 StorageClass】还拿之前的 tomcat 做实验,我们把 tomcat 目录下的 logs 拿到本地 nfs 中。
?? 注意
如果遇到使用PVC 创建 pod 的时候发现无法创建成功。出现一下报错的时候请参考 kubernetes 使用 PCV 创建 pod 报错 persistentvolume-controller waiting for a volume to be created
Kubernetes 持久化数据存储 StorageClass

文章图片

具体 yaml 如下:
apiVersion: apps/v1 kind: Deployment metadata: name: tomcat-deployment labels: app: tomcat spec: replicas: 3 selector: matchLabels: app: tomcat minReadySeconds: 1 progressDeadlineSeconds: 60 revisionHistoryLimit: 2 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 1 template: metadata: labels: app: tomcat spec: containers: - name: tomcat image: wenlongxue/tomcat:tomcat-demo-62-123xw2 imagePullPolicy: Always ports: - containerPort: 8080 resources: requests: memory: "2Gi" cpu: "80m" limits: memory: "2Gi" cpu: "80m" readinessProbe: httpGet: path: / port: 8080 initialDelaySeconds: 180 periodSeconds: 5 timeoutSeconds: 3 successThreshold: 1 failureThreshold: 30 volumeMounts: - mountPath: "/usr/local/tomcat/logs" name: tomcat # pvc 部分 volumes: - name: tomcat persistentVolumeClaim: claimName: tomcat --- # Service 服务部分 apiVersion: v1 kind: Service metadata: name: tomcat-service labels: app: tomcat spec: selector: app: tomcat ports: - name: tomcat-port protocol: TCP port: 8080 targetPort: 8080 type: ClusterIP --- # ingress 服务部分 apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tomcat annotations: kubernetes.io/ingress.class: "nginx" spec: tls: - hosts: - tomcat.cnsre.cn secretName: tls-secret rules: - host: tomcat.cnsre.cn http: paths: - path: "/" pathType: Prefix backend: service: name: tomcat-service port: number: 8080

部署 pod 服务
kubectlapply-f tomcatc.yaml # 输出如下 deployment.apps/tomcat-deployment created

查看状态
kubectl get pod # 输出如下 NAMEREADYSTATUSRESTARTSAGE nfs-client-provisioner-fd74f99b4-wr58j1/1Running076m tomcat-deployment-7588b5c8fd-cnwvt1/1Running059m tomcat-deployment-7588b5c8fd-kl8fj1/1Running059m tomcat-deployment-7588b5c8fd-ksbg91/1Running059m

查看 PV PVC
[root@master tomccat]# kubectlgetpv,pvc NAMECAPACITYACCESS MODESRECLAIM POLICYSTATUSCLAIMSTORAGECLASSREASONAGE persistentvolume/pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec500MiRWXDeleteBounddefault/tomcatmanaged-nfs-storage65mNAMESTATUSVOLUMECAPACITYACCESS MODESSTORAGECLASSAGE persistentvolumeclaim/tomcatBoundpvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec500MiRWXmanaged-nfs-storage65m

查看 nfs server 目录中信息
[root@node1 ~]# ll /home/bsh/nfs/default-tomcat-pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec/ 总用量 220 -rw-r-----. 1 root root22217 9月3 14:49 catalina.2021-09-03.log -rw-r-----. 1 root root0 9月3 14:41 host-manager.2021-09-03.log -rw-r-----. 1 root root2791 9月3 14:49 localhost.2021-09-03.log -rw-r-----. 1 root root 118428 9月3 15:31 localhost_access_log.2021-09-03.txt -rw-r-----. 1 root root0 9月3 14:41 manager.2021-09-03.log

文章链接

    推荐阅读