From 4f7a9fb4dfa8e8a32ee5689dd44670804fe9f4b6 Mon Sep 17 00:00:00 2001 From: yourh3ro Date: Mon, 16 Sep 2024 18:35:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=97#12=20=D0=A3=D1=81=D1=82=D0=B0?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D0=BA=D0=B0=20=D0=B8=20=D0=B8=D1=81=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20?= =?UTF-8?q?CSI=20=D0=B4=D1=80=D0=B0=D0=B9=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + img/image19.png | Bin 0 -> 38141 bytes kubernetes-csi/README.md | 100 ++++++++++++++ kubernetes-csi/csi-s3/Chart.yaml | 11 ++ kubernetes-csi/csi-s3/README.md | 41 ++++++ kubernetes-csi/csi-s3/manifest.yaml | 121 ++++++++++++++++ kubernetes-csi/csi-s3/templates/csi-s3.yaml | 129 ++++++++++++++++++ kubernetes-csi/csi-s3/templates/driver.yaml | 10 ++ .../csi-s3/templates/provisioner.yaml | 116 ++++++++++++++++ kubernetes-csi/csi-s3/templates/secret.yaml | 18 +++ .../csi-s3/templates/storageclass.yaml | 26 ++++ kubernetes-csi/csi-s3/values.yaml | 50 +++++++ kubernetes-csi/yc-s3-pvc.yml | 12 ++ kubernetes-csi/yc-s3-sc.yaml | 22 +++ kubernetes-csi/yc-s3-secret.yaml | 13 ++ kubernetes-csi/yc-s3-test-storage-pod.yaml | 18 +++ 16 files changed, 688 insertions(+) create mode 100644 img/image19.png create mode 100644 kubernetes-csi/README.md create mode 100644 kubernetes-csi/csi-s3/Chart.yaml create mode 100644 kubernetes-csi/csi-s3/README.md create mode 100644 kubernetes-csi/csi-s3/manifest.yaml create mode 100644 kubernetes-csi/csi-s3/templates/csi-s3.yaml create mode 100644 kubernetes-csi/csi-s3/templates/driver.yaml create mode 100644 kubernetes-csi/csi-s3/templates/provisioner.yaml create mode 100644 kubernetes-csi/csi-s3/templates/secret.yaml create mode 100644 kubernetes-csi/csi-s3/templates/storageclass.yaml create mode 100644 kubernetes-csi/csi-s3/values.yaml create mode 100644 kubernetes-csi/yc-s3-pvc.yml create mode 100644 kubernetes-csi/yc-s3-sc.yaml create mode 100644 kubernetes-csi/yc-s3-secret.yaml create mode 100644 kubernetes-csi/yc-s3-test-storage-pod.yaml diff --git a/README.md b/README.md index b70f9e1..624e005 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ [ДЗ#9 Сервисы централизованного логирования для Kubernetes](kubernetes-logging/README.md) [ДЗ#10 GitOps и инструменты поставки](kubernetes-gitops/README.md) [ДЗ#11 Хранилище секретов для приложения. Vault.](kubernetes-vault/README.md) +[ДЗ#12 Установка и использование CSI драйвера](kubernetes-csi/README.md) ## Tricks, Tools, Hints ### k9s diff --git a/img/image19.png b/img/image19.png new file mode 100644 index 0000000000000000000000000000000000000000..a209ffe67c85d0df9ee534b119fe0c023046bcc6 GIT binary patch literal 38141 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.13" +images: + - full: images.registrar + - full: images.provisioner + - full: images.csi +user_values: + - name: storageClass.create + title: + en: Create storage class + ru: Создать класс хранения + description: + en: Specifies whether the storage class should be created + ru: Выберите, чтобы создать новый S3-класс хранения при развёртывании приложения. + boolean_value: + default_value: true + - name: secret.create + title: + en: Create secret + ru: Создать секрет + description: + en: Specifies whether the secret should be created + ru: Выберите, чтобы создать новый секрет для класса хранения при установке приложения, а не использовать существующий. + boolean_value: + default_value: true + - name: secret.accessKey + title: + en: S3 Access Key ID + ru: Идентификатор ключа S3 + description: + en: S3 Access Key ID + ru: Идентификатор ключа S3. + string_value: + default_value: "" + - name: secret.secretKey + title: + en: S3 Secret Key + ru: Секретный ключ S3 + description: + en: S3 Secret Key + ru: Секретный ключ S3. + string_value: + default_value: "" + - name: storageClass.singleBucket + title: + en: Single S3 bucket for volumes + ru: Общий бакет S3 для томов + description: + en: Single S3 bucket to use for all dynamically provisioned persistent volumes + ru: Общий бакет S3, в котором будут создаваться все динамически распределяемые тома. Если пусто, под каждый том будет создаваться новый бакет. + string_value: + default_value: "" + - name: secret.endpoint + title: + en: S3 endpoint + ru: Адрес S3-сервиса + description: + en: S3 service endpoint to use + ru: Адрес S3-сервиса, который будет использоваться. + string_value: + default_value: "https://storage.yandexcloud.net" + - name: secret.region + title: + en: S3 region + ru: S3 регион + description: + en: S3 service region to use + ru: Регион используемого сервиса S3. + string_value: + default_value: "" + - name: storageClass.mountOptions + title: + en: GeeseFS mount options + ru: Опции монтирования GeeseFS + description: + en: GeeseFS mount options to use. Refer to `geesefs --help` command output for the whole list of options (https://github.com/yandex-cloud/geesefs). + ru: Опции монтирования GeeseFS. Полный перечень и описание опций смотрите в выводе команды `geesefs --help` (https://github.com/yandex-cloud/geesefs). + string_value: + default_value: "--memory-limit 1000 --dir-mode 0777 --file-mode 0666" + - name: storageClass.reclaimPolicy + title: + en: Volume reclaim policy + ru: Политика очистки томов + description: + en: Volume reclaim policy for the storage class (Retain or Delete) + ru: Выберите политику очистки томов PersistentVolume при удалении PersistentVolumeClaim. Retain — сохранять том, Delete — удалять том. + string_selector_value: + default_value: Delete + values: + - Delete + - Retain + - name: storageClass.name + title: + en: Storage class name + ru: Название класса хранения + description: + en: Name of the storage class that will be created + ru: Название класса хранения, который будет создан при установке. + string_value: + default_value: csi-s3 + - name: secret.name + title: + en: Name of the secret + ru: Название секрета + description: + en: Name of the secret to create or use for the storage class + ru: Название секрета, который будет создан или использован для класса хранения. + string_value: + default_value: csi-s3-secret + - name: tolerations.all + title: + en: Tolerate all taints + ru: Игнорировать все политики taint + description: + en: Tolerate all taints by the CSI-S3 node driver (mounter) + ru: Выберите, чтобы драйвер CSI, который монтирует файловую систему на узлах, игнорировал все политики taint для узлов кластера. + boolean_value: + default_value: false diff --git a/kubernetes-csi/csi-s3/templates/csi-s3.yaml b/kubernetes-csi/csi-s3/templates/csi-s3.yaml new file mode 100644 index 0000000..9732b6c --- /dev/null +++ b/kubernetes-csi/csi-s3/templates/csi-s3.yaml @@ -0,0 +1,129 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: csi-s3 + namespace: {{ .Release.Namespace }} +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: csi-s3 +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: csi-s3 +subjects: + - kind: ServiceAccount + name: csi-s3 + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: csi-s3 + apiGroup: rbac.authorization.k8s.io +--- +kind: DaemonSet +apiVersion: apps/v1 +metadata: + name: csi-s3 + namespace: {{ .Release.Namespace }} +spec: + selector: + matchLabels: + app: csi-s3 + template: + metadata: + labels: + app: csi-s3 + spec: + tolerations: + {{- if .Values.tolerations.all }} + - operator: Exists + {{- else }} + - key: CriticalAddonsOnly + operator: Exists + - operator: Exists + effect: NoExecute + tolerationSeconds: 300 + {{- end }} + {{- with .Values.tolerations.node }} + {{- toYaml . | nindent 8 }} + {{- end }} + serviceAccount: csi-s3 + containers: + - name: driver-registrar + image: {{ .Values.images.registrar }} + args: + - "--kubelet-registration-path=$(DRIVER_REG_SOCK_PATH)" + - "--v=4" + - "--csi-address=$(ADDRESS)" + env: + - name: ADDRESS + value: /csi/csi.sock + - name: DRIVER_REG_SOCK_PATH + value: {{ .Values.kubeletPath }}/plugins/ru.yandex.s3.csi/csi.sock + - name: KUBE_NODE_NAME + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumeMounts: + - name: plugin-dir + mountPath: /csi + - name: registration-dir + mountPath: /registration/ + - name: csi-s3 + securityContext: + privileged: true + capabilities: + add: ["SYS_ADMIN"] + allowPrivilegeEscalation: true + image: {{ .Values.images.csi }} + imagePullPolicy: IfNotPresent + args: + - "--endpoint=$(CSI_ENDPOINT)" + - "--nodeid=$(NODE_ID)" + - "--v=4" + env: + - name: CSI_ENDPOINT + value: unix:///csi/csi.sock + - name: NODE_ID + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumeMounts: + - name: plugin-dir + mountPath: /csi + - name: stage-dir + mountPath: {{ .Values.kubeletPath }}/plugins/kubernetes.io/csi + mountPropagation: "Bidirectional" + - name: pods-mount-dir + mountPath: {{ .Values.kubeletPath }}/pods + mountPropagation: "Bidirectional" + - name: fuse-device + mountPath: /dev/fuse + - name: systemd-control + mountPath: /run/systemd + volumes: + - name: registration-dir + hostPath: + path: {{ .Values.kubeletPath }}/plugins_registry/ + type: DirectoryOrCreate + - name: plugin-dir + hostPath: + path: {{ .Values.kubeletPath }}/plugins/ru.yandex.s3.csi + type: DirectoryOrCreate + - name: stage-dir + hostPath: + path: {{ .Values.kubeletPath }}/plugins/kubernetes.io/csi + type: DirectoryOrCreate + - name: pods-mount-dir + hostPath: + path: {{ .Values.kubeletPath }}/pods + type: Directory + - name: fuse-device + hostPath: + path: /dev/fuse + - name: systemd-control + hostPath: + path: /run/systemd + type: DirectoryOrCreate diff --git a/kubernetes-csi/csi-s3/templates/driver.yaml b/kubernetes-csi/csi-s3/templates/driver.yaml new file mode 100644 index 0000000..c3095e6 --- /dev/null +++ b/kubernetes-csi/csi-s3/templates/driver.yaml @@ -0,0 +1,10 @@ +apiVersion: storage.k8s.io/v1 +kind: CSIDriver +metadata: + name: ru.yandex.s3.csi +spec: + attachRequired: false + podInfoOnMount: true + fsGroupPolicy: File # added in Kubernetes 1.19, this field is GA as of Kubernetes 1.23 + volumeLifecycleModes: # added in Kubernetes 1.16, this field is beta + - Persistent diff --git a/kubernetes-csi/csi-s3/templates/provisioner.yaml b/kubernetes-csi/csi-s3/templates/provisioner.yaml new file mode 100644 index 0000000..d8c4eb3 --- /dev/null +++ b/kubernetes-csi/csi-s3/templates/provisioner.yaml @@ -0,0 +1,116 @@ +apiVersion: v1 +kind: ServiceAccount +metadata: + name: csi-s3-provisioner-sa + namespace: {{ .Release.Namespace }} +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: csi-s3-external-provisioner-runner +rules: + - apiGroups: [""] + resources: ["secrets"] + verbs: ["get", "list"] + - apiGroups: [""] + resources: ["persistentvolumes"] + verbs: ["get", "list", "watch", "create", "delete"] + - apiGroups: [""] + resources: ["persistentvolumeclaims"] + verbs: ["get", "list", "watch", "update"] + - apiGroups: ["storage.k8s.io"] + resources: ["storageclasses"] + verbs: ["get", "list", "watch"] + - apiGroups: [""] + resources: ["events"] + verbs: ["list", "watch", "create", "update", "patch"] +--- +kind: ClusterRoleBinding +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: csi-s3-provisioner-role +subjects: + - kind: ServiceAccount + name: csi-s3-provisioner-sa + namespace: {{ .Release.Namespace }} +roleRef: + kind: ClusterRole + name: csi-s3-external-provisioner-runner + apiGroup: rbac.authorization.k8s.io +--- +kind: Service +apiVersion: v1 +metadata: + name: csi-s3-provisioner + namespace: {{ .Release.Namespace }} + labels: + app: csi-s3-provisioner +spec: + selector: + app: csi-s3-provisioner + ports: + - name: csi-s3-dummy + port: 65535 +--- +kind: StatefulSet +apiVersion: apps/v1 +metadata: + name: csi-s3-provisioner + namespace: {{ .Release.Namespace }} +spec: + serviceName: "csi-provisioner-s3" + replicas: 1 + selector: + matchLabels: + app: csi-s3-provisioner + template: + metadata: + labels: + app: csi-s3-provisioner + spec: + serviceAccount: csi-s3-provisioner-sa + tolerations: + - key: node-role.kubernetes.io/master + operator: Exists + - key: CriticalAddonsOnly + operator: Exists + {{- with .Values.tolerations.controller }} + {{- toYaml . | nindent 8 }} + {{- end }} + {{- with .Values.nodeSelector }} + nodeSelector: + {{- toYaml . | nindent 8 }} + {{- end }} + containers: + - name: csi-provisioner + image: {{ .Values.images.provisioner }} + args: + - "--csi-address=$(ADDRESS)" + - "--v=4" + env: + - name: ADDRESS + value: {{ .Values.kubeletPath }}/plugins/ru.yandex.s3.csi/csi.sock + imagePullPolicy: "IfNotPresent" + volumeMounts: + - name: socket-dir + mountPath: {{ .Values.kubeletPath }}/plugins/ru.yandex.s3.csi + - name: csi-s3 + image: {{ .Values.images.csi }} + imagePullPolicy: IfNotPresent + args: + - "--endpoint=$(CSI_ENDPOINT)" + - "--nodeid=$(NODE_ID)" + - "--v=4" + env: + - name: CSI_ENDPOINT + value: unix://{{ .Values.kubeletPath }}/plugins/ru.yandex.s3.csi/csi.sock + - name: NODE_ID + valueFrom: + fieldRef: + fieldPath: spec.nodeName + volumeMounts: + - name: socket-dir + mountPath: {{ .Values.kubeletPath }}/plugins/ru.yandex.s3.csi + volumes: + - name: socket-dir + emptyDir: {} diff --git a/kubernetes-csi/csi-s3/templates/secret.yaml b/kubernetes-csi/csi-s3/templates/secret.yaml new file mode 100644 index 0000000..7ff48f9 --- /dev/null +++ b/kubernetes-csi/csi-s3/templates/secret.yaml @@ -0,0 +1,18 @@ +{{- if .Values.secret.create -}} +apiVersion: v1 +kind: Secret +metadata: + namespace: {{ .Release.Namespace }} + name: {{ .Values.secret.name }} +stringData: +{{- if .Values.secret.accessKey }} + accessKeyID: {{ .Values.secret.accessKey }} +{{- end }} +{{- if .Values.secret.secretKey }} + secretAccessKey: {{ .Values.secret.secretKey }} +{{- end }} + endpoint: {{ .Values.secret.endpoint }} +{{- if .Values.secret.region }} + region: {{ .Values.secret.region }} +{{- end }} +{{- end -}} diff --git a/kubernetes-csi/csi-s3/templates/storageclass.yaml b/kubernetes-csi/csi-s3/templates/storageclass.yaml new file mode 100644 index 0000000..e40d699 --- /dev/null +++ b/kubernetes-csi/csi-s3/templates/storageclass.yaml @@ -0,0 +1,26 @@ +{{- if .Values.storageClass.create -}} +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: {{ .Values.storageClass.name }} +{{- if .Values.storageClass.annotations }} + annotations: +{{ toYaml .Values.storageClass.annotations | indent 4 }} +{{- end }} +provisioner: ru.yandex.s3.csi +parameters: + mounter: "{{ .Values.storageClass.mounter }}" + options: "{{ .Values.storageClass.mountOptions }}" +{{- if .Values.storageClass.singleBucket }} + bucket: "{{ .Values.storageClass.singleBucket }}" +{{- end }} + csi.storage.k8s.io/provisioner-secret-name: {{ .Values.secret.name }} + csi.storage.k8s.io/provisioner-secret-namespace: {{ .Release.Namespace }} + csi.storage.k8s.io/controller-publish-secret-name: {{ .Values.secret.name }} + csi.storage.k8s.io/controller-publish-secret-namespace: {{ .Release.Namespace }} + csi.storage.k8s.io/node-stage-secret-name: {{ .Values.secret.name }} + csi.storage.k8s.io/node-stage-secret-namespace: {{ .Release.Namespace }} + csi.storage.k8s.io/node-publish-secret-name: {{ .Values.secret.name }} + csi.storage.k8s.io/node-publish-secret-namespace: {{ .Release.Namespace }} +reclaimPolicy: {{ .Values.storageClass.reclaimPolicy }} +{{- end -}} diff --git a/kubernetes-csi/csi-s3/values.yaml b/kubernetes-csi/csi-s3/values.yaml new file mode 100644 index 0000000..d53b880 --- /dev/null +++ b/kubernetes-csi/csi-s3/values.yaml @@ -0,0 +1,50 @@ +--- +images: + # Source: quay.io/k8scsi/csi-node-driver-registrar:v1.2.0 + registrar: cr.yandex/crp9ftr22d26age3hulg/yandex-cloud/csi-s3/csi-node-driver-registrar:v1.2.0 + # Source: quay.io/k8scsi/csi-provisioner:v2.1.0 + provisioner: cr.yandex/crp9ftr22d26age3hulg/yandex-cloud/csi-s3/csi-provisioner:v2.1.0 + # Main image + csi: cr.yandex/crp9ftr22d26age3hulg/yandex-cloud/csi-s3/csi-s3-driver:0.41.1 + +storageClass: + # Specifies whether the storage class should be created + create: true + # Name + name: csi-s3 + # Use a single bucket for all dynamically provisioned persistent volumes + singleBucket: "" + # mounter to use - either geesefs, s3fs or rclone (default geesefs) + mounter: geesefs + # GeeseFS mount options + mountOptions: "--memory-limit 1000 --dir-mode 0777 --file-mode 0666" + # Volume reclaim policy + reclaimPolicy: Delete + # Annotations for the storage class + # Example: + # annotations: + # storageclass.kubernetes.io/is-default-class: "true" + annotations: {} + +secret: + # Specifies whether the secret should be created + create: true + # Name of the secret + name: csi-s3-secret + # S3 Access Key + accessKey: "" + # S3 Secret Key + secretKey: "" + # Endpoint + endpoint: https://storage.yandexcloud.net + # Region + region: "" + +tolerations: + all: false + node: [] + controller: [] + +nodeSelector: {} + +kubeletPath: /var/lib/kubelet diff --git a/kubernetes-csi/yc-s3-pvc.yml b/kubernetes-csi/yc-s3-pvc.yml new file mode 100644 index 0000000..c976b9a --- /dev/null +++ b/kubernetes-csi/yc-s3-pvc.yml @@ -0,0 +1,12 @@ +apiVersion: v1 +kind: PersistentVolumeClaim +metadata: + name: csi-s3-pvc + namespace: default +spec: + accessModes: + - ReadWriteMany + resources: + requests: + storage: 5Gi + storageClassName: csi-s3-existing-bucket \ No newline at end of file diff --git a/kubernetes-csi/yc-s3-sc.yaml b/kubernetes-csi/yc-s3-sc.yaml new file mode 100644 index 0000000..068759a --- /dev/null +++ b/kubernetes-csi/yc-s3-sc.yaml @@ -0,0 +1,22 @@ +--- +kind: StorageClass +apiVersion: storage.k8s.io/v1 +metadata: + name: csi-s3-existing-bucket +provisioner: ru.yandex.s3.csi +parameters: + mounter: geesefs + # you can set mount options here, for example limit memory cache size (recommended) + options: "--memory-limit 1000 --dir-mode 0777 --file-mode 0666" + bucket: otus-backet + # to use an existing bucket, specify it here: + #bucket: some-existing-bucket + csi.storage.k8s.io/provisioner-secret-name: csi-s3-secret + csi.storage.k8s.io/provisioner-secret-namespace: kube-system + csi.storage.k8s.io/controller-publish-secret-name: csi-s3-secret + csi.storage.k8s.io/controller-publish-secret-namespace: kube-system + csi.storage.k8s.io/node-stage-secret-name: csi-s3-secret + csi.storage.k8s.io/node-stage-secret-namespace: kube-system + csi.storage.k8s.io/node-publish-secret-name: csi-s3-secret + csi.storage.k8s.io/node-publish-secret-namespace: kube-system +volumeBindingMode: Immediate \ No newline at end of file diff --git a/kubernetes-csi/yc-s3-secret.yaml b/kubernetes-csi/yc-s3-secret.yaml new file mode 100644 index 0000000..84ba3ac --- /dev/null +++ b/kubernetes-csi/yc-s3-secret.yaml @@ -0,0 +1,13 @@ +apiVersion: v1 +kind: Secret +metadata: + name: csi-s3-secret + # Namespace depends on the configuration in the storageclass.yaml + namespace: kube-system +stringData: + accessKeyID: YCAJEEk4qXN_sO0yM5WJ-YlGJ + secretAccessKey: YCN_rF2gbEDttu3qhgkPBC_BolC******** + # For AWS set it to "https://s3..amazonaws.com", for example https://s3.eu-central-1.amazonaws.com + endpoint: https://storage.yandexcloud.net + # For AWS set it to AWS region + #region: "" \ No newline at end of file diff --git a/kubernetes-csi/yc-s3-test-storage-pod.yaml b/kubernetes-csi/yc-s3-test-storage-pod.yaml new file mode 100644 index 0000000..a2f76aa --- /dev/null +++ b/kubernetes-csi/yc-s3-test-storage-pod.yaml @@ -0,0 +1,18 @@ +apiVersion: v1 +kind: Pod +metadata: + name: yc-s3-test-storage-pod + namespace: default +spec: + containers: + - name: yc-s3-test-storage-pod + image: busybox:1.31.1 + command: [ "sh", "-c", "dd if=/dev/zero of=/data/storage-test.img bs=1M count=256 && sleep 3600" ] + volumeMounts: + - name: data + mountPath: /data + volumes: + - name: data + persistentVolumeClaim: + claimName: csi-s3-pvc + readOnly: false \ No newline at end of file