对象存储卷挂载设置自定义访问密钥(AK/SK)
背景信息
CCE提供了设置自定义访问密钥的能力,可以让IAM用户使用自己的访问密钥挂载对象存储卷,从而可以对OBS进行访问权限控制(具体请参见OBS不同权限控制方式的区别)。
约束与限制
对象存储卷使用自定义访问密钥(AK/SK)时,对应的AK/SK不允许删除或禁用,否则业务容器将无法访问已挂载的对象存储。
获取访问密钥
- 登录控制台。
- 鼠标指向界面右上角的登录用户名,在下拉列表中单击“我的凭证”。
- 在左侧导航栏单击“访问密钥”。
- 单击“新增访问密钥”,进入“新增访问密钥”页面。
- 单击“确定”,下载访问密钥。
使用访问密钥创建Secret
- 获取访问密钥。
- 对访问密钥进行base64编码(假设上文获取到的ak为“xxx”,sk为“yyy”)。
echo -n xxx|base64
echo -n yyy|base64
记录编码后的AK和SK。
- 新建一个secret的yaml,如test-user.yaml。
apiVersion: v1 data: access.key: WE5WWVhVNU***** secret.key: Nnk4emJyZ0***** kind: Secret metadata: name: test-user namespace: default labels: secret.kubernetes.io/used-by: csi type: cfe/secure-opaque
其中:
参数
描述
access.key
base64编码后的ak。
secret.key
base64编码后的sk。
name
secret的名称
namespace
secret的命名空间
secret.kubernetes.io/used-by: csi
带上这个标签才能在控制台上创建OBS PV/PVC时可见。
type
密钥类型,该值必须为cfe/secure-opaque
使用该类型,用户输入的数据会自动加密。
- 创建Secret。
kubectl create -f test-user.yaml
静态创建对象存储卷时指定挂载Secret
使用访问密钥创建Secret后,在创建PV时只需要关联上Secret,就可以使用Secret中的访问密钥(AK/SK)挂载对象存储卷。
- 登录OBS控制台,创建对象存储桶,记录桶名称和存储类型,以并行文件系统为例。
- 新建一个pv的yaml文件,如pv-example.yaml。
apiVersion: v1 kind: PersistentVolume metadata: name: pv-obs-example annotations: pv.kubernetes.io/provisioned-by: everest-csi-provisioner spec: accessModes: - ReadWriteMany capacity: storage: 1Gi csi: nodePublishSecretRef: name: test-user namespace: default driver: obs.csi.everest.io fsType: obsfs volumeAttributes: everest.io/obs-volume-type: STANDARD everest.io/region: ap-southeast-1 storage.kubernetes.io/csiProvisionerIdentity: everest-csi-provisioner volumeHandle: obs-normal-static-pv persistentVolumeReclaimPolicy: Delete storageClassName: csi-obs
参数
描述
nodePublishSecretRef
挂载时指定的密钥,其中
- name:指定secret的名字
- namespace:指定secret的命令空间
fsType
文件类型,支持“obsfs”与“s3fs”,取值为s3fs时创建是obs对象桶,配套使用s3fs挂载;取值为obsfs时创建的是obs并行文件系统,配套使用obsfs挂载。
volumeHandle
对象存储的桶名称。
- 创建PV。
kubectl create -f pv-example.yaml
PV创建完成后,就可以创建PVC关联PV。
- 新建一个PVC的yaml文件,如pvc-example.yaml。
PVC yaml文件配置示例:
apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: csi.storage.k8s.io/node-publish-secret-name: test-user csi.storage.k8s.io/node-publish-secret-namespace: default volume.beta.kubernetes.io/storage-provisioner: everest-csi-provisioner everest.io/obs-volume-type: STANDARD csi.storage.k8s.io/fstype: obsfs name: obs-secret namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-obs volumeName: pv-obs-example
参数
描述
csi.storage.k8s.io/node-publish-secret-name
指定secret的名字
csi.storage.k8s.io/node-publish-secret-namespace
指定secret的命令空间
- 创建PVC。
kubectl create -f pvc-example.yaml
PVC创建后,就可以创建工作负载挂载PVC使用存储。
动态创建对象存储卷时指定挂载密钥
动态创建对象存储卷时,可通过如下方法指定挂载密钥。
- 新建一个pvc的yaml文件,如pvc-example.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: annotations: csi.storage.k8s.io/node-publish-secret-name: test-user csi.storage.k8s.io/node-publish-secret-namespace: default everest.io/obs-volume-type: STANDARD csi.storage.k8s.io/fstype: obsfs name: obs-secret namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 1Gi storageClassName: csi-obs
参数
描述
csi.storage.k8s.io/node-publish-secret-name
指定secret的名字
csi.storage.k8s.io/node-publish-secret-namespace
指定secret的命令空间
- 创建PVC。
kubectl create -f pvc-example.yaml
PVC创建后,就可以创建工作负载挂载PVC使用存储。
配置验证
- 查询工作负载实例名称。
kubectl get po | grep obs-secret
期望输出:
obs-secret-5cd558f76f-vxslv 1/1 Running 0 3m22s
- 查询挂载目录下对象,查询正常。
- 尝试在挂载目录内写入数据,写入失败。
kubectl exec obs-secret-5cd558f76f-vxslv -- touch /temp/test
期望输出:
touch: setting times of '/temp/test': No such file or directory command terminated with exit code 1
- 参考桶策略配置,给挂载桶的子用户设置读写权限。
- 再次尝试在挂载目录内写入数据,写入成功。
kubectl exec obs-secret-5cd558f76f-vxslv -- touch /temp/test
- 查看容器内挂载目录,验证数据写入成功。
kubectl exec obs-secret-5cd558f76f-vxslv -- ls -l /temp/
期望输出:
-rwxrwxrwx 1 root root 0 Jun 7 01:52 test