Kubernetes 持久化数据存储 StorageClass
发布日期:2022-02-28 11:06:00
浏览次数:6
分类:技术文章
本文共 7901 字,大约阅读时间需要 26 分钟。
PV
和 PVC
模式要先创建好 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
内容比较少,可以不用下载,具体内容如下
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 的时候发现无法创建成功。出现一下报错的时候请参考具体 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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月12日 14时15分43秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
go-递归实现二叉树的三种排序方式(前序、中序、后序)【详细】
2019-04-27
LeetCode-409. 最长回文串(Goland实现)
2019-04-27
LeetCode-LCP 18. 早餐组合(Goland实现)
2019-04-27
C++从入门到进阶近100本书推荐电子书pdf
2019-04-28
蓝桥杯 - [2014年第五届真题]分糖果(模拟)
2019-04-28
蓝桥杯 - [2013年第四届真题]大臣的旅费(DFS)
2019-04-28
蓝桥杯 - [2013年第四届真题]带分数(全排列)
2019-04-28
蓝桥杯 - [2013年第四届真题]幸运数(模拟)
2019-04-28
蓝桥杯 - [2013年第四届真题]横向打印二叉树(排序二叉树)
2019-04-28
蓝桥杯 - [历届试题]网络寻路(枚举)
2019-04-28
牛客网 - [中南林业科技大学第十一届程序设计大赛]兑换零钱(背包问题)
2019-04-28
HDU - Robberies(01背包)
2019-04-28
HDU - 最大报销额(01背包|贪心)
2019-04-28
HDU - Coins(完全背包)
2019-04-28
JXFCZX — 砝码称重1(DFS+背包)
2019-04-28
JXFCZX — 质数和分解(完全背包)
2019-04-28
JXFCZX — 花店橱窗(动态规划)
2019-04-28
JXFCZX — 逃亡的准备(多重背包)
2019-04-28
JXFCZX — 庆功会(多重背包)
2019-04-28
AcWing - 扩展欧几里得算法(扩欧)
2019-04-28