Kubernetes 持久化数据存储 StorageClass
发布日期:2022-02-28 11:06:00 浏览次数:6 分类:技术文章

本文共 7901 字,大约阅读时间需要 26 分钟。

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} 的格式存储
详细可以参考
PV、PVC、NFS不再介绍,没有完成的请查看

创建ServiceAccount

创建 ServiceAccount 的目的是为了给 nfs-client 授权。

# 下载 rbac.yamlwget https://github.com/kubernetes-retired/external-storage/blob/201f40d78a9d3fd57d8a441cfc326988d88f35ec/nfs-client/deploy/rbac.yaml

部署 rbac.yaml

kubectl  apply  -f   rbac.yaml # 输出如下serviceaccount/nfs-client-provisioner createdclusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner createdclusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner createdrole.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner createdrolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created

创建 nfs-client

使用 Deployment 来创建 nfs-client

# 下载 deployment.yamlwget https://github.com/kubernetes-retired/external-storage/blob/201f40d78a9d3fd57d8a441cfc326988d88f35ec/nfs-client/deploy/deployment.yaml

修改 yaml 如下

apiVersion: apps/v1kind: Deploymentmetadata:  name: nfs-client-provisioner  labels:    app: nfs-client-provisioner  # replace with namespace where provisioner is deployed  namespace: defaultspec:  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-clientkubectl  apply  -f   deployment.yaml# 输出如下deployment.apps/nfs-client-provisioner created

查看pod

kubectl get pod# 输出如下NAME                                     READY   STATUS    RESTARTS   AGEnfs-client-provisioner-fd74f99b4-wr58j   1/1     Running   1          30s

创建 StorageClass

class.yaml 内容比较少,可以不用下载,具体内容如下

class.yaml

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  name: managed-nfs-storageprovisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'parameters:  archiveOnDelete: "false"

⚠️ 注意

provisioner 必须和上面得 Deployment 的 YAML 文件中 PROVISIONER_NAME 的值保持一致。

创建 storageclass

# 创建 kubectl  apply  -f  class.yaml # 输出如下storageclass.storage.k8s.io/managed-nfs-storage created

查看状态

kubectl get storageclass# 输出如下NAME                  PROVISIONER      RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGEmanaged-nfs-storage   fuseim.pri/ifs   Delete          Immediate           false                  53s

创建 PVC

创建 tomcat-storageclass-pvc.yaml

kind: PersistentVolumeClaimapiVersion: v1metadata:  name: tomcat  annotations:    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"spec:  accessModes:    - ReadWriteMany  resources:    requests:      storage: 500Mi

部署 yaml

kubectl  apply  -f tomcat-storageclass-pvc.yaml# 输出如下persistentvolumeclaim/tomcat created

查看状态

kubectl get pvc# 输出如下NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGEtomcat       Bound    pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec   500Mi      RWX            managed-nfs-storage   48s

pod 使用添加 pvc

还拿之前的 tomcat 做实验,我们把 tomcat 目录下的 logs 拿到本地 nfs 中。

⚠️ 注意

如果遇到使用PVC 创建 pod 的时候发现无法创建成功。出现一下报错的时候请参考
cnsre运维博客|Linux运维|自动化运维|云计算|运维监控

具体 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: v1kind: Servicemetadata:        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/v1kind: Ingressmetadata:  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 服务

kubectl  apply  -f tomcatc.yaml# 输出如下deployment.apps/tomcat-deployment created

查看状态

kubectl get pod# 输出如下NAME                                     READY   STATUS    RESTARTS   AGEnfs-client-provisioner-fd74f99b4-wr58j   1/1     Running   0          76mtomcat-deployment-7588b5c8fd-cnwvt       1/1     Running   0          59mtomcat-deployment-7588b5c8fd-kl8fj       1/1     Running   0          59mtomcat-deployment-7588b5c8fd-ksbg9       1/1     Running   0          59m

查看 PV PVC

[root@master tomccat]# kubectl  get  pv,pvcNAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM            STORAGECLASS          REASON   AGEpersistentvolume/pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec   500Mi      RWX            Delete           Bound    default/tomcat   managed-nfs-storage            65mNAME                           STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGEpersistentvolumeclaim/tomcat   Bound    pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec   500Mi      RWX            managed-nfs-storage   65m

查看 nfs server 目录中信息

[root@node1 ~]# ll /home/bsh/nfs/default-tomcat-pvc-d35c82e3-29f3-4f6d-b25d-3ccdd365d1ec/总用量 220-rw-r-----. 1 root root  22217 9月   3 14:49 catalina.2021-09-03.log-rw-r-----. 1 root root      0 9月   3 14:41 host-manager.2021-09-03.log-rw-r-----. 1 root root   2791 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 root      0 9月   3 14:41 manager.2021-09-03.log

转载地址:https://blog.csdn.net/weixin_47430049/article/details/120175735 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:kubernetes 使用 PV 和 PVC 管理数据存储
下一篇:kube-eventer事件监控

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月12日 14时15分43秒