使用对象存储BOS
概述
容器引擎 CCE 支持通过创建 PV/PVC,并为工作负载挂载数据卷方式使用百度智能云对象存储BOS。本文将介绍如何在集群中静态挂载对象存储。
使用限制
- 集群 Kubernetes 版本需大于或等于 1.16。
- 请注意创建的 BOS Bucket 所处地域。如果创建的 BOS Bucket 与容器集群分属于不同地域,要求挂载点所在 BCC/BBC 开放公网访问,同地域则可以通过内网读写。
前提条件
- 集群已安装对象存储组件,更多信息请见 CCE CSI BOS Plugin 说明。
操作步骤
本文介绍通过 Kubectl 或者 CCE 控制台创建 PV/PVC 实现静态挂载 BOS。
方式一:通过 kubectl 命令行操作
1. 在集群中创建 AK/SK 的 Secret,用以访问 BOS 存储
1kubectl create secret generic csi-bos-secret \
2 --from-literal=ak=<Your-AK> \
3 --from-literal=sk=<Your-SK>
说明: 关于 AK/SK 的更多信息参考 如何获取 AK 和 SK
2. 创建持久卷 PV
1apiVersion: v1
2kind: PersistentVolume
3metadata:
4 name: pv-bos
5 namespace: default
6spec:
7 accessModes:
8 - ReadWriteOnce
9 - ReadOnlyMany
10 capacity:
11 storage: 5Gi
12 storageClassName: csi-bos
13 csi:
14 driver: csi-bosplugin
15 volumeHandle: v-XXXXXX # 对应的BOS的bucketName, 支持挂载BOS bucket子目录,如: bucketName/dirName
16 nodePublishSecretRef:
17 name: csi-bos-secret
18 namespace: default
19 mountOptions:
20 - "-o meta_expires=0"
21 persistentVolumeReclaimPolicy: Retain
说明:
mountOptions : 由于 BOS bucket 挂载依赖 Bosfs,因此支持通过 mountOptions 指定 Bosfs 的启动参数,支持的参数详情见 BOS参数说明,常用参数和说明如下:
meta_expires
: meta 缓存过期时间,单位为秒。不设置该参数代表永不过期。上述PV yaml示例中该参数被设置为0,代表不缓存。缓存过期时间过短可能影响写入性能,过长可能导致挂载点内看不到其他客户端写入同一bucket的数据。同一bucket一写多读场景建议设置为0,纯写入场景建议设置为3600,单点读写场景可以不设置。allow_other
: 是否允许非 root 用户读取挂载点内数据,默认只有 root 用户可读写,容器内非 root 进程如果要读取挂载点内数据需要设置该参数,更细粒度权限的管理可以配合mount_umask
参数一同使用。- BOS 支持一写多读,对应的 accessMode 只支持 ReadWriteOnce + ReadOnlyMany
创建 PV 后,输入 kubectl get pv
可以看见一个 available 状态的 PV,如下所示:
1 $ kubectl get pv
2 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
3 bos-pv 5Gi RWO,ROX Retain Available csi-bos 3s
3. 创建持久卷声明 PVC
1apiVersion: v1
2kind: PersistentVolumeClaim
3metadata:
4 name: bos-pvc
5spec:
6 accessModes:
7 - ReadWriteOnce
8 - ReadOnlyMany
9 resources:
10 requests:
11 storage: 5Gi
12 storageClassName: csi-bos
说明:YAML 中 storageClassName 字段用于和 PV 关联,建议填写,如果集群中定义了多种存储类,通过指定 storageClassName,用户可以请求特定类存储资源 PV。
绑定前,PVC 为 pending 状态
1 $ kubectl get pvc
2 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
3 bos-pvc Pending csi-bos 2s
绑定后,PV 和 PVC 状态变为 Bound
1 $ kubectl get pv
2 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
3 bos-pv 5Gi RWX Retain Bound default/bos-pvc 36s
4 $ kubectl get pvc
5 NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
6 bos-pvc Bound bos-pv 5Gi RWO,ROX csi-bos 1m
有关 PV 和 PVC 的更多设置和字段说明,参见 Kubernetes官方文档。
4. 在 Pod 内挂载 PVC
1apiVersion: v1
2kind: Pod
3metadata:
4 name: nginx01
5 namespace: default
6spec:
7 containers:
8 - image: nginx
9 imagePullPolicy: Always
10 name: nginx01
11 volumeMounts:
12 - mountPath: /var/lib/www/html
13 name: bos-pvc
14 - mountPath: /var/lib/www/html000
15 name: bos-pvc
16 readOnly: true
17 livenessProbe:
18 exec:
19 command:
20 - stat
21 - /var/lib/www/html
22 volumes:
23 - name: bos-pvc
24 persistentVolumeClaim:
25 claimName: bos-pvc
26 readOnly: false
Pod 创建后,可以读写容器内的 /var/lib/www/html
路径来访问相应的 BOS 存储上的内容, 同时该路径支持读写,/var/lib/www/html000
支持只读。
注意:
由于 CSI bosplugin 依赖 bosfs,在 Pod 中配置
livenessProbe
检查挂载点状态可以避免容器无法感知 bosfs 异常重启后的挂载点失效的问题,强烈建议添加该配置。
同时,支持在其余机器上挂载只读盘,如创建一个包含只读 BOS bucket 的 Pod
1 apiVersion: v1
2 kind: Pod
3 metadata:
4 name: nginx01-bbaa
5 spec:
6 containers:
7 - image: nginx
8 imagePullPolicy: Always
9 name: nginx01
10 terminationMessagePath: /dev/termination-log
11 terminationMessagePolicy: File
12 volumeMounts:
13 - mountPath: /var/lib/www/html000
14 name: bos-pvc
15 readOnly: true
16 livenessProbe:
17 exec:
18 command:
19 - stat
20 - /var/lib/www/html000
21 volumes:
22 - name: bos-pvc
23 persistentVolumeClaim:
24 claimName: bos-pvc
25 readOnly: true
5. 释放 PV 和 PVC 资源
完成存储资源的使用后,可以释放 PVC 和 PV 资源。
使用以下命令可以释放 PVC:
1 $ kubectl delete -f bos-pvc.yaml
释放 PVC 后,原来与之绑定的 PV 状态会变为 Release,如下所示:
1 NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
2 bos-pv 5Gi RWO,ROX Retain Released default/bos-pvc csi-bos 16m
输入以下指令释放 PV 资源:
1 $ kubectl delete -f bos-pv.yaml
方式二:通过控制台操作
- 登陆 CCE 控制台,点击集群名称进入集群详情页面。
- 在集群中创建 AK/SK 的 Secret,用以访问 BOS 存储。获取 AK/SK 参见 如何获取AK/SK。
a. 左侧导航栏选择存储配置 > 保密字典,点击保密字典列表上方新建保密字典。
b. 在新建保密字典页面中配置相关信息,补充 data,确认无误后点击确定。
- 创建持久卷 PV。
a. 左侧导航栏选择存储配置 > 持久卷,点击持久卷列表上方新建持久卷。
b. 可选择表单创建或 yaml 创建,若选择表单创建则需进行相关配置。
c. 根据需求配置存储容量,存储类型选择对象存储 BOS,输入 BOS Bucket 的存储路径,存储路径可前往 BOS 控制台 查看。
d. 输入保存 AK/SK 的 Secret 名称,并选择 Secret 所在命名空间。
e. 在确认配置弹窗中确认配置无误后,点击确定创建 PV。
- 创建持久卷声明 PVC。
a. 左侧导航栏选择存储配置 > 持久卷声明,点击持久卷声明列表上方新建持久卷声明。
b. 根据需求配置存储容量、访问模式后点击确定,在二次弹窗中确认相关配置,其中storageClassName
字段用于和 PV 关联,建议您填写。确认无误后点击确定创建 PVC。
c. 在持久卷声明列表中可以看见 PVC 的绑定状态,若绑定成功则为 Bound,并且在持久卷列中可以看见对应绑定的 PV 名称。
- 创建工作负载并在 Pod 中挂载 PVC。
a. 左侧导航栏选择工作负载 > 无状态部署,选择通过表单 / YAML 创建并配置挂载参数。
b. 由于 CSI bosplugin 依赖 bosfs,强烈建议添加 livenessProbe
,通过 livenessProbe
可以确保在 bosfs 异常重启后,容器能够感知到挂载点是否失效,从而避免相关服务中断。
- 完成存储资源的使用后,可以释放 PVC 和 PV 资源。可以通过对应列表的操作列 > 删除释放 PV 和 PVC 资源。