通过PV/PVC方式使用BOS

概述

容器的特性决定了容器本身是非持久化的,容器被删除,其上的数据也一并删除。BOS可以解决容器的数据共享和持久化存储问题,适用于大数据分析、媒体、游戏等很多场景。
而PV(PersistentVolume)和PVC(PersistentVolumeClaim)是K8S提供的用于抽象存储细节的API资源。利用BOS在集群内创建PV和PVC资源,用户可以直接将BOS作为存储卷挂载到容器中,而无需关注底层的实现细节,从而更加便捷地为容器集群提供持久化存储方案。

准备工作

用户做好以下准备,才能在容器中挂载BOS实例。

创建Bucket

  1. 创建BOS Bucket,操作步骤请参考创建bucket

注意: 创建的bos bucket和挂载点须和集群节点在同一vpc/子网内。

创建容器集群

  1. 创建一个容器集群,操作步骤参考创建集群
  2. 下载命令行客户端kubectl,并连接集群,操作步骤参考通过kubectl连接Kubernetes集群

注意:K8S集群版本>=1.11

操作指南

静态PV/PVC方式挂载BOS

1.在集群中创建 ak/sk的 secret, kubectl create -f secret-demo.yaml, secret-demo的内容如下:

apiVersion: v1
kind: Secret
metadata:
  name: csi-bos-secret
  namespace: default
data:
  ak: ak-encoded-by-base64
  sk: sk-encoded-by-base64

注意: yaml中ak/sk需要经过base64, 该 secret 用于挂载 bos,需要在百度智能云右上角安全认证页获取

2.在集群中创建PV和PVC资源

使用kubectl,执行 kubectl create -f bos-pv.yaml 完成PV的创建

对应的bos-pv.yaml文件如下所示:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-bos
  namespace: "default"
spec:
  accessModes:
  - ReadWriteOnce
  - ReadOnlyMany
  capacity:
    storage: 5Gi
  storageClassName: csi-bos
  csi:
    driver: "csi-bosplugin"
    volumeHandle: "v-XXXXXX"
    nodePublishSecretRef:
      name: "csi-bos-secret"
      namespace: "default"
  persistentVolumeReclaimPolicy: Retain

注意事项及参数说明:
yaml中volumeHandle:对应的是BOS的 bucketName, 支持挂载 BOS bucket子目录 , 如: bucketName/dirName
nodePublishSecretRef:填写步骤1中的 secret 名
volumeAttributes:下的参数为选填参数
region:用于跨region支持BOS挂载, 支持参数为:su, bj, whf, gz, hkg, bd(苏州,北京,武汉,广州,香港,保定),同时需要虚机开通eip。region参数默认为机器所在region
multipart_size, multipart_threshold, multipart_parallel 为 BOS分片传输相关参数,详情见BOS参数说明链接
BOS 支持一写多读,但是只读的pod无法读取到最新写入的数据:对应的 accessMode 只支持 ReadWriteOnce + ReadOnlyMany

创建PV后,输入kubectl get pv可以看见一个available状态的PV,如下所示:

$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
bos-pv    5Gi        RWO,ROX        Retain           Available             csi-bos                         3s

3.建立一个能够与该PV绑定的PVC

使用kubectl,执行 kubectl create -f bos-pvc.yaml完成PVC的创建

对应的bos-pvc.yaml文件如下所示:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: bos-pvc
spec:
  accessModes:
  - ReadWriteOnce
  - ReadOnlyMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: csi-bos

注意: yaml中storageClassName字段用于和 PV关联,建议填写,如果集群中使用多类存储系统的 PV

绑定前,PVC为pending状态

$ kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
bos-pvc   Pending                                       csi-bos        2s

绑定后,PV和PVC状态变为Bound

$ kubectl get pv
NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS    CLAIM             STORAGECLASS   REASON    AGE
bos-pv    5Gi        RWX            Retain           Bound     default/bos-pvc                            36s
$ kubectl get pvc
NAME      STATUS    VOLUME    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
bos-pvc   Bound     bos-pv    5Gi        RWO,ROX        csi-bos        1m

有关PV和PVC的更多设置和字段说明,见k8s官方文档

4.在Pod内挂载PVC

在Pod spec内指定相应的PVC名称即可,使用kubectl,执行 kubectl create -f demo-bos-pod.yaml 完成pod的创建

对应的demo-bos-pod.yaml文件如下所示:

apiVersion: v1
kind: Pod
metadata:
  name: nginx01
  namespace: default
spec:
  containers:
  - image: cp01-caas-registry.epc.baidu.com:8000/ccepublic00/nginx:latest
    imagePullPolicy: Always
    name: nginx01
    volumeMounts:
    - mountPath: /var/lib/www/html
      name: bos-pvc
    - mountPath: /var/lib/www/html000
      name: bos-pvc
      readOnly: true
  volumes:
  - name: bos-pvc
    persistentVolumeClaim:
      claimName: bos-pvc
      readOnly: false

Pod创建后,可以读写容器内的//var/lib/www/html路径来访问相应的BOS存储上的内容, 同时该路径支持读写,/var/lib/www/html000支持只读。

同时,支持在其余机器上挂载只读盘,kubectl create -f demo-bos-pod1.yaml创建一个包含只读 bos bucket的 pod

apiVersion: v1
kind: Pod
metadata:
  name: nginx01-bbaa
spec:
  containers:
  - image: cp01-caas-registry.epc.baidu.com:8000/ccepublic00/nginx:latest
    imagePullPolicy: Always
    name: nginx01
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /var/lib/www/html000
      name: bos-pvc
      readOnly: true
  volumes:
  - name: bos-pvc
    persistentVolumeClaim:
      claimName: bos-pvc
      readOnly: true

5.释放PV和PVC资源

完成存储资源的使用后,可以释放PVC和PV资源

使用以下命令可以释放PVC

$ kubectl delete -f  bos-pvc.yaml

释放PVC后,原来与之绑定的PV状态会变为Release,如下所示:

NAME      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS     CLAIM             STORAGECLASS   REASON    AGE
bos-pv    5Gi        RWO,ROX        Retain           Released   default/bos-pvc   csi-bos        16m

输入以下指令释放PV资源

$ kubectl delete -f  bos-pv.yaml