INT 21h

Hi, I am Vladimir Smagin, SysAdmin and Kaptain. Telegram Email / GIT / RSS / GPG

Kubernetes: Установка S3 provisioner для работы сразу с двумя типами хранилища Селектел

№ 11546 В разделе Sysadmin от March 5th, 2022,
В подшивках: ,

Селектел в настоящее время предоставляет 2 типа хранилища для краткосрочного хранения (стандартный) и долгосрочного (холодное хранилище). Оба типа этих хранилищ доступны для работы через S3 и значит их можно подключить как волюм в ваш кубер. Один удобен для хранения статических файлов сайтов, а другой для хранения бэкапов. Прямо сейчас бегите в панель управления Селектелом и создайте 2 бакета разных типов: k8s-storage-cold и k8s-storage-standart, создайте юзеров и откройте доступ к этим бакетам по S3.

Теперь необходимо заиметь 2 класса хранилища, которые указывают на 2 разных секрета. По настройкам видно, что все волюмы конкретного класса я хочу хранить в одном своем бакете. Хотя можно настроить чтобы бакеты сами создавались, но тогда там черт ногу сломит потом.

---
apiVersion: v1
kind: Secret
metadata:
  namespace: kube-system
  name: csi-s3-secret-standart
stringData:
  accessKeyID: "24534_k8s_std"
  secretAccessKey: "mypassword"
  endpoint: https://s3.selcdn.ru

---
apiVersion: v1
kind: Secret
metadata:
  namespace: kube-system
  name: csi-s3-secret-cold
stringData:
  accessKeyID: "34345_k8s_cold"
  secretAccessKey: "mypassword"
  endpoint: https://s3.selcdn.ru

---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: csi-s3-cold
provisioner: ru.yandex.s3.csi
parameters:
  mounter: goofys
  options: "--memory-limit 1000 --dir-mode 0777 --file-mode 0666"
  bucket: "k8s-storage-cold"
  csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret-cold
  csi.storage.k8s.io/provisioner-secret-namespace: kube-system
  csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret-cold
  csi.storage.k8s.io/controller-publish-secret-namespace: kube-system
  csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret-cold
  csi.storage.k8s.io/node-stage-secret-namespace: kube-system
  csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret-cold
  csi.storage.k8s.io/node-publish-secret-namespace: kube-system

---
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: csi-s3-standart
provisioner: ru.yandex.s3.csi
parameters:
  mounter: goofys
  options: "--memory-limit 1000 --dir-mode 0777 --file-mode 0666"
  bucket: "k8s-storage-standart"
  csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret-standart
  csi.storage.k8s.io/provisioner-secret-namespace: kube-system
  csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret-standart
  csi.storage.k8s.io/controller-publish-secret-namespace: kube-system
  csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret-standart
  csi.storage.k8s.io/node-stage-secret-namespace: kube-system
  csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret-standart
  csi.storage.k8s.io/node-publish-secret-namespace: kube-system

Теперь склонируйте https://github.com/yandex-cloud/k8s-csi-s3 (зеркало) к себе на жесткий диск. В deploy/kubernetes лежат 3 манифеста, которые в обычной установке править не надо, но у меня microk8s, которое устанавливается через snap пакет, значит все пути к файлам на хост машине нужно менять с /var/lib/kubelet на /var/snap/microk8s/common/var/lib/kubelet. Применяете все 3 манифеста и ждете пока поднимутся поды.

Теперь создаем последний ресурс

apiVersion: storage.k8s.io/v1beta1
kind: CSIDriver
metadata:
  name: ru.yandex.s3.csi
spec:
  attachRequired: true
  podInfoOnMount: true

Готово! Можно затестить что получилось

kind: Deployment
apiVersion: apps/v1
metadata:
  name: pimcore-storage-provider
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nfs-s3-provider
      component: storage
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-s3-provider
        component: storage
    spec:
      containers:
        - name: shell
          image: busybox:stable
          command:
            - "/bin/sh"
          args:
            - "-c"
            - "while true; do sleep 30; done;"
          volumeMounts:
            - name: conf-volume
              mountPath: /conf
              subPath: conf
            - name: data-volume
              mountPath: /data
              subPath: datatouch test

        - name: httpd
          image: httpd
          volumeMounts:
            - name: conf-volume
              mountPath: /conf
              subPath: conf
            - name: data-volume
              mountPath: /data
              subPath: data

      volumes:
        - name: conf-volume
          persistentVolumeClaim:
            claimName: test-s3-mount
        - name: data-volume
          persistentVolumeClaim:
            claimName: test-s3-mount-cold
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-s3-mount
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: csi-s3-standart
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: test-s3-mount-cold
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 5Gi
  storageClassName: csi-s3-cold

Создали под в контейнеры которого монтируются 2 разных типа хранилища, теперь можно поиграться и в прод!

Нет комментариев »

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Облачная платформа

Микроблог перейти


🇷🇺 © Vladimir Smagin, 2005-2023. Копирование материалов без разрешения запрещено. GPG *
Яндекс.Метрика

Fortune cookie: YOW!! Everybody out of the GENETIC POOL!