IT评测·应用市场-qidao123.com

标题: k8s存储卷和动态创建pv [打印本页]

作者: 伤心客    时间: 2024-12-20 04:40
标题: k8s存储卷和动态创建pv
1、kubernetes中的存储卷

1、为什么需要存储卷


2、emptyDir(临时存储卷)


  1. # 这个字段
  2. kubectl explain pod.spec.volumes.emptyDir
  3. medium # 指定emptydir卷的存储位置,Default和Memory
  4. sizeLimit # 用于指定存储卷的大小
复制代码
1、emptydir实现

  1. [root@master mnt]# cat n1.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   creationTimestamp: null
  6.   labels:
  7.     run: n1
  8.   name: n1
  9. spec:
  10.   nodeName: node1
  11.   containers:
  12.   - image: docker.io/library/nginx:latest
  13.     imagePullPolicy: IfNotPresent
  14.     name: n1
  15.     resources: {}
  16.     volumeMounts:
  17.     - name: empty
  18.       mountPath: /var/empty
  19.   volumes:
  20.   - name: empty
  21.     emptyDir: {}
  22.   dnsPolicy: ClusterFirst
  23.   restartPolicy: Always
  24. status: {}
  25. [root@master pods]# kubectl get pod n1 -o jsonpath='{.metadata.uid}'
  26. 1c580bb2-23ab-4116-9996-065fa87a03dd
  27. # 进入到/var/lib/kubelet/pods/这个目录,就可以看到临时存储挂载的目录了
复制代码
3、hostPath(节点存储卷)


1、hostPath字段

  1. [root@master mnt]# kubectl explain pod.spec.volumes.hostPath
  2. type # 字段的取值为DirectoryOCreate 如果给定的路径上面什么都不存在的话,那么就需要创建空目录,默认是这个
  3. # Directory 就是路径上面必须存在目录
复制代码
2、hostPath实现

  1. [root@master mnt]# cat n1.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5.   creationTimestamp: null
  6.   labels:
  7.     run: n1
  8.   name: n1
  9. spec:
  10.   nodeName: master
  11.   containers:
  12.   - image: docker.io/library/nginx:latest
  13.     imagePullPolicy: IfNotPresent
  14.     name: n1
  15.     resources: {}
  16.     volumeMounts:
  17.     - name: hostpath
  18.       mountPath: /var/hostpath
  19.   volumes:
  20.   - name: hostpath
  21.     hostPath:
  22.       path: /var/hostpath
  23.   dnsPolicy: ClusterFirst
  24.   restartPolicy: Always
  25. status: {}
复制代码
4、nfs(网络共享)


  1. [root@master mnt]# cat /etc/exports
  2. /mnt/nfs *(rw)
  3. [root@master mnt]# cat n1.yaml
  4. apiVersion: v1
  5. kind: Pod
  6. metadata:
  7.   creationTimestamp: null
  8.   labels:
  9.     run: n1
  10.   name: n1
  11. spec:
  12.   nodeName: master
  13.   containers:
  14.   - image: docker.io/library/nginx:latest
  15.     imagePullPolicy: IfNotPresent
  16.     name: n1
  17.     resources: {}
  18.     volumeMounts:
  19.     - name: nfs
  20.       mountPath: /var/nfs
  21.   volumes:
  22.   - name: nfs
  23.     nfs:
  24.       server: 10.104.43.227  # nfs的ip地址
  25.       path: /mnt/nfs   # nfs提供的挂载的目录
  26.   dnsPolicy: ClusterFirst
  27.   restartPolicy: Always
  28. status: {}
复制代码
2、kubernetes中的数据卷pv和pvc

1、根本先容pv和pvc


1、pv的状态

生命周期描述Available(可用)pv的创建,直接创建pv的静态方式,还没有被pvc绑定bindingpv和pvc绑定后即可Released(已开释)体现PVC被删除了,但是PV还没被回收failed(失败)体现pv自动回收失败 2、accessModes字段

访问模式描述ReadWriteOnce(rwo)读写的权限,但是只能被单个的node挂载ReadOnMany(rox)只读的,允许被多个node挂载ReadWriteMany(rwx)读写的权限,允许被多个node挂载 3、回收计谋


2、创建的pvc的思路


  1. [root@master mnt]# cat pv-pvc.yaml
  2. apiVersion: v1
  3. kind: PersistentVolume
  4. metadata:
  5.   name: pv1
  6. spec:
  7.   nfs:
  8.     path: /mnt/nfs
  9.     server: 10.104.43.227
  10.   accessModes:
  11.   - ReadWriteMany
  12.   capacity:
  13.     storage: 2Gi
  14. ---
  15. apiVersion: v1
  16. kind: PersistentVolumeClaim
  17. metadata:
  18.   name: pvc1
  19. spec:
  20.   accessModes:  # pvc的访问模式,需要与上面保持的一致即可
  21.   - ReadWriteMany
  22.   resources:  # pvc需要的大小
  23.     requests:
  24.       storage: 2Gi
  25. [root@master mnt]# cat n1.yaml
  26. apiVersion: v1
  27. kind: Pod
  28. metadata:
  29.   creationTimestamp: null
  30.   labels:
  31.     run: n1
  32.   name: n1
  33. spec:
  34.   nodeName: master
  35.   containers:
  36.   - image: docker.io/library/nginx:latest
  37.     imagePullPolicy: IfNotPresent
  38.     name: n1
  39.     resources: {}
  40.     volumeMounts:  
  41.     - name: pvc1
  42.       mountPath: /usr/share/nginx/html
  43.   volumes:
  44.   - name: pvc1
  45.     persistentVolumeClaim: # 使用pvc挂载
  46.       claimName: pvc1
  47.   dnsPolicy: ClusterFirst
  48.   restartPolicy: Always
  49. status: {}
复制代码
3、动态的创建PV


1、自动创建的思路

  1. # 因为安装这个自动创建pv的插件,也就是供应商,所以的话就需要sa和权限
复制代码

2、动态创建的实现

1、创建一个nfs服务器和账户和绑定权限

  1. # 创建一个nfs服务器
  2. [root@master mnt]# cat /etc/exports
  3. /mnt/nfs *(rw)
  4. # 这样的话,这个账户就创建出来了,并且赋予了权限
  5. [root@master pvc]# cat s1.yaml
  6. apiVersion: v1
  7. kind: ServiceAccount
  8. metadata:
  9.   creationTimestamp: null
  10.   name: s1
  11. ---
  12. apiVersion: rbac.authorization.k8s.io/v1
  13. kind: ClusterRoleBinding
  14. metadata:
  15.   name: s1-role-binding
  16. roleRef:
  17.   apiGroup: rbac.authorization.k8s.io
  18.   kind: ClusterRole
  19.   name: cluster-admin
  20. subjects:
  21. - apiGroup: ""
  22.   kind: ServiceAccount
  23.   name: s1
  24.   namespace: default
复制代码
2、创建一个供应商

  1. [root@master pvc]# cat nfs-provisioner.yaml
  2. apiVersion: apps/v1
  3. kind: Deployment
  4. metadata:
  5.   creationTimestamp: null
  6.   labels:
  7.     app: nfs-provisioner
  8.   name: nfs-provisioner
  9. spec:
  10.   replicas: 1
  11.   selector:
  12.     matchLabels:
  13.       app: nfs-provisioner
  14.   strategy: {}
  15.   template:
  16.     metadata:
  17.       creationTimestamp: null
  18.       labels:
  19.         app: nfs-provisioner
  20.     spec:
  21.       serviceAccountName: s1
  22.       containers:
  23.       - image: uhub.service.ucloud.cn/k8s-q7/nfs-subdir-external-provisioner:v4.0.0  # 供应商镜像
  24.         name: nfs-client-provisioner
  25.         imagePullPolicy: IfNotPresent
  26.         volumeMounts:
  27.         - name: nfs-client-root
  28.           mountPath: /persistentvolumes
  29.         env:
  30.         - name: PROVISIONER_NAME  # 配置provisioner的name,这个名字需要与后面创建动态类一样名字
  31.           value: nfs-storage
  32.         - name: NFS_SERVER  # 配置绑定NFS的服务器
  33.           value: 10.104.43.227
  34.         - name: NFS_PATH  # NFS服务器目录
  35.           value: /mnt/nfs
  36.       volumes:
  37.       - name: nfs-client-root
  38.         nfs:
  39.           server: 10.104.43.227
  40.           path: /mnt/nfs
复制代码
3、创建一个存储类(storage class)

  1. [root@master pvc]# cat storage.yaml
  2. apiVersion: storage.k8s.io/v1
  3. kind: StorageClass
  4. metadata:
  5.   name: storage1
  6. provisioner: nfs-storage  # 名字与provisioner的一致
  7. [root@master pvc]# kubectl get storageclasses.storage.k8s.io
  8. NAME       PROVISIONER   RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
  9. storage1   nfs-storage   Delete          Immediate           false                  9m52s
复制代码
4、创建一个pvc的pod

  1. [root@master pvc]# cat pvc1.yaml
  2. apiVersion: v1
  3. kind: PersistentVolumeClaim
  4. metadata:
  5.   name: pvc1
  6. spec:
  7.   accessModes:
  8.   - ReadWriteMany
  9.   resources:
  10.     requests:
  11.       storage: 2Gi
  12.   storageClassName: storage1
  13. [root@master pvc]# kubectl get pvc
  14. NAME   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
  15. pvc1   Bound    pvc-e4280b84-cc41-45b8-bf33-8773b18a3e9d   2Gi        RWX            storage1       9m8s
  16. [root@master pvc]# kubectl get pv
  17. NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM          STORAGECLASS   REASON   AGE
  18. pvc-e4280b84-cc41-45b8-bf33-8773b18a3e9d   2Gi        RWX            Delete           Bound    default/pvc1   storage1                9m10s
  19. # 这个nfs目录也会创建一个目录来使用
  20. [root@master nfs]# pwd
  21. /mnt/nfs
  22. [root@master nfs]# ls
  23. default-pvc1-pvc-e4280b84-cc41-45b8-bf33-8773b18a3e9d
复制代码
3、总结


  1. [root@master nfs]# kubectl get pod n1 -o jsonpath='{.metadata.uid}'
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) Powered by Discuz! X3.4