背景信息
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