«

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 这种自定义路径功能。驱动逻辑是:

✻ 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 参数。

所以结论是:

k8s kubernetes oss csi yandex s3 bucket


正文到此结束
版权声明:若无特殊注明,本文皆为 Myluzh Blog 原创,转载请保留文章出处。
文章内容:https://itho.cn/k8s/601.html
文章标题:《Kubernetes 使用 Yandex CSI-S3 驱动挂载 S3 兼容对象存储