Kubernetes 使用 Yandex CSI-S3 驱动挂载 S3 兼容对象存储
myluzh 发布于 阅读:30 Kubernetes
0x01 介绍
项目地址:https://github.com/yandex-cloud/k8s-csi-s3
这是用于 S3(或兼容 S3)存储的容器存储接口 ( CSI )。它可以动态分配存储桶并通过安装将它们安装到任何容器中。
0x02 安装 yandex-s3/csi-s3
# 安装helm
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-4
chmod 700 get_helm.sh
./get_helm.sh
# 安装
git clone https://github.com/yandex-cloud/k8s-csi-s3.git
helm install csi-s3 /root/k8s-csi-s3/deploy/helm/csi-s3
# 创建secret
kubectl apply -f - <<EOF
apiVersion: v1
kind: Secret
metadata:
name: csi-s3-secret
namespace: kube-system
stringData:
accessKeyID: <ak> # 你对象存储的ak
secretAccessKey: <sk> # 你对象存储的sk
endpoint: https://eos-wuxi-1-internal.cmecloud.cn
EOF
# 创建资源
cd /root/k8s-csi-s3/deploy/kubernetes
kubectl create -f provisioner.yaml
kubectl create -f driver.yaml
kubectl create -f csi-s3.yaml
# 创建sc,需要在 storageclass.yaml 修改 bucket名称。
root@k8s-master-01:~/k8s-csi-s3/deploy/kubernetes/examples# cd /root/k8s-csi-s3/deploy/kubernetes/examples
root@k8s-master-01:~/k8s-csi-s3/deploy/kubernetes/examples# vi storageclass.yaml
root@k8s-master-01:~/k8s-csi-s3/deploy/kubernetes/examples# kubectl apply -f storageclass.yaml
检查资源
root@k8s-master-01:~/k8s-csi-s3/deploy/kubernetes/examples# kubectl get pod -A | grep csi
kube-system csi-s3-6jchg 2/2 Running 0 9m49s
kube-system csi-s3-dmnll 2/2 Running 0 9m49s
kube-system csi-s3-provisioner-0 2/2 Running 0 9m49s
root@k8s-master-01:~/k8s-csi-s3/deploy/kubernetes/examples# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
csi-s3 ru.yandex.s3.csi Delete Immediate false 4s
测试挂载
kubectl apply -f - <<EOF
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: csi-s3-pvc
namespace: default
spec:
accessModes:
- ReadWriteOnce
storageClassName: csi-s3
resources:
requests:
storage: 1Gi
---
apiVersion: v1
kind: Pod
metadata:
name: csi-s3-test-nginx1
namespace: default
spec:
containers:
- name: csi-s3-test-nginx
image: swr.cn-east-3.myhuaweicloud.com/itho/docker.io/nginx:1.24-amd64
volumeMounts:
- mountPath: /usr/share/nginx/html
name: webroot
volumes:
- name: webroot
persistentVolumeClaim:
claimName: csi-s3-pvc
EOF
# 查看pvd bound状态
root@k8s-master-01:~/k8s-csi-s3/deploy/kubernetes# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS VOLUMEATTRIBUTESCLASS AGE
csi-s3-pvc Bound pvc-f71b5cdc-94e4-406f-b7e1-fce094a31469 1Gi RWO csi-s3 <unset> 4m56s
自定义路径名称
那yandex支持什么?
⏺ Yandex CSI-S3 驱动支持的 StorageClass 参数就这几个:
┌─────────┬─────────────────────────┬─────────────────────────────────────┐
│ 参数 │ 说明 │ 示例 │
├─────────┼─────────────────────────┼─────────────────────────────────────┤
│ mounter │ 挂载方式 │ geesefs(默认)、s3fs、rclone │
├─────────┼─────────────────────────┼─────────────────────────────────────┤
│ bucket │ 指定已有的 S3 桶名 │ ec-k8s │
├─────────┼─────────────────────────┼─────────────────────────────────────┤
│ options │ 传给 mounter 的额外参数 │ --memory-limit 1000 --dir-mode 0777 │
└─────────┴─────────────────────────┴─────────────────────────────────────┘
加上标准的 CSI secret 引用参数(那些 csi.storage.k8s.io/*)。
不支持 usePrefix、prefix 这种自定义路径功能。驱动逻辑是:
- 有 bucket → 在桶下创建 pvc-xxx 子目录
-
没有 bucket → 创建新桶,桶名就是 pvc-xxx
想要自定义 S3 路径名,只能走静态 PV。
✻ Cooked for 21s
❯ 你不是说支持prefix吗
⏺ 我之前说的不准确,抱歉。看了代码实际情况是:
if params[mounter.BucketKey] != "" {
bucketName = params[mounter.BucketKey]
prefix = volumeID // volumeID 是自动生成的 pvc-xxx,用户无法控制
volumeID = path.Join(bucketName, prefix)
}
驱动内部确实用了 prefix 机制,但这个 prefix 是自动生成的 pvc-xxx,不是用户可以通过参数自定义的。代码里没有任何地方读取用户传入的 prefix 参数。
所以结论是:
- Yandex 驱动没有暴露 prefix / usePrefix 给用户配置
- 指定 bucket 后,路径永远是 bucket名/pvc-xxx
-
要自定义路径名,只能用静态 PV
是我之前分析时表述有误,不是"支持自定义 prefix",而是"内部用了 prefix 但名字不可控"。
k8s kubernetes oss csi yandex s3 bucket