背景信息
Everest在1.2.8及以上版本提供了设置自定义访问密钥的能力,这样可以让IAM用户使用自己的访问密钥挂载对象存储卷,从而可以对OBS进行访问权限控制。
前提条件
- Everest要求1.2.8及以上版本。
- 集群要求1.15.11及以上版本。
约束与限制
自定义访问密钥暂不支持安全容器。
关闭自动挂载访问密钥
老版本控制台会要求您上传AK/SK,对象存储卷挂载时默认使用您上传的访问密钥,相当于所有IAM用户(即子用户)都使用的是同一个访问密钥挂载的对象捅,对桶的权限都是一样的,导致无法对IAM用户使用对象存储桶进行权限控制。
如果您之前上传过AK/SK,为防止IAM用户越权,建议关闭自动挂载访问密钥,即需要在Everest插件中将disable_auto_mount_secret参数打开,这样使用对象存储时就不会自动使用在控制台上传的访问密钥。
说明
设置disable-auto-mount-secret时要求当前集群中无对象存储卷,否则挂载了该对象卷的工作负载扩容或重启的时候会由于必须指定访问密钥而导致挂卷失败。
disable-auto-mount-secret设置为true后,则创建PV和PVC时必须指定挂载访问密钥,否则会导致对象卷挂载失败。
kubectl edit ds everest-csi-driver -nkube-system
搜索disable-auto-mount-secret,并将值设置为true。
执行 :wq 保存退出,等待实例重启完毕即可。
使用访问密钥创建Secret
步骤 1 获取访问密钥。
步骤 2 对访问密钥进行base64编码(假设上文获取到的ak为“xxx”,sk为“yyy”)。
echo -n xxx|base64
echo -n yyy|base64
记录编码后的AK和SK。
步骤 3 新建一个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使用该类型,用户输入的数据会自动加密。 |
步骤 4 创建Secret。
kubectl create -f test-user.yaml
静态创建对象存储卷时指定挂载Secret
使用访问密钥创建Secret后,在创建PV时只需要关联上Secret,就可以使用Secret中的访问密钥(AK/SK)挂载对象存储卷。
步骤 1 登录OBS控制台,创建对象存储桶,记录桶名称和存储类型,以并行文件系统为例。
步骤 2 新建一个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: cn-north-4
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 | 对象存储的桶名称。 |
步骤 3 创建PV。
kubectl create -f pv-example.yaml
PV创建完成后,就可以创建PVC关联PV。
步骤 4 新建一个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的命令空间 |
步骤 5 创建PVC。
kubectl create -f pvc-example.yaml
PVC创建后,就可以创建工作负载挂载PVC使用存储。
动态创建对象存储卷时指定挂载密钥
动态创建对象存储卷时,可通过如下方法指定挂载密钥。
步骤 1 新建一个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的命令空间 |
步骤 2 创建PVC。
kubectl create -f pvc-example.yaml
PVC创建后,就可以创建工作负载挂载PVC使用存储。
配置验证
根据上述步骤,使用IAM用户的密钥挂载对象存储卷。假设工作负载名称为obs-secret,容器内挂载目录是/temp,IAM用户权限为CCE ReadOnlyAccess和Tenant Guest。
- 查询工作负载实例名称。
kubectl get po | grep obs-secret
期望输出:
obs-secret-5cd558f76f-vxslv 1/1 Running 0 3m22s
- 查询挂载目录下对象,查询正常。
kubectl exec obs-secret-5cd558f76f-vxslv -- ls -l /temp/
- 尝试在挂在目录内写入数据,写入失败。
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
- 在OBS控制台配置桶策略,给挂载桶的子用户设置读写权限。
- 再次尝试在挂在目录内写入数据,写入成功。
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