ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【Kubernetes存储篇】StorageClass存储类动态生成PV详解 [打印本页]

作者: 去皮卡多    时间: 2024-2-7 08:58
标题: 【Kubernetes存储篇】StorageClass存储类动态生成PV详解
一、StorageClass存储类理论
StorageClass的作用主要有以下几个方面:
动态存储卷分配:StorageClass可以根据定义的属性动态地创建存储卷,无需手动创建和管理存储卷。
存储卷的属性管理:StorageClass可以定义存储卷的属性,如存储类型、存储容量、访问模式等,从而更好地满足应用程序的存储需求。
存储资源的管理:StorageClass可以将存储资源进行分类管理,方便开发者根据应用程序的需求进行选择。
每个 StorageClass 都有一个供应商(Provisioner),用来决定使用哪个卷插件制备 PV。 该字段必须指定,官网提供供应商如下表:

 
本文章以NFS为例,要想使用NFS,我们需要一个nfs-client的自动装载程序,称之为provisioner,这个程序会使用我们已经配置好的NFS服务器自动创建持久卷,也就是自动帮我们创建PV。
二、案例:Storageclass存储类实战演示
1、搭建NFS服务端
注意:K8S集群所有Node节点都需要安装 nfs-utils 包
  1. yum -y install nfs-utils
  2. mkdir /data/nfs_pro -p
  3. vim /etc/exports
  4. /data/test  *(rw,sync,no_root_squash)
复制代码
加载生效 && 启动NFS服务
  1. exportfs -arv
  2. systemctl enable nfs --now
复制代码
  
2、搭建NFS供应商(provisioner)

第一步:创建运行nfs-provisioner需要使用的SA账号
  1. [root@Master testv2]# more 00-nfs-provisioner.yaml
  2. ---
  3. apiVersion: v1
  4. kind: ServiceAccount
  5. metadata:
  6.   name: nfs-nginx
复制代码
执行 YAML 文件 && 查看创建的 SA 账号:
  1. kubectl apply -f 00-nfs-provisioner.yaml
  2. kubectl get sa nfs-nginx
复制代码
  1. kubectl get sa nfs-nginx
  2. NAME        SECRETS   AGE
  3. nfs-nginx   1         18h
复制代码
第二步:针对SA账号进行授权:
  1. kubectl create clusterrolebinding nfs-nginx --clusterrole=cluster-admin --serviceaccount=default:nfs-nginx
复制代码
第三步:安装01-nfs-deployment.yaml程序 YAML 如下:
  1. cat 01-nfs-deployment.yaml
  2. ---
  3. kind: Deployment
  4. apiVersion: apps/v1
  5. metadata:
  6.   name: nfs-nginx
  7. spec:
  8.   selector:
  9.     matchLabels:
  10.        app: nfs-nginx
  11.   replicas: 3
  12.   strategy:        # 更新策略
  13.     type: Recreate
  14.   template:
  15.     metadata:
  16.       labels:
  17.         app: nfs-nginx
  18.     spec:
  19.       serviceAccount: nfs-nginx   # 指定SA账号
  20.       containers:
  21.         - name: nfs-nginx
  22.           image: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0
  23.           imagePullPolicy: IfNotPresent
  24.           volumeMounts:
  25.             - name: nfs-client-root
  26.               mountPath: /persistentvolumes
  27.           env:
  28.             - name: PROVISIONER_NAME
  29.               value: example.com/nfs-nginx     # NFS供应商名称
  30.             - name: NFS_SERVER
  31.               value: 172.16.42.5         # NFS服务端地址
  32.             - name: NFS_PATH            
  33.               value: /data/test/      # NFS共享目录
  34.       volumes:
  35.         - name: nfs-client-root
  36.           nfs:
  37.             server: 172.16.42.5          # NFS服务端地址
  38.             path: /data/test/          # NFS共享目录
复制代码
执行YAML 文件 && 查看 Pod状态:
  1. kubectl apply -f  01-nfs-deployment.yaml
  2. deployment.apps/nfs-nginx unchanged
复制代码
  1. kubectl get pods
  2. NAME                        READY   STATUS    RESTARTS   AGE
  3. nfs-nginx-97f96446d-6ng62   1/1     Running   0          3s
  4. nfs-nginx-97f96446d-9kf6x   1/1     Running   0          3s
  5. nfs-nginx-97f96446d-cbbz9   1/1     Running   0          3s
复制代码
3、创建StorageClass存储类
  1. cat 02-nfs-storageclass.yaml
  2. ---
  3. kind: StorageClass
  4. apiVersion: storage.k8s.io/v1
  5. metadata:
  6.   name: nfs-nginx
  7. provisioner: example.com/nfs-nginx   # 指定NFS供应商名称,和上面对应上
复制代码
注意:provisioner处写的 example.com/nfs应该跟安装01-nfs-deployment.yaml时候的env下的PROVISIONER_NAME的value值保持一致。
执行YAML文件 && 查看storageclass 状态:
  1. kubectl apply -f 02-nfs-storageclass.yaml
  2. kubectl get sc nfs-nginx
复制代码
  1. kubectl get sc nfs-nginx
  2. NAME        PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  3. nfs-nginx   example.com/nfs-nginx   Delete          Immediate           false                  18h
复制代码
 
4、创建PVC,通过StorageClass动态生成PV
  1. cat 03-nfs-pvc.yaml
  2. ---
  3. kind: PersistentVolumeClaim
  4. apiVersion: v1
  5. metadata:
  6.   name: nfs-nginx
  7. spec:
  8.   accessModes:  ["ReadWriteMany"]
  9.   resources:
  10.     requests:
  11.       storage: 6Gi
  12.   storageClassName:  nfs-nginx   # 指定使用storageclass的名称,来自动生产PV
复制代码
执行YAML 文件 && 查看是否自动生成PV
  1. kubectl apply -f 03-nfs-pvc.yaml
  2. kubectl get pvc
复制代码
 
  1. [root@Master testv2]# kubectl apply -f 03-nfs-pvc.yaml
  2. persistentvolumeclaim/nfs-nginx unchanged
  3. [root@Master testv2]# kubectl get pvc nfs-nginx
  4. NAME        STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  5. nfs-nginx   Bound    pvc-770e8d47-5cbf-4115-87ea-bbcc8551b993   6Gi        RWX            nfs-nginx      18h
复制代码
如上图已经自动创建PV,并绑定上PVC了
5、创建Pod挂载PVC
  1. cat 04-nfs-pod-demo.yaml
  2. ---
  3. apiVersion: v1
  4. kind: Pod
  5. metadata:
  6.   name: nfs-nginx
  7.   labels:
  8.     type: nfs-v1
  9. spec:
  10.   volumes:
  11.   - persistentVolumeClaim:
  12.       claimName: nfs-nginx   # 指定PVC
  13.     name: nfs-nginx                   # 卷名称
  14.   containers:
  15.   - name: nfs-nginx-demo
  16.     image: nginx:latest
  17.     imagePullPolicy: IfNotPresent
  18.     volumeMounts:
  19.     - name: nfs-nginx                # 指定上面卷名称
  20.       mountPath: /usr/share/nginx/html  # 容器挂载目录
复制代码
执行 YAML 文件 && 查看Pod状态:
  1. kubectl apply -f 04-nfs-pod-demo.yaml
  2. ubectl get pods nfs-nginx -o wide --show-labels
复制代码
 
  1. [root@Master testv2]# kubectl apply -f 04-nfs-pod-demo.yaml
  2. pod/nfs-nginx configured
  3. [root@Master testv2]# kubectl get pods nfs-nginx -o wide --show-labels
  4. NAME        READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES   LABELS
  5. nfs-nginx   1/1     Running   0          18h   10.244.1.99   node1   <none>           <none>            type=nfs-v1
复制代码
在 PVC 绑定宿主机目录,创建 index.html 文件
  1. echo "storageclass demo successd...." > /data/test/default-storageclass-pvc-demo-pvc-6b213e25-12a2-4ffd-a1ff-af23ec531233/index.html
复制代码
 
获取Pod IP访问网站:
  1. kubectl get pods nfs-nginx -o wide
复制代码
 
  1. [root@Master testv2]# kubectl get pods nfs-nginx -o wide
  2. NAME        READY   STATUS    RESTARTS   AGE   IP            NODE    NOMINATED NODE   READINESS GATES
  3. nfs-nginx   1/1     Running   0          18h   10.244.1.99   node1   <none>           <none>
  4. [root@Master testv2]# curl 10.244.1.99
  5. storageclass demo successd....
复制代码
 
三、步骤总结
1、搭建NFS服务端
2、搭建NFS供应商,指定NFS服务端IP地址及共享目录
3、创建StorageClass资源,指定使用NFS供应商
4、创建PVC,使用storageClassName 自动指定使用StorageClass
5、创建Pod,使用PVC
-------------------------------------------------------------------------------------
Dockerfile 镜像构建
1、准备 tomcat  jdk 包
  1. apache-tomcat-10.1.16.tar.gz
  2. dockerfile  
  3. jdk-11.0.21_linux-x64_bin.tar.gz
复制代码
  1. # Centos7 image
  2. # VERSION 2
  3. # Author:  sixmillions
  4. # 指定基于的容器镜像
  5. FROM centos:7
  6. # 维护者信息
  7. MAINTAINER sixmillions
  8. # 镜像的操作指令
  9. # 设置时间
  10. RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
  11.   && echo 'Asia/Shanghai' >/etc/timezone
  12. # 指定jdk1.8
  13. add jdk-11.0.21_linux-x64_bin.tar.gz /usr/local/
  14. add apache-tomcat-10.1.16.tar.gz /usr/local/
  15. # RUN rm -f /usr/local/apache-tomcat-8.5.34/webapps/ROOT/favicon.ico
  16. RUN mkdir -p /data &&  mv /usr/local/apache-tomcat-10.1.16 /usr/local/tomcat
  17. env JAVA_HOME=/usr/local/jdk-11.0.21
  18. env PATH=${JAVA_HOME}/bin:$PATH
  19. env LC_ALL=en_US.UTF-8
  20. # 一会我们做pv存储,直接将webapps目录映射出来.
  21. # ADD helloworld.war /usr/local/apache-tomcat-8.5.34/webapps/
  22. # RUN chmod +x /usr/local/apache-tomcat-7.0.68/bin/*
  23. expose 8080
  24. # 容器启动时执行指令
  25. ENTRYPOINT [ "/usr/local/tomcat/bin/catalina.sh", "run" ]
复制代码
打包基础镜像
  1. docker build -t helloworldtomcat8 .
复制代码
  1. [root@Master dockerfile]# docker images hellowoldtomcat8
  2. REPOSITORY         TAG       IMAGE ID       CREATED        SIZE
  3. hellowoldtomcat8   latest    e13125a33897   18 hours ago   520MB
复制代码
3. 上传到私有仓库

将打包好的镜像上传到私有仓库,方便其他节点获取
master节点
  1. # 改个名字
  2. docker tag  hellowoldtomcat8 101.43.xxx.xxx:8888/test/helloworldtomcat8:latest
  3. # 上传
  4. docker push 101.43.196.155:8888/test/helloworldtomcat8
复制代码
 
node节点

下载镜像
  1. docker pull 101.43.196.155:8888/test/helloworldtomcat8
复制代码
  
四、使用 StorageClass 创建 tomcat logs webapp 存储
1、创建 tomcat-logs-pvc
  1. cat 03-nfs-tomcat-logs-pvc.yaml
  2. ---
  3. kind: PersistentVolumeClaim
  4. apiVersion: v1
  5. metadata:
  6.   name: nfs-tomcat-logs
  7. spec:
  8.   accessModes:  ["ReadWriteMany"]
  9.   resources:
  10.     requests:
  11.       storage: 7Gi
  12.   storageClassName:  nfs-nginx   # 指定使用storageclass的名称,来自动生产PV
复制代码
 
查看tomcat-logs-pvc 创建
  1. kubectl get pvc nfs-tomcat-logs
  2. NAME              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  3. nfs-tomcat-logs   Bound    pvc-618a8eaf-e798-4b03-b2c6-9b146eb6d792   7Gi        RWX            nfs-nginx      17h
复制代码
1、创建 tomcat-webapp-pvc
  1. cat 03-nfs-tomcat-webapp-pvc.yaml
  2. ---
  3. kind: PersistentVolumeClaim
  4. apiVersion: v1
  5. metadata:
  6.   name: nfs-tomcat-webapp
  7. spec:
  8.   accessModes:  ["ReadWriteMany"]
  9.   resources:
  10.     requests:
  11.       storage: 7Gi
  12.   storageClassName:  nfs-nginx   # 指定使用storageclass的名称,来自动生产PV
复制代码
 
查看tomcat-webapp pvc 创建
  1. [root@Master tomcat]# kubectl apply -f 03-nfs-tomcat-webapp-pvc.yaml
  2. persistentvolumeclaim/nfs-tomcat-webapp unchanged
  3. [root@Master tomcat]# kubectl get pvc nfs-tomcat-webapp
  4. NAME                STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  5. nfs-tomcat-webapp   Bound    pvc-0b0f9b13-1bf0-46ff-8ce5-a95ec8a6dedd   7Gi        RWX            nfs-nginx      17h
复制代码
 
创建 tomcat demo
  1. cat 04-nfs-pod-demo.yaml
  2. apiVersion: apps/v1
  3. kind: DaemonSet
  4. metadata:
  5.   name: tomcattest
  6. spec:
  7.   selector:
  8.     matchLabels:
  9.       app: tomcattest
  10.   template:
  11.     metadata:
  12.       labels:
  13.         app: tomcattest
  14.     spec:
  15.       containers:
  16.         - name: tomcattest
  17.           image: 101.43.196.155:8888/test/helloworldtomcat8
  18.           imagePullPolicy: Always
  19.           ports:
  20.             - containerPort: 8080
  21.           volumeMounts:
  22.             - name: logs
  23.               mountPath: /usr/local/tomcat/logs
  24.             - name: webapps
  25.               mountPath: /usr/local/tomcat/webapps
  26.       volumes:
  27.         - name: logs
  28.           persistentVolumeClaim:
  29.             claimName: nfs-tomcat-logs
  30.         - name: webapps
  31.           persistentVolumeClaim:
  32.             claimName: nfs-tomcat-webapp
复制代码
  
查看创建结果
  1. [root@Master tomcat]# kubectl apply -f 05-nfs-pod-demo.yaml
  2. daemonset.apps/tomcattest unchanged
  3. [root@Master tomcat]# kubectl get pods
  4. NAME                        READY   STATUS    RESTARTS   AGE
  5. tomcattest-8rcbl            1/1     Running   0          17h
  6. tomcattest-9mv7p            1/1     Running   0          17h
  7. tomcattest-qwgmm            1/1     Running   0          17h
复制代码
 
2.

构建service 编写yaml文件
  1. cat 06-tomcat-svc.yaml
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5.   name: tomcattest-service
  6. spec:
  7.   type: NodePort
  8.   ports:
  9.   - port: 8080
  10.     name: tomcat
  11.     targetPort: 8080
  12.     nodePort: 32012
  13.     protocol: TCP
  14.   selector:
  15.     app: tomcattest
复制代码
构建Service
  1. kubectl apply -f 06-tomcat-svc.yaml
  2. service/tomcattest-service unchanged
复制代码
 
  1. [root@Master tomcat]# ifconfig eth0
  2. eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
  3.         inet 172.16.42.3  netmask 255.255.255.0  broadcast 172.16.42.255
  4.         inet6 fe80::216:3eff:fe08:a149  prefixlen 64  scopeid 0x20<link>
  5.         ether 00:16:3e:08:a1:49  txqueuelen 1000  (Ethernet)
  6.         RX packets 26297104  bytes 8933567314 (8.3 GiB)
  7.         RX errors 0  dropped 0  overruns 0  frame 0
  8.         TX packets 20506729  bytes 14593454145 (13.5 GiB)
  9.         TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  10. [root@Master tomcat]# curl 172.16.42.3:32012
  11. <!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title></head><body><h1>HTTP Status 404 – Not Found</h1><hr class="line" /><p><b>Type</b> Status Report</p><p><b>Description</b> The origin server did not find a current representation for the target resource or is not willing to disclose that one exists.</p><hr class="line" /><h3>Apache Tomcat/10.1.16</h3></body></html>[root@Master tomcat]#
复制代码
 
测试

增加一个界面在映射文件
  1. root@Node2 helloworld]# pwd
  2. /data/test/default-nfs-tomcat-webapp-pvc-0b0f9b13-1bf0-46ff-8ce5-a95ec8a6dedd/helloworld
  3. [root@Node2 helloworld]# cat index.html
  4. k8s-homework-successful!
复制代码
  1. [root@Master tomcat]# curl 172.16.42.3:32012/helloworld/index.html
  2. k8s-homework-successful!
复制代码
  
 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4