Как динамическая инициализация настраивается в Kubernetes
В Kubernetes динамическое предоставление тома основано на объекте API StorageClass из группы API storage.k8s.io.
Как администратор кластера, вы определите столько объектов StorageClass, сколько необходимо, каждый из которых задает плагин тома (инициатора), который предоставляет том и набор параметров для передачи этому провайдеру при инициализации.
Настройка GlusterFS и Heketi
Ожидается, что у вас есть работающие Gluster и Heketi, прежде чем вы продолжите настройку на конце Kubernetes.
Обратитесь к нашему руководству по настройке.
На данный момент у нас есть только руководство по CentOS, но мы работаем над руководством по развертыванию для систем Ubuntu / Debian.
После завершения установки перейдите к шагу 2:
Создать объект StorageClass в Kubernetes
Нам нужно создать объект StorageClass, чтобы включить динамическую инициализацию для пользователей контейнерной платформы.
Объекты StorageClass определяют, какой поставщик должен использоваться и какие параметры должны быть переданы этому поставщику при вызове динамической подготовки.
Проверьте свой идентификатор кластера Heketi
$ heketi-cli cluster list
Clusters:
Id:b182cb76b881a0be2d44bd7f8fb07ea4 [file][block]
Создйте секрет Kubernetes
Получите в формате base64 свой пароль администратора Heketi.
$ echo -n "PASSWORD" | base64
$ vim gluster-secret.yaml apiVersion: v1 kind: Secret metadata: name: heketi-secret namespace: default type: "kubernetes.io/glusterfs" data: # echo -n "PASSWORD" | base64 key: cGFzc3dvcmQ=
Где:
$ kubectl create -f gluster-secret.yaml
$ kubectl get secret
NAME TYPE DATA AGE
heketi-secret kubernetes.io/glusterfs 1 1d
$ cat glusterfs-sc.yaml kind: StorageClass apiVersion: storage.k8s.io/v1beta1 metadata: name: gluster-heketi provisioner: kubernetes.io/glusterfs reclaimPolicy: Delete volumeBindingMode: Immediate allowVolumeExpansion: true parameters: resturl: "http://heketiserverip:8080" restuser: "admin" secretName: "heketi-secret" secretNamespace: "default" volumetype: "replicate:2" volumenameprefix: "k8s-dev" clusterid: "b182cb76b881a0be2d44bd7f8fb07ea4"
- Где:
- gluster-heketi – это имя класса StorageClass, который будет создан.
- Допустимые параметры политики возврата: Retain, Delete или Recycle.». Политика Delete означает, что динамически подготовленный том автоматически удаляется, когда пользователь удаляет соответствующий PersistentVolumeClaim.
- Поле volumeBindingMode определяет, когда должны выполняться привязка тома и динамическая подготовка.
- Допустимые параметры: Immediate & WaitForFirstConsumer. Непосредственный режим указывает, что привязка тома и динамическая инициализация происходят после создания PersistentVolumeClaim.
- Режим WaitForFirstConsumer задерживает привязку и предоставление PersistentVolume до тех пор, пока не будет создан Pod, использующий PersistentVolumeClaim.
- Resturl – это URL вашей конечной точки heketi.
- heketi-secret– это секрет, созданный для полномочий heketi. По умолчанию это имя пространства имен, в котором был создан секрет
- replicate: 2 указывает коэффициент репликации по умолчанию для созданных томов кластера. Для большего количества HA используйте 3.
- volumenameprefix: по умолчанию динамически подготовленные тома имеют схему именования в формате vol_UUID. Мы предоставили желаемое имя тома из хранилища.
- Таким образом, схема именования будет иметь вид: ulmenameprefix_Namespace_PVCname_randomUUID
- b182cb76b881a0be2d44bd7f8fb07ea4 – идентификатор кластера, полученный из команды heketi-cli cluster list
Другой параметр, который можно установить:
volumeoptions: "user.heketi.zone-checking strict"
Настройка / поведение по умолчанию:
volumeoptions: "user.heketi.zone-checking none"
Это заставляет Heketi строго размещать реплики в разных зонах.
Требуемое минимальное количество узлов, необходимых для присутствия в разных зонах, равно 3, если значение реплики установлено на 3.
После создания файла выполните следующую команду, чтобы создать объект StorageClass.
$ kubectl create -f gluster-sc.yaml
Подтвердите создание StorageClass.
$ kubectl get sc
NAME PROVISIONER AGE
glusterfs-heketi kubernetes.io/glusterfs 1d
local-storage kubernetes.io/no-provisioner 30d
Шаг 2. Создание объекта PersistentVolumeClaim
Когда пользователь запрашивает динамически предоставленное хранилище, класс хранилища должен быть включен в PersistentVolumeClaim.
Давайте создадим 1 ГБ-ый запрос на хранение:
$ vim glusterfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: gluster-pvc
annotations:
volume.beta.kubernetes.io/storage-class: gluster-heketi
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 1Gi
Создайте объект:
$ kubectl create --save-config -f glusterfs-pvc.yaml
Подтвердите:
$ kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
glusterfs-pvc Bound pvc-34b9b5e9-fbde-11e9-943f-00505692ee7e 1Gi RWX glusterfs-heketi 1d
После создания вы можете использовать его в своих развертываниях.
Чтобы использовать том, мы ссылаемся на PVC в файле YAML любого Pod / Deployment, например, так:
apiVersion: v1
kind: Pod
metadata:
name: gluster-pod
labels:
name: gluster-pod
spec:
containers:
- name: gluster-pod
image: busybox
command: ["sleep", "60000"]
volumeMounts:
- name: gluster-vol
mountPath: /usr/share/busybox
readOnly: false
volumes:
- name: gluster-vol
persistentVolumeClaim:
claimName: glusterfs-pvc