K8S存储之PV和PVC

1 介绍

对于管理计算资源来说,管理存储资源明显是另一个问题。PersistentVolume子系统为用户和管理员提供了一个API,该API将如何提供存储点细节抽象了出来。为此,我们引入两个新的API资源:PersistentVolume和PersistentVolumeClaim。

持久卷(PersistentVolume,PV)是由管理员设置的存储,可以由管理员事先供应,或者使用存储类(Storage Class)来动态供应。持久卷是集群资源,就像节点也是集群资源一样。PV持久卷和普通的Volume一样,也是使用卷插件来实现的,只是它们拥有独立于任何使用PV的Pod的生命周期。此API对象中记述了存储的实现细节,无论背后是NFS、iSCSI还是特定于云平台的存储系统。

持久卷申领(PersistentVolumeClaim,PVC)表达的是用户对存储的请求。概念上与Pod类似。Pod会耗用节点资源,而PVC申领会耗用PV资源。Pod可以请求特点数量点资源(CPU和内存);同样PVC申领也可以请求特定大小和访问模式(例如,可以要求PV卷能够以ReadWriteOnce、ReadOnlyMany或ReadWriteMany模式之一来挂载)

尽管 PersistentVolumeClaim 允许用户消耗抽象的存储资源,常见的情况是针对不同的 问题用户需要的是具有不同属性(如,性能)的 PersistentVolume 卷。 集群管理员需要能够提供不同性质的 PersistentVolume,并且这些 PV 卷之间的差别不 仅限于卷大小和访问模式,同时又不能将卷是如何实现的这些细节暴露给用户。 为了满足这类需求,就有了存储类(StorageClass)资源。

2 卷和申领的生命周期

PV卷是集群中的资源。PVC申领是对这些资源的请求,也被用来执行对资源的申领检查。PV卷和PVC申领之间的互动遵循以下使用周期:

2.1 配置(Provision)

PV卷的配置有两种方式:静态或动态

2.2 静态

集群管理员创建若干PV卷。这些卷对象带有真实存储的细节信息,并且对集群用户可用(可用)。PV卷对象存在于Kubernetes API中,可供用户消费(使用)。

2.3 动态

如果管理员所创建的所有静态PV卷都无法与用户的PersistentVolumeClaim匹配,集群可以尝试为该PVC申领动态供应一个存储卷。这一供应操作是基于StorageClass来实现的;PVC申领必须请求某个存储类,同时集群管理员必须已经创建并配置了该类,这样动态供应链的动作才会发生。如果PVC申领指定存储类为“”,则相当于自身禁止使用动态供应的卷。

为了基于存储类完成动态的存储供应,集群管理员需要在API服务器上启用DefaultStorageClass准入控制器。举例而言,可以通过保证DefaultStorageClass出现在API服务器组件的 --enable-admission-plugins标志的值可以是逗号分隔的有序列表。

2.4 绑定

再动态配置的情况下,用户创建或已经创建了具有特点存储量的PersistentVolumeClaim以及某些访问模式。master中的控制环路监视新的PVC,寻找匹配的PV(如果可能),并将它们绑定在一起。如果新的PVC动态调配PV,则该环路将始终把该PV绑定到PVC。否则,用户总会得到他们所请求的存储,但是容量可能超出要求的数量。一旦PV和PVC绑定后,PersistentVolumeClaim绑定是排他性的,不管它们是如何绑定的。PVC跟PV绑定是一对一的映射。

如果没有匹配的卷,声明将无限期地保持未绑定状态。随着匹配卷的可用,声明将被绑定。例如,配置了许多50Gi PV的集群将不会匹配请求100Gi的PVC。将100Gi PV添加到集群时,可以绑定PVC。

2.5 使用

Pod使用声明作为卷。集群检查声明以查找绑定的卷并为集群挂载改卷。对于支持多种访问模式的卷,用户指定在使用声明作为容器中的卷时所需的模式。

用户进行了声明,并且该声明是绑定的,则只要用户需要,绑定的PV就属于该用户。用户通过在Pod的volume配置中包含persistentVolumeClaim来调度Pod并访问用户声明的PV。

2.6 持久化卷声明点保护

PVC保护的目的是确保由pod正在使用的PVC不会从系统中移除,因为如果被移除的话可能会导致数据丢失。

注意:当pod状态为Pending并且pod已经分配给节点或pod为Running状态时,PVC处于活动状态。

当启⽤PVC保护alpha功能时,如果⽤户删除了⼀个pod正在使⽤的PVC,则该PVC不会被⽴即删除。PVC的删除将被推迟,直到PVC不再被任何pod使⽤。

您可以看到,当PVC的状态Teminatiing时,PVC受到保护,Finalizers列表中包含 kubernetes.io/pvc-protection:

kubectl described pvc hostpath
Name: hostpath
Namespace: default
StorageClass: example-hostpath
Status: Terminating
Volume:
Labels: <none>
Annotations: volume.beta.kubernetes.io/storage-class=example-hostpath
            volume.beta.kubernetes.io/storage-provisioner=example.com/hostpath
Finalizers: [kubernetes.io/pvc-protection]
...

2.7 回收

⽤户⽤完volume后,可以从允许回收资源的API中删除 PVC 对象。PersistentVolume的回收策略告诉集群在存储卷声明释放后应如何处理该卷。⽬前,volume的处理策略有保留、回收或删除。

2.8 保留

保留回收策略允许⼿动回收资源。当PersistentVolumeClaim被删除时, PersistentVolume仍然存在,volume被视为“已释放”。但是由于前⼀个声明⼈的数据仍然存在,所以还不能⻢上进⾏其他声明。管理员可以通过以下步骤手动回收卷。

1、删除PersistentVolume。在删除PV后,外部基础架构中的关联存储资产(如AWS EBS、GCE PD、Azure Disk或Cinder卷)仍然存在。

2、手动清理相关存储资产上的数据。

3、⼿动删除关联的存储资产,或者如果要重新使⽤相同的存储资产,请使⽤存储资产定义创建新的PersistentVolume。

2.9 回收

如果存储卷插件⽀持,回收策略会在volume上执⾏基本擦除(rm -rf /thevolume/*),可被再次声明使⽤。

但是,管理员可以使⽤如此处所述的Kubernetes controller manager命令⾏参数来配置⾃定义回收站pod模板。⾃定义回收站pod模板必须包含volumes规范,如下⾯的示例所示:

apiVersion: v1
kind: Pod
metadata:
  name: pv-recycler
  namespace: default
spec:
  restartPolicy: Never
  volumes:
  - name: vol
    hostPath:
    path: /any/path/it/will/be/replaced
  containers:
  - name: pv-recycler
    image: "k8s.gcr.io/busybox"
    command: ["/bin/sh", "-c", "test -e /scrub && rm -rf /scrub/..?* /scrub/.[!.]* /scrub/* && test -z \"$(ls -A /scrub)\" || exit 1"]
    volumeMounts:
    - name: vol
      mountPath: /scrub

但是,volumes部分的⾃定义回收站模块中指定的特定路径将被替换为正在回收的卷的特定路径。

2.10 删除

对于⽀持删除回收策略的卷插件,删除操作将从Kubernetes中删除 PersistentVolume 对象,并删除外部基础架构(如AWS EBS、GCE PD、Azure Disk或Cinder卷)中的关联存储资产。动态配置的卷继承其 StorageClass ,默认为Delete。管理员应该根据⽤户的期望来配置 StorageClass,否则就必须要在PV创建后进⾏编辑或修补。请参阅更改PersistentVolume 的回收策略。

#kubectl explain PersistentVolume

Capacity: #当前PV空间大小,kubectl explain PersistentVolume.spec.capacity

AccessModes: #访问模式,
    ReadWriteOnce(RWO) -- the volume can be mounted as read-write by a single node -- #PV只能被单个节点以读写权限挂载
    ReadOnlyMany(ROX) -- the volume can be mounted read-only by many nodes -- #PV可以被多个节点挂载,但是权限是只读的
    ReadWriteMany(RWX) -- the volume can be mounted as read-write by many nodes -- #PV可以被多个节点以读写方式挂载

3 创建PV

3.1 静态PV

PersistentVolume Spec主要支持以下几个通用字段,用于定义PV的容量、访问模式和回收策略。

  • Capacity:当前PV的容量;目前,Capacity仅支持空间设定,将来应该还可以指定IOPS和throughput。

  • accessModes(访问模式):尽管在PV层看起来并无差别,但存储设备支持及启用的功能特性却可能不尽相同。例如NFS存储支持多客户端同时挂载及读写操作,但也可能在共享时仅启用了只读操作,其他存储系统也存在类似的可配置特性。因此,PV底层点设备或许存在其特有点访问模式,用户使用时必须在其特性范围内设定其功能。

    • ReadWriteOnce:仅可被单个节点只读挂载;命令行中简写为RWO。

    • ReadOnlyMany:可被多个节点同时只读挂载;命令行中简写为ROX。

    • ReadWriteMany:可被多个节点同时读写挂载;命令行中简写为RWX。

  • persistentVolumeReclaimPolicy(回收策略):PV空间被释放时的处理机制;可用类型仅为Retain(默认)、Recycle或Delete。

    • Retain:保持不动,由管理员随后手动回收。

    • Recycle:空间回收,即删除存储卷目录下的所有文件(包括子目录和隐藏文件),目前仅NFS和hostPath支持此操作。

    • Delete:删除存储卷,仅部分云端存储系统支持,如AWS EBS、GCE PD、Azure Disk和Cinder。

  • volumeMode:卷模型,用于指定此卷可被用作文件系统还是裸格式的块设备;默认为Filesystem。

  • storageClassName:当前PV所属的Storage Class的名称;默认为空值,即不属于任何StorageClass。

  • mountOptions:挂载选项组成的列表,如ro、soft、和hard等。

案例1:NFS存储PV

#编写资源清单
[root@ubuntu-200 ~]# cat volume-pv-nfs.yaml 
apiVersion: v1
kind: PersistentVolume
metadata: 
  name: pv-nfs-001
  labels:
    release: stabel
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain
  mountOptions:
   - hard
   - nfsvers=4.1
  nfs:
    server: 10.0.0.5
    path: /data/test

#创建PV
[root@ubuntu-200 ~]# kubectl apply -f volume-pv-nfs.yaml

#查看创建的PV
[root@ubuntu-200 ~]# kubectl get pv -o wide
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE    VOLUMEMODE
pv-nfs-001   5Gi        RWO            Retain           Available                                   110s   Filesystem

创建完成后,可以看到其状态为“Available”,即“可用”状态,表示目前尚未被PVC资源所绑定。

使用资源的查看命令可列出PV资源的相关信息。创建完成的PV资源可能处于下列四种状态中的某一种,它们代表着PV资源生命周期中的各个阶段。

  • Available:可用状态的自由资源,尚未被PVC绑定。

  • Bound:已经绑定至某PVC。

  • Released:绑定的PVC已经被删除,但资源尚未被集群回收。

  • Failed:因自动回收资源失败而处于的故障状态。

3.2 创建PVC

定义PVC时,用户可通过访问模式(accessModes)、数据源(dataSource)、存储资源空间需要和限制(resources和limits)、存储类、标签选择器和卷名称等匹配标准来筛选集群上的PV资源,其中,resources和accessModes是最重的筛选标准。PVC的spec字段的可嵌套字段有如下几个:

  • accessModes <[]string>: PVC的访问模式;它同样支持RWO、RWX和ROX三种模式;

  • dataSources <Object>: 用于从指定的数据源恢复该PVC卷,它目前支持的数据源包括一个现在卷快照对象(snapshot.storage.k8s.io/VolumeSnapshot)、一个既有PVC对象(PersistentVolumeClaim)或一个既有的用于数据转存点自定义资源对象(resource/object);

  • resources <Object>: 声明使用的存储空间的最小值和最大值;目前,PVC的资源限定仅支持空间大小一个维度;

  • selector <Obeject>: 筛选PV时额外使用的标签选择器(matchLables)或匹配条件表达式(matchExpressions);

  • storageClassName <string>: 该PV资源隶属的存储类资源名称;指定了存储类型的PVC仅能在同一个存储下筛选PV资源,否则,就只能从所有不具有存储类的PV中进行筛选;

  • volumeMode <string>: 卷模型,用于指定此卷可被用作文件系统还是裸格式的块设备;默认值是Filesystem;

  • volumeName <string>: 直接指定要绑定的PV资源的名称。

范例:

 

#编写PV的资源清单并创建PV
[root@ubuntu-200 ~]# cat pv-nfs-001.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nfs-001
  labels:
    release: redis
spec:
  capacity:
    storage: 5Gi
  volumeMode: Filesystem
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Recycle
  storageClassName: slow
  mountOptions:
    - hard
    - nfsvers=4.1
  nfs:
    server: 10.0.0.58
    path: /data/test1
[root@ubuntu-200 ~]# kubectl apply -f pv-nfs-001.yaml 
persistentvolume/pv-nfs-001 created

#查看创建的PV
[root@ubuntu-200 ~]# kubectl get pv -o wide
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM   STORAGECLASS   REASON   AGE   VOLUMEMODE
pv-nfs-001   5Gi        RWX            Recycle          Available           slow                    27s   Filesystem

#编写PVC的资源清单并创建PVC
[root@ubuntu-200 ~]# cat pvc-001.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-001
spec:
  accessModes:
    - ReadWriteMany
  volumeMode: Filesystem
  resources:
    requests:
      storage: 5Gi
  storageClassName: slow
  selector:
    matchLabels:
      release: "redis"
[root@ubuntu-200 ~]# kubectl apply -f pvc-001.yaml

#查看PV和PVC,可看到已经匹配
[root@ubuntu-200 ~]# kubectl get pv
NAME         CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE
pv-nfs-001   5Gi        RWX            Recycle          Bound    default/pvc-001   slow                    15m
[root@ubuntu-200 ~]# kubectl get pvc
NAME      STATUS   VOLUME       CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-001   Bound    pv-nfs-001   5Gi        RWX            slow           106s

 

创建 PVC资源之后,即可在Pod资源中通过persistenVolumeClain存储卷引用它,而后挂载于容器中进行数据持久化。需要注意的是,PV是集群级别的资源,而PVC则隶属于名称空间,因此,PVC在绑定目标PV时不受名称空间的限制,但Pod引用PVC时,则只能是属于同一命名空间内的PVC资源。

3.3 在Pod中使用PVC

在Pod资源中调用PVC资源,只需要在定义volumes时使用persistentVolumeClaims字段嵌套指定两个字段即可:

  • claimName: 要调用的PVC存储卷的名称,PVC卷要与Pod在同一名称空间中。

  • readOnly:是否将存储卷强制挂载为只读模式,默认为flase。

范例:

#资源清单如下
[root@ubuntu-200 ~]# cat pod-redis.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: pod-redis
spec:
  containers:
  - name: redis
    image: redis:alpine
    securityContext:
      runAsUser: 1099
    ports:
    - containerPort: 6379
      name: redis-port
    volumeMounts:
    - mountPath: /data
      name: redis-vol
  volumes:
  - name: redis-vol
    persistentVolumeClaim:
      claimName: pvc-001
      
#创建pod
[root@ubuntu-200 ~]# kubectl apply -f pod-redis.yaml

#进入pod测试
[root@ubuntu-200 ~]# kubectl get pods -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES
pod-redis          1/1     Running   0          68s   10.244.1.67   ubuntu-220   <none>           <none>
volume-nfs-redis   1/1     Running   1          13h   10.244.2.72   ubuntu-210   <none>           <none>
[root@ubuntu-200 ~]# kubectl exec -it pod-redis -- /bin/sh
/data $ redis-cli
127.0.0.1:6379> set name yang
OK
127.0.0.1:6379> get name
"yang"
127.0.0.1:6379> bgsave
Background saving started
127.0.0.1:6379> exit
/data $ ls
dump.rdb

#在nfs服务器上查看
[root@C8_58 ~]# ll /data/test1
total 4
-rw-r--r-- 1 redis nobody 108 Dec 10 10:34 dump.rdb

3.4 存储类(storage class)

存储类(storage class)是Kubenetes资源类型的一种,它是由管理员为管理PV方便而按需创建的类别(逻辑组),例如可按存储系统的性能高低分类,例如可按存储系统的性能高低分类,或者根据其综合服务质量级别进行分类、依照备份策略分类,甚至直接按管理员自定义的标准进行分类等。

存储类的好处之一便是支持PV的动态创建。用户用到持久性存储,需要通过创建PVC来绑定匹配的PV,此类操作需要量较大,或者当管理员手动创建的PV无法满足PVC的需求时,系统按PVC的需要标准动态创建适配的PV会为存储管理带来极大的灵活性。

存储类对象的名称至关重要,它是用户调用的标识。创建存储类对象时,除了名称之外,还需要为其定义三个关键字:provisioner、parameter和reclaimPolicy。

StorageClass Spec中五个可用字段:

  • provisioner(供给方):即提供了存储资源的存储系统,存储类要依赖Provisioner来判定要使用的存储插件以便适配到目标存储系统。Kubernetes内键有多种供给方(Provisioner),这些供给方的名字都以“kubernetes.io”为前缀。另外,它还支持用户依据Kubernetes规范自定义Provisioner。

  • parameters(参数):存储类使用参数描述要关联到的存储卷,不过,不同的Provisioner可用的参数各不相同。

  • reclaimPolicy:为当前存储类动态创建的PV指定回收策略,可用值为Delete(默认)和Retain;不过,那些由管理员手工创建的PV的回收策略取决于它们自身的定义。

  • volumeBindingMode:定义如何为PVC完成供给和绑定,默认值为“VolumeBinding Immediate”;此选项仅在启用了存储卷调度功能时才能生效。

  • mountOptions:由当前类动态创建的PV的挂载选项列表。

范例:

 

[root@ubuntu-200 ~]# cat sc-001.yaml 
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sc-001
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer 
#这里的volumeBindingMode: WaitForFirstConsumer很关键,意思就是延迟绑定,当有符合PVC要求的PV不立即绑定。因为POD使用PVC,而绑定之后,POD被调度到其他节点,显然其他节点很有可能没有那个PV所以POD就挂起了,另外就算该节点有合适的PV,而POD被设置成不能运行在该节点,这时候就没法了,延迟绑定的好处是,POD的调度要参考卷的分布。当开始调度POD的时候看看它要求的LPV在哪里,然后就调度到该节点,然后进行PVC的绑定,最后在挂载到POD中,这样就保证了POD所在的节点就一定是LPV所在的节点。所以让PVC延迟绑定,就是等到使用这个PVC的POD出现在调度器上之后(真正被调度之前),然后根据综合评估再来绑定这个PVC。

 

3.5 动态PV之longhorn的使用

3.5.1 部署

(1)、前提:安装依赖

对于Debian和Ubuntu,请使用以下命令:

# apt-get -y install open-iscsi

对于带有的RHEL和CentOS,请使用以下命令:

# yum -y install iscsi-initiator-utils

(2)、部署

1.使用以下命令在任何Kubernetes集群上安装Longhorn

# kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml

#最好将yaml文件下载下来
# kubectl apply -f
longhorn.yaml
# wget https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml

2.检查部署是否成功:

# kubectl -n longhorn-system get pod
NAME                                        READY     STATUS    RESTARTS   AGE
csi-attacher-6fdc77c485-8wlpg               1/1       Running   0          9d
csi-attacher-6fdc77c485-psqlr               1/1       Running   0          9d
csi-attacher-6fdc77c485-wkn69               1/1       Running   0          9d
csi-provisioner-78f7db7d6d-rj9pr            1/1       Running   0          9d
csi-provisioner-78f7db7d6d-sgm6w            1/1       Running   0          9d
csi-provisioner-78f7db7d6d-vnjww            1/1       Running   0          9d
engine-image-ei-6e2b0e32-2p9nk              1/1       Running   0          9d
engine-image-ei-6e2b0e32-s8ggt              1/1       Running   0          9d
engine-image-ei-6e2b0e32-wgkj5              1/1       Running   0          9d
longhorn-csi-plugin-g8r4b                   2/2       Running   0          9d
longhorn-csi-plugin-kbxrl                   2/2       Running   0          9d
longhorn-csi-plugin-wv6sb                   2/2       Running   0          9d
longhorn-driver-deployer-788984b49c-zzk7b   1/1       Running   0          9d
longhorn-manager-nr5rs                      1/1       Running   0          9d
longhorn-manager-rd4k5                      1/1       Running   0          9d
longhorn-manager-snb9t                      1/1       Running   0          9d
longhorn-ui-67b9b6887f-n7x9q                1/1       Running   0          9d

3.修改yaml文件暴露UI界面端口

#修改配置文件,并将pod端口暴露出去
[root@ubuntu-200 ~]# vim longhorn.yaml
...
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: longhorn-ui
  name: longhorn-ui
  namespace: longhorn-system
spec:
  replicas: 1
  selector:
    matchLabels:
      app: longhorn-ui
  template:
    metadata:
      labels:
        app: longhorn-ui
    spec:
      containers:
      - name: longhorn-ui
        image: longhornio/longhorn-ui:v1.0.2
        imagePullPolicy: IfNotPresent
        securityContext:
          runAsUser: 0
        ports:
        - containerPort: 8000
          name: http
          hostPort: 8000    #添加此行
        env:
          - name: LONGHORN_MANAGER_IP
            value: "http://longhorn-backend:9500"
...

#重新部署
[root@ubuntu-200 ~]# kubectl apply -f longhorn.yaml

#查看UIpod被调度到的节点
[root@ubuntu-200 ~]# kubectl get pods -o wide -n longhorn-system 
NAME                                        READY   STATUS    RESTARTS   AGE     IP            NODE         NOMINATED NODE   READINESS GATES
csi-attacher-7cb499df6-fjp5j                1/1     Running   1          3h2m    10.244.5.6    c8-48        <none>           <none>
csi-attacher-7cb499df6-hb8kk                1/1     Running   1          3h2m    10.244.1.73   ubuntu-220   <none>           <none>
csi-attacher-7cb499df6-qqzxc                1/1     Running   1          3h2m    10.244.2.81   ubuntu-210   <none>           <none>
csi-provisioner-67846b4b55-fb2rx            1/1     Running   0          3h2m    10.244.2.79   ubuntu-210   <none>           <none>
csi-provisioner-67846b4b55-n9gcj            1/1     Running   1          3h2m    10.244.1.72   ubuntu-220   <none>           <none>
csi-provisioner-67846b4b55-t2rjj            1/1     Running   1          3h2m    10.244.5.7    c8-48        <none>           <none>
csi-resizer-5cb8df7db9-6xwzd                1/1     Running   0          3h2m    10.244.1.75   ubuntu-220   <none>           <none>
csi-resizer-5cb8df7db9-q79md                1/1     Running   2          3h2m    10.244.2.78   ubuntu-210   <none>           <none>
csi-resizer-5cb8df7db9-wsmhl                1/1     Running   1          3h2m    10.244.5.8    c8-48        <none>           <none>
engine-image-ei-ee18f965-dwxsp              1/1     Running   0          3h9m    10.244.1.69   ubuntu-220   <none>           <none>
engine-image-ei-ee18f965-wntmt              1/1     Running   0          3h9m    10.244.5.4    c8-48        <none>           <none>
engine-image-ei-ee18f965-wwm28              1/1     Running   0          3h9m    10.244.2.75   ubuntu-210   <none>           <none>
instance-manager-e-45b562a8                 1/1     Running   0          3h8m    10.244.1.71   ubuntu-220   <none>           <none>
instance-manager-e-aaeb5217                 1/1     Running   0          110m    10.244.5.27   c8-48        <none>           <none>
instance-manager-e-bd5ddc65                 1/1     Running   0          3h1m    10.244.2.82   ubuntu-210   <none>           <none>
instance-manager-r-5d27c92a                 1/1     Running   0          62m     10.244.5.33   c8-48        <none>           <none>
instance-manager-r-60a7e836                 1/1     Running   0          3h1m    10.244.2.83   ubuntu-210   <none>           <none>
instance-manager-r-945e433d                 1/1     Running   0          3h8m    10.244.1.70   ubuntu-220   <none>           <none>
longhorn-csi-plugin-bk2mx                   2/2     Running   0          3h2m    10.244.5.9    c8-48        <none>           <none>
longhorn-csi-plugin-bm58t                   2/2     Running   0          3h2m    10.244.1.74   ubuntu-220   <none>           <none>
longhorn-csi-plugin-qt4qv                   2/2     Running   0          3h2m    10.244.2.80   ubuntu-210   <none>           <none>
longhorn-driver-deployer-6b7d76659f-24rqk   1/1     Running   0          3h13m   10.244.2.74   ubuntu-210   <none>           <none>
longhorn-manager-m6jh9                      1/1     Running   10         3h13m   10.244.5.2    c8-48        <none>           <none>
longhorn-manager-qczzp                      1/1     Running   1          3h13m   10.244.2.73   ubuntu-210   <none>           <none>
longhorn-manager-wmxzw                      1/1     Running   1          3h13m   10.244.1.68   ubuntu-220   <none>           <none>
longhorn-ui-5f9659448b-qddjw                1/1     Running   0          131m    10.244.5.18   c8-48        <none>           <none>

测试访问

 

 3.5.2 配置longhorn支持RWX

longhorn默认不支持RWX模式,需单独配置。

官方参考文档:https://longhorn.io/docs/1.0.2/advanced-resources/rwx-workloads/

范例:

#下载官方的资源清单
01-security.yaml
02-longhorn-nfs-provisioner.yaml
github地址:https://github.com/longhorn/longhorn/tree/master/examples/rwx
#wget无法下载,会被调度到亚马逊上

#在服务器上安装git,使用git clone,直接将longhorn整个文件下载下来。
git clone https://github.com/longhorn/longhorn.git

#配置安装
kubectl apply -f 01-security.yaml
kubectl apply -f 02-longhorn-nfs-provisioner.yaml

#查看
[root@ubuntu-200 /data/statefulset]# kubectl get pods -n longhorn-system 
NAME                                        READY   STATUS    RESTARTS   AGE
csi-attacher-7cb499df6-68mkc                1/1     Running   2          2d1h
csi-attacher-7cb499df6-6vmg9                1/1     Running   8          2d1h
csi-attacher-7cb499df6-kmq5v                1/1     Running   3          2d1h
csi-provisioner-67846b4b55-26w66            1/1     Running   3          2d1h
csi-provisioner-67846b4b55-28vwn            1/1     Running   5          2d1h
csi-provisioner-67846b4b55-7jk8p            1/1     Running   3          2d1h
csi-resizer-5cb8df7db9-4jlzj                1/1     Running   2          2d1h
csi-resizer-5cb8df7db9-6mlxz                1/1     Running   4          2d1h
csi-resizer-5cb8df7db9-xgr2s                1/1     Running   4          2d1h
engine-image-ei-ee18f965-bdvpn              1/1     Running   2          2d1h
engine-image-ei-ee18f965-j59bs              1/1     Running   2          2d1h
engine-image-ei-ee18f965-v94qb              1/1     Running   3          2d1h
instance-manager-e-10494252                 1/1     Running   0          39m
instance-manager-e-743da98a                 1/1     Running   0          98m
instance-manager-e-847f7101                 1/1     Running   0          100m
instance-manager-r-3eb87c55                 1/1     Running   0          98m
instance-manager-r-3ed54400                 1/1     Running   0          100m
instance-manager-r-ed21a329                 1/1     Running   0          39m
longhorn-csi-plugin-6b6nj                   2/2     Running   7          2d1h
longhorn-csi-plugin-sl7w9                   2/2     Running   5          2d1h
longhorn-csi-plugin-tkl7r                   2/2     Running   7          2d1h
longhorn-driver-deployer-6b7d76659f-ns5rp   1/1     Running   2          2d1h
longhorn-manager-4dq4w                      1/1     Running   2          2d1h
longhorn-manager-d6c9s                      1/1     Running   2          2d1h
longhorn-manager-gj985                      1/1     Running   4          2d1h
longhorn-nfs-provisioner-76cb977b9f-6z84c   1/1     Running   0          91m #配置后新增
longhorn-ui-5f9659448b-bt8mh                1/1     Running   2          2d1h 
posted @ 2020-12-17 11:18  yt丶独自  阅读(998)  评论(0编辑  收藏  举报