kubernetes中节约人力的动态创建PV

网友投稿 900 2022-10-12

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

kubernetes中节约人力的动态创建PV

上面介绍的PV和PVC模式是需要运维人员先创建好PV,然后开发人员定义好PVC进行一对一的Bond,但是如果PVC请求成千上万,那么就需要创建成千上万的PV,对于运维人员来说维护成本很高,Kubernetes提供一种自动创建PV的机制,叫StorageClass,它的作用就是创建PV的模板。

具体来说,StorageClass会定义一下两部分:

PV的属性 ,比如存储的大小、类型等;创建这种PV需要使用到的存储插件,比如Ceph等;

这里我们以NFS为例,要使用NFS,我们就需要一个nfs-client的自动装载程序,我们称之为Provisioner,这个程序会使用我们已经配置好的NFS服务器自动创建持久卷,也就是自动帮我们创建PV。说明:

自动创建的PV会以${namespace}-${pvcName}-${pvName}的目录格式放到NFS服务器上;如果这个PV被回收,则会以archieved-${namespace}-${pvcName}-${pvName}这样的格式存放到NFS服务器上;

详细可以参考:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client在部署之前,首先得确保有可用的NFS服务器,如果有这一步略过,如果没有可以参考一下配置。

NFS

1、安装服务

# yum install nfs-utils rpcbind -y

2、创建共享目录

# mkdir data/k8s -p

3、配置NFS配置文件

[root@master ~]# vim /etc/exports/data/k8s *(rw,sync,no_root_squash)

配置详解: ro                    只读访问  rw                   读写访问  sync                所有数据在请求时写入共享  async              NFS在写入数据前可以相应请求  secure             NFS通过1024以下的安全TCP/IP端口发送  insecure          NFS通过1024以上的端口发送  wdelay            如果多个用户要写入NFS目录,则归组写入(默认)  nowdelay      如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。  Hide                在NFS共享目录中不共享其子目录  nohide           共享NFS目录的子目录  subtreecheck   如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)  nosubtreecheck   和上面相对,不检查父目录权限  allsquash               共享文件的UID和GID映射匿名用户anonymous,适合公用目录。  noallsquash         保留共享文件的UID和GID(默认)  rootsquash             root用户的所有请求映射成如anonymous用户一样的权限(默认)  noroot_squas         root用户具有根目录的完全管理访问权限  anonuid=xxx            指定NFS服务器/etc/passwd文件中匿名用户的UID

4、启动服务先启动rpcbind,再启动nfs

[root@master ~]# systemctl start rpcbind[root@master ~]# systemctl start nfs

5、客户端安装nfs和rpcbind测试安装见第一步。

[root@node01 ~]# showmount -e 172.16.1.128Export list for 172.16.1.128:/data/k8s *

自此,NFS创建完成,下面开始StorageClass测试。

1、创建ServiceAccount,为nfs-client授权。nfs-client-sa.yaml

---apiVersion: v1kind: ServiceAccountmetadata: name: nfs-client-provisioner---apiVersion: rbac.authorization.k8s.io/v1kind: ClusterRolemetadata: name: nfs-client-provisioner-clusterrolerules: - 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/v1kind: ClusterRoleBindingmetadata: name: nfs-client-provisioner-clusterrolebindingsubjects:- kind: ServiceAccount name: nfs-client-provisioner namespace: defaultroleRef: kind: ClusterRole name: nfs-client-provisioner-clusterrole apiGroup: rbac.authorization.k8s.io

通过上面的配置,设置nfs-client对PV,PVC,StorageClass等的规则。接下来我们创建这个YAML文件:

[root@master storageclass]# kubectl apply -f nfs-client-sa.yamlserviceaccount/nfs-client-provisioner createdclusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-clusterrole createdclusterrolebinding.rbac.authorization.k8s.io/nfs-client-provisioner-clusterrolebinding created

2、创建nfs-client使用Deployment来创建nfs-client,配置如下:nfs-client.yaml

apiVersion: extensions/v1beta1kind: Deploymentmetadata: name: nfs-client-prosionerspec: replicas: 1 strategy: type: Recreate template: metadata: labels: app: nfs-client-prosioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-prosioner image: registry.cn-hangzhou.aliyuncs.com/rookieops/nfs-client-provisioner:v0.1 imagePullPolicy: IfNotPresent volumeMounts: - name: nfs-client-root mountPath: /data/pv env: - name: PROVISIONER_NAME value: rookieops/nfs - name: NFS_SERVER value: 122.51.79.172 - name: NFS_PATH value: /data/k8s/prometheus volumes: - name: nfs-client-root nfs: server: 122.51.79.172 path: /data/k8s/prometheus

然后创建这个YAML文件。

[root@master storageclass]# kubectl apply -f nfs-client.yamldeployment.extensions/nfs-client-prosioner created

查看其状态:

[root@master storageclass]# kubectl get podNAME READY STATUS RESTARTS AGEnfs-client-prosioner-66c9bb7f88-q2qm4 1/1 Running 0 52m

3、上面的创建完成后就可以创建StorageClass了。nfs-client-storageclass.yaml

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata: name: nfs-client-storageclassprovisioner: rookieops/nfs

注意provisioner必须和上面的Deployment的YAML文件中PROVISIONER_NAME的值保持一致。创建这个YAML文件:

[root@master storageclass]# kubectl apply -f nfs-client-storageclass.yamlstorageclass.storage.k8s.io/nfs-client-storageclass created[root@master storageclass]# kubectl get storageclassNAME PROVISIONER AGEnfs-client-storageclass fuseim.pri/ifs 15s

4、创建PVCtest-nfs-pvc.yaml

apiVersion: v1kind: PersistentVolumeClaimmetadata: name: test-nfs-pvc2 annotations: volume.beta.kubernetes.io/storage-class: "nfs-client-storageclass"spec: accessModes: - ReadWriteMany resources: requests: storage: 1Mi

创建这个YAML文件,观察其状态:

[root@master storageclass]# kubectl apply -f test-pvc.yamlpersistentvolumeclaim/test-nfs-pvc created[root@master storageclass]# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEtest-nfs-pvc Bound pvc-e5b8765b-1d7b-4529-860f-bbe34e0b4109 1Mi RWX nfs-client-storageclass 2m16s

我们看到该PVC自动申请到空间,其STORAGECLASS就是我们创建的nfs-client-storageclass。

5、创建一个Pod,进行测试test-pod.yaml

apiVersion: v1kind: Podmetadata: name: test-storageclass-podspec: containers: - name: busybox image: busybox:latest imagePullPolicy: IfNotPresent command: - "/bin/sh" - "-c" args: - "sleep 3600" volumeMounts: - name: nfs-pvc mountPath: /mnt restartPolicy: Never volumes: - name: nfs-pvc persistentVolumeClaim: claimName: test-nfs-pvc2

然后查看NFS服务器上是否生成对应的目录:

[root@master k8s]# lltotal 0drwxrwxrwx 2 root root 6 Oct 29 17:21 default-test-nfs-pvc2-pvc-91671ba7-8da8-4611-8bd5-3673f63d15cb

我们可以看到生成了对应的目录,格式和我们上面说的一致。现在进Pod向该目录下写一个文件,然后查看NFS服务器上是否存在该文件:

[root@master storageclass]# kubectl exec -it test-storageclass-pod -- /bin/sh/ # cd mnt//mnt # echo "hello,I am NFS Server!" > test/mnt # lstest[root@master default-test-nfs-pvc2-pvc-91671ba7-8da8-4611-8bd5-3673f63d15cb]# lstest[root@master default-test-nfs-pvc2-pvc-91671ba7-8da8-4611-8bd5-3673f63d15cb]# cat testhello,I am NFS Server!

我们发现NFS服务器上存在,说明我们验证成功。

另外我们可以看到我们这里是手动创建的一个 PVC 对象,在实际工作中,使用 StorageClass 更多的是 StatefulSet 类型的服务,StatefulSet 类型的服务我们也可以通过一个 volumeClaimTemplates 属性来直接使用 StorageClass,如下:(test-statefulset-nfs.yaml)

apiVersion: apps/v1beta1kind: StatefulSetmetadata: name: nfs-webspec: serviceName: "nginx" replicas: 2 template: metadata: labels: app: nfs-web spec: terminationGracePeriodSeconds: 10 containers: - name: nginx image: nginx:1.7.9 imagePullPolicy: IfNotPresent ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www annotations: volume.beta.kubernetes.io/storage-class: nfs-client-storageclass spec: accessModes: [ "ReadWriteOnce" ] resources: requests: storage: 1Gi

可以看到volumeClaimTemplates就是我们上面的PVC模板。然后我们创建这个文件:

[root@master storageclass]# kubectl apply -f test-statefulset.yamlstatefulset.apps/nfs-web created[root@master storageclass]# kubectl get pvcNAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEwww-nfs-web-0 Bound pvc-5df69dbe-8b54-45dd-acd0-769c0c9ee1b8 1Gi RWO nfs-client-storageclass 7swww-nfs-web-1 Bound pvc-0e83fef9-ec16-4e02-8482-7e04b7c81c92 1Gi RWO nfs-client-storageclass 3s

可以看到会自动生成两个PVC。

在NFS服务器上也可以看到正常创建了目录:

[root@master k8s]# lltotal 0drwxrwxrwx 2 root root 18 Oct 29 17:29 default-test-nfs-pvc2-pvc-91671ba7-8da8-4611-8bd5-3673f63d15cbdrwxrwxrwx 2 root root 6 Oct 29 17:34 default-www-nfs-web-0-pvc-5df69dbe-8b54-45dd-acd0-769c0c9ee1b8drwxrwxrwx 2 root root 6 Oct 29 17:34 default-www-nfs-web-1-pvc-0e83fef9-ec16-4e02-8482-7e04b7c81c92

-----------------------

知乎: 乔边故事

头条号:乔边故事

只要脸皮够厚,整个世界都将被你踩在脚下。

-----------------------

温馨提示如果你喜欢本文,请分享到朋友圈,想要获得更多信息,请关注我。

上一篇:TiDB 「能量钛」 线上圆桌论坛来袭! 当数据库遇上 Kubernetes
下一篇:全球运维大会纪实:Oracle DevOps最佳实践与经验分享
相关文章

 发表评论

暂时没有评论,来抢沙发吧~