ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

理解 Kubernetes volume 和 共享存储

2021-05-14 02:04:13  阅读:221  来源: 互联网

标签:node csi name Kubernetes volume PVC 共享 k8s



1. Kubernetes volume

文章 介绍了 Docker volume。与 docker volume 类似的,在 kubernetes 中存在 Pod 级别的 volume,Pod 的 container 可共享 volume,不同 Pod 可以共享同一 volume。

首先看一看单机上的 volume 类型 emptyDir 和 hostPath。

1.1 emptyDir volume

emptyDir volume 将 node 上的目录挂载到容器中,容器对该目录的读写将映射到 node 上。创建 emptyDir volume 类型的 Pod:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpd
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web_server
  template:
    metadata:
      labels:
        app: web_server
    spec:
      volumes:
      - name: logs
        emptyDir: {}
      containers:
      - name: httpd-chunqiu
        image: docker.io/jocatalin/kubernetes-bootcamp:v1
        volumeMounts:
          - name: logs
            mountPath: /mnt/log

创建了一个名为 logs 的 emptyDir volume,并将该 volume 映射到 node 上的 /mnt/log 目录。查看容器信息:

[root@k8s-master-node-1 kubernetes]# kubectl get pods -o wide
NAME                        READY   STATUS    RESTARTS   AGE    IP          NODE                          NOMINATED NODE   READINESS GATES
httpd-6b55656b88-2xdsf      1/1     Running   0          18m    10.40.0.3   k8s-worker-node-1.novalocal   <none>           <none>
httpd-6b55656b88-7mfzc      1/1     Running   0          18m    10.32.0.4   k8s-worker-node-2.novalocal   <none>           <none>

部署的两个 Pod 分别建在 node1 和 node2 上,根据前面 emptyDir volume 的描述,两个 pod 应该是使用不同 node 上的 volume 目录。登陆到 node 上查看 volume 详情:

// 登陆到 node1
[root@k8s-master-node-1 centos]# kubectl exec -it httpd-6b55656b88-2xdsf /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@httpd-6b55656b88-2xdsf:/mnt/log# touch node1

[root@k8s-worker-node-1 centos]# docker inspect 769ed953f27d
{
                "Type": "bind",
                "Source": "/var/lib/kubelet/pods/aa5e141d-2999-4b13-8641-270d6fe13023/volumes/kubernetes.io~empty-dir/logs",
                "Destination": "/mnt/log",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
...

[root@k8s-worker-node-1 logs]# ls /var/lib/kubelet/pods/aa5e141d-2999-4b13-8641-270d6fe13023/volumes/kubernetes.io~empty-dir/logs
node1

// 登陆到 node2
[root@k8s-master-node-1 centos]# kubectl exec -it httpd-6b55656b88-7mfzc /bin/bash
root@httpd-6b55656b88-7mfzc:/mnt/log# touch node2

[root@k8s-worker-node-2 centos]# docker inspect 7944a981a7f4
{
                "Type": "bind",
                "Source": "/var/lib/kubelet/pods/bceba261-210d-465d-9774-15ba1a22dbe1/volumes/kubernetes.io~empty-dir/logs",
                "Destination": "/mnt/log",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
...

[root@k8s-worker-node-2 logs]# ls /var/lib/kubelet/pods/bceba261-210d-465d-9774-15ba1a22dbe1/volumes/kubernetes.io~empty-dir/logs
node2

从上例可以看出,node1 和 node2 的 emptyDir volume 对应的目录是 /var/lib/kubelet/pods/<>/volumes/kubernetes.io~empty-dir/。Pod 之间是不共享 volume 的。

1.2 hostPath volume

类似于 emptyDir volume,hostPath 是宿主机上的指定目录,创建 hostPath volume:

[root@k8s-master-node-1 kubernetes]# cat httpd-hostpath-volume.yaml
apiVersion: apps/v1
kind: Deployment
...
      volumes:
      - name: logs
        hostPath:
          path: /var/log
      containers:
      - name: httpd-chunqiu
        image: docker.io/jocatalin/kubernetes-bootcamp:v1
        volumeMounts:
          - name: logs
            mountPath: /mnt/log

查看 container 的挂载目录信息:

"Mounts": [
            {
                "Type": "bind",
                "Source": "/var/log",
                "Destination": "/mnt/log",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
...

2. Kubernetes PersistentVolume

除了 emptyDir 和 hostPath 两种 kubernetes volume,kubernetes 还提供 PersistentVolume 和 PersistentVolumeClaim 资源对象实现更可靠的资源存储,下面介绍 HostPath 和 CephFS 两种 PV 类型。

2.1 HostPath PersistentVolume

HostPath 顾名思义是宿主机上的目录,其仅用于单机测试。

创建 HostPath PersistentVolume:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: chunqiuhostpath
  labels:
    type: local
spec:
  capacity:
    storage: 2Gi
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Delete
  storageClassName: manualself
  hostPath:
    path: "/opt/bin"

简要介绍三种参数:

  • persistentVolumeReclaimPolicy 包含三种回收策略:Retain,Delete 和 Recycle。
  • storageClassName 可自定义,也可使用 node 支持的 storageClass name。
  • accessModes 访问模式有三种:ReadWriteOnce(RWO),ReadOnlyMany(ROX)和 ReadWriteMany(RWX)。

创建 PersistentVolumeClaim:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: chunqiupvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: manualself

调用 PVC 创建 volume,PVC 会根据 storageClassName 查找是否有符合条件的 volume。 如果有,则绑定该 volume,如果没有则根据 storageClass 类型创建 PV。查看 PVC 和 PV 是否绑定:

[root@k8s-master-node-1 kubernetes]# kubectl get persistentvolumeclaims
NAME          STATUS   VOLUME            CAPACITY   ACCESS MODES   STORAGECLASS   AGE
hostpathpvc   Bound    chunqiuhostpath   2Gi        RWO            manualself     9s

PVC 和创建的 PV 成功绑定,不过也看到了资源浪费:PV 只能和一个 PVC 绑定在一起,如果该 PVC 请求的容量要比 PV 小则将造成 PV 存储资源的浪费。

如果 PV 没有创建,那么 PVC 将根据 storageClassName 按需创建 PV(动态模式),这种方式不会造成资源的浪费。以 CephFS storageClass 为例。

2.2 CephFS storageClass

node 上事先创建好 CephFS 的 storageClass:

[root@chunqiu ~ (Master)]# kubectl get storageclasses.storage.k8s.io csi-cephfs
NAME         PROVISIONER           RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
csi-cephfs   cephfs.csi.ceph.com   Delete          Immediate           true                   44d

[root@chunqiu ~ (Master)]# kubectl describe storageclasses.storage.k8s.io csi-cephfs
Name:                  csi-cephfs
IsDefaultClass:        No
Annotations:           <none>
Provisioner:           cephfs.csi.ceph.com
Parameters:            clusterID=f6fef4ec-fb60-4d46-899b-38fa33f4604c,csi.storage.k8s.io/controller-expand-secret-name=csi-cephfs,csi.storage.k8s.io/controller-expand-secret-namespace=ncms,csi.storage.k8s.io/node-stage-secret-name=csi-cephfs,csi.storage.k8s.io/node-stage-secret-namespace=ncms,csi.storage.k8s.io/provisioner-secret-name=csi-cephfs,csi.storage.k8s.io/provisioner-secret-namespace=ncms,fsName=cephfs,mounter=kernel,pool=cephfs_data,provisionVolume=true
AllowVolumeExpansion:  True
MountOptions:          <none>
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                <none>

创建 PVC,并且指定 storageClassName 为 csi-cephfs:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: chunqiupvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: csi-cephfs

创建 PVC:

[root@chunqiu pv (Master)]# kubectl get persistentvolumeclaims
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
chunqiupvc   Bound    pvc-f50ce096-aa5a-4924-a2a7-16e2f9a3f404   1Gi        RWO            csi-cephfs     34h

kubernetes 创建了 PV 类型为 CephFS 的 volume 并且将其与 PVC 绑定。

当然 PVC 是拿来用的,创建 Pod 使其引用到前面创建的 PVC:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpdchunqiu
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web_server
  template:
    metadata:
      labels:
        app: web_server
    spec:
      volumes:
      - name: chunqiupvc
        persistentVolumeClaim:
          claimName: chunqiupvc
      containers:
      - name: httpd-chunqiu
        image: docker.io/jocatalin/kubernetes-bootcamp:v1
        volumeMounts:
          - name: chunqiupvc
            mountPath: /mnt/services

需要注意的是,删除 Pod, PVC 和 PV 还是绑定状态。使 PV 与其它 PVC 绑定,需要先删除已绑定 PVC(PV 状态标记为“已释放”),然后清除该 PVC 在 PV 中的数据。

标签:node,csi,name,Kubernetes,volume,PVC,共享,k8s
来源: https://www.cnblogs.com/xingzheanan/p/14766793.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有