Добро пожаловать в наше руководство по настройке динамической инициализации постоянных томов с использованием GlusterFS и Heketi для ваших кластеров Kubernetes / OpenShift.
GlusterFS – это бесплатная масштабируемая сетевая файловая система с открытым исходным кодом, подходящая для задач с интенсивным использованием данных, таких как облачное хранилище и потоковая передача мультимедиа.
Он использует стандартное аппаратное обеспечение.
В моей настройке я решил развернуть GlusterFS как гиперконвергентную службу на узлах Kubernetes.
Это откроет возможности динамически предоставляемых, постоянных томов GlusterFS в Kubernetes.
Мы будем использовать проект gluster-kubernetes, который предоставляет администраторам Kubernetes механизм для простого развертывания GlusterFS в качестве собственной службы хранения в существующем кластере Kubernetes.
Здесь GlusterFS управляется как любое другое приложение в Kubernetes.
heketi – это интерфейс управления томами RESTful для GlusterFS.
Это позволяет создавать и управлять томами Gluster с помощью API.
Требования к инфраструктуре
Ниже приведены основные требования к настройке.
- Должно быть как минимум три узла
- Каждый узел должен иметь хотя бы одно необработанное блочное устройство, подключенное для использования heketi.
- Для каждого узла должны быть открыты следующие порты для связи GlusterFS: 2222 для sshd модуля GlusterFS, 24007 для демона GlusterFS, 24008 для управления GlusterFS, 49152–49251 для каждого блока, созданного на хосте.
- Следующие модули ядра должны быть загружены:
- dm_snapshot
- dm_mirror
- dm_thin_pool
5. Каждый узел требует наличия команды mount.glusterfs.
6. Версия клиента GlusterFS, установленная на узлах, должна быть как можно ближе к версии сервера.
Шаг 1: Настройка Kubernetes / OpenShift кластера
Эта настройка предполагает, что у вас есть работающий кластер Kubernetes / OpenShift (OKD).
Обратитесь к нашим руководствам о том, как быстро развернуть кластер для тестового / производственного использования.
- ☸️ Разверните готовый кластер Kubernetes с помощью Ansible & Kubespray
- 👨🚀 Как запустить локальные кластеры Kubernetes в Docker
Шаг 2: Установите glusterfs на все узлы / Настройте брандмауэр
Если вы используете дистрибутив Linux на основе Red Hat, установите пакет glusterfs-fuse, который предоставляет команду mount.glusterfs.
sudo yum -y install glusterfs-fuse
Для Ubuntu / Debian:
sudo apt-get install glusterfs-client
Загрузите все необходимые модули ядра
for i in dm_snapshot dm_mirror dm_thin_pool; do sudo modprobe $i; done
Проверьте, загружены ли модули.
$ sudo lsmod | egrep 'dm_snapshot|dm_mirror|dm_thin_pool' dm_thin_pool 66358 0 dm_persistent_data 75269 1 dm_thin_pool dm_bio_prison 18209 1 dm_thin_pool dm_mirror 22289 0 dm_region_hash 20813 1 dm_mirror dm_log 18411 2 dm_region_hash,dm_mirror dm_snapshot 39103 0 dm_bufio 28014 2 dm_persistent_data,dm_snapshot dm_mod 124461 5 dm_log,dm_mirror,dm_bufio,dm_thin_pool,dm_snapshot
$ glusterfs --version glusterfs 3.12.2
for i in 2222 24007 24008 49152-49251; do
sudo firewall-cmd --add-port=${i}/tcp --permanent
done
sudo firewall-cmd --reload
Чтобы просмотреть точную версию запущенного Kubernetes, используйте:
$ kubectl version Client Version: version.Info{Major:"1", Minor:"15", GitVersion:"v1.15.3", GitCommit:"2d3c76f9091b6bec110a5e63777c332469e0cba2", GitTreeState:"clean", BuildDate:"2019-08-19T11:05:50Z", GoVersion:"go1.12.9", Compiler:"gc", Platform:"linux/amd64"}
Шаг 4: Добавьте вторичные необработанные диски к вашим узлам
Каждый узел должен иметь хотя бы одно необработанное блочное устройство, подключенное для использования heketi.
Я добавил 2 виртуальных диска по 50 ГБ каждый на мои узлы k8s.
[worker01 ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 20G 0 disk └─vda1 253:1 0 20G 0 part / vdc 253:32 0 50G 0 disk vdd 253:48 0 50G 0 disk [worker02 ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 20G 0 disk └─vda1 253:1 0 20G 0 part / vdc 253:32 0 50G 0 disk vdd 253:48 0 50G 0 disk [worker03 ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT vda 253:0 0 20G 0 disk └─vda1 253:1 0 20G 0 part / vdc 253:32 0 50G 0 disk vdd 253:48 0 50G 0 disk
Шаг 5: Создайте файл топологии
Вы должны предоставить информацию о топологии кластера GlusterFS, которая описывает узлы, присутствующие в кластере GlusterFS, и блочные устройства, подключенные к ним, для использования heketi.
Поскольку я выполняю все операции на главном узле Kubernetes, давайте вытянем gluster-kubernetes из Github.
sudo yum -y install git vim
git clone https://github.com/gluster/gluster-kubernetes.git
Скопируйте и отредактируйте шаблон информации о топологии.
cd gluster-kubernetes/deploy/
cp topology.json.sample topology.json
Это то, что у меня есть в моей конфигурации.
{
"clusters": [
{
"nodes": [
{
"node": {
"hostnames": {
"manage": [
"worker01"
],
"storage": [
"10.10.1.193"
]
},
"zone": 1
},
"devices": [
"/dev/vdc",
"/dev/vdd"
]
},
{
"node": {
"hostnames": {
"manage": [
"worker02"
],
"storage": [
"10.10.1.167"
]
},
"zone": 1
},
"devices": [
"/dev/vdc",
"/dev/vdd"
]
},
{
"node": {
"hostnames": {
"manage": [
"worker03"
],
"storage": [
"10.10.1.178"
]
},
"zone": 1
},
"devices": [
"/dev/vdc",
"/dev/vdd"
]
}
]
}
]
}
При создании собственного файла топологии:
- Убедитесь, что в файле топологии перечислены только блочные устройства, предназначенные для использования Heketi. heketi необходим доступ ко всем блочным устройствам (например, /dev/vdc, /dev/vdd), которые он будет разделять и форматировать.
- Массив hostnames немного вводит в заблуждение. управление должно быть списком имен хостов для узла, но хранилище должно быть списком IP-адресов на узле для взаимодействия с внутренним хранилищем.
Шаг 6: Запустите скрипт развертывания
Создав файл топологии, вы готовы запустить скрипт gk-deploy с компьютера с административным доступом к вашему кластеру Kubernetes.
Если не запускается с главного узла, скопируйте файл конфигурации Kubernetes в ~/.kube/config.
Ознакомьтесь с доступными опциями.
./gk-deploy -h
Общие параметры:
-g, --deploy-gluster: Deploy GlusterFS pods on the nodes in the topology that contain brick devices --ssh-user USER: User to use for SSH commands to GlusterFS nodes. Non-root users must have sudo permissions on the nodes. Default is 'root' --user-key USER_KEY: Secret string for general heketi users. This is a required argument. -l LOG_FILE, --log-file LOG_FILE: Save all output to the specified file. -v, --verbose: Verbose output
Запустите приведенную ниже команду, чтобы начать развертывание GlusterFS / Heketi, заменив MyUserStrongKey и MyAdminStrongKey значениями ключей.
./gk-deploy -g \
--user-key MyUserStrongKey \
--admin-key MyAdminStrongKey \
-l /tmp/heketi_deployment.log \
-v topology.json
Нажмите клавишу Y, чтобы принять установку.
Do you wish to proceed with deployment?
[Y]es, [N]o? [Default: Y]: Y
heketi is now running and accessible viahttp://10.233.108.5:8080
Поды, сервис и конечная точка будут созданы автоматически после успешного развертывания.
GlusterFS и heketi должны быть установлены и готовы к работе.
$ kubectl get deployments
NAME READY UP-TO-DATE AVAILABLE AGE
heketi 1/1 1 1 75m
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
glusterfs-44jvh 1/1 Running 0 110m
glusterfs-j56df 1/1 Running 0 110m
glusterfs-lttb5 1/1 Running 0 110m
heketi-b4b94d59d-bqmpz 1/1 Running 0 76m
$ kubectl get services
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
heketi ClusterIP 10.233.42.58 <none> 8080/TCP 76m
heketi-storage-endpoints ClusterIP 10.233.41.189 <none> 1/TCP 76m
kubernetes ClusterIP 10.233.0.1 <none> 443/TCP 127m
$ kubectl get endpoints
NAME ENDPOINTS AGE
heketi 10.233.108.5:8080 76m
heketi-storage-endpoints 10.10.1.167:1,10.10.1.178:1,10.10.1.193:1 77m
kubernetes 10.10.1.119:6443
Шаг 7: Установите и используйте heketi-cli для взаимодействия с GlusterFS
Heketi-cli используется для взаимодействия с GlusterFS, развернутой в кластере Kubernetes.
Загрузите последнюю версию и поместите бинарный файл в вашу переменную PATH.
curl -s https://api.github.com/repos/heketi/heketi/releases/latest \
| grep browser_download_url \
| grep linux.amd64 \
| cut -d '"' -f 4 \
| wget -qi -
for i in `ls | grep heketi | grep .tar.gz`; do tar xvf $i; done
sudo cp ./heketi-client/bin/heketi-cli /usr/local/bin
Вы должны иметь возможность получить версию Heketi-Cli, как любой пользователь, вошедший на сервер.
$ heketi-cli --version
heketi-cli v9.0.0
export HEKETI_CLI_SERVER=$(kubectl get svc/heketi --template 'http://{{.spec.clusterIP}}:{{(index .spec.ports 0).port}}')
Подтвердите значение переменной:
$ echo $HEKETI_CLI_SERVER
http://10.233.108.5:8080
Детали кластера запросов
$ heketi-cli cluster list --user admin --secret MyAdminStrongKey
Clusters:
Id:88ed1913182f880ab5eb22ca2f904615 [file][block]
$ heketi-cli cluster info 88ed1913182f880ab5eb22ca2f904615
Cluster id: 88ed1913182f880ab5eb22ca2f904615
Nodes:
1efe9a69341b50b00a0b15f6e7d8c797
2d48f05c7d7d8d1e9f4b4963ef8362e3
cf5753b191eca0b67aa48687c08d4e12
Volumes:
e06893fc6e4f5fa23994432a40877889
Block: true
File: true
Если вы сохраните имя пользователя и ключ администратора Heketi в качестве переменных среды, вам не нужно будет передавать эти параметры.
$ export HEKETI_CLI_USER=admin
$ export HEKETI_CLI_KEY=MyAdminStrongKey
$ heketi-cli cluster list
Clusters:
Id:5c94db92049afc5ec53455d88f55f6bb [file][block]
$ heketi-cli cluster info 5c94db92049afc5ec53455d88f55f6bb
Cluster id: 5c94db92049afc5ec53455d88f55f6bb
Nodes:
3bd2d62ea6b8b8c87ca45037c7080804
a795092bad48ed91be962c6a351cbf1b
e98fd47bb4811f7c8adaeb572ca8823c
Volumes:
119c23455c894c33e968a1047b474af2
Block: true
File: true
$ heketi-cli node list
Id:75b2696a9e142e6900ee9fd2d1eb56b6 Cluster:23800e4b6bdeebaec4f6c45b17cabf55
Id:9ca47f98eaa60f0e734ab628897160fc Cluster:23800e4b6bdeebaec4f6c45b17cabf55
Id:c43023282eef0f10d4109c68bcdf0f9d Cluster:23800e4b6bdeebaec4f6c45b17cabf55
Просмотр информации о топологии:
$ heketi-cli topology info
Cluster Id: 698754cfaf9642b451c4671f96c46a0b
File: true
Block: true
Volumes:
Nodes:
Node Id: 39e8fb3b09ccfe47d1d3f2d8e8b426c8
State: online
Cluster Id: 698754cfaf9642b451c4671f96c46a0b
Zone: 1
Management Hostnames: worker03
Storage Hostnames: 10.10.1.178
Devices:
Node Id: b9c3ac6737d27843ea0ce69a366de48c
State: online
Cluster Id: 698754cfaf9642b451c4671f96c46a0b
Zone: 1
Management Hostnames: worker01
Storage Hostnames: 10.10.1.193
Devices:
Node Id: c94636a003af0ca82e7be6962149869b
State: online
Cluster Id: 698754cfaf9642b451c4671f96c46a0b
Zone: 1
Management Hostnames: worker02
Storage Hostnames: 10.10.1.167
Devices:
Создайте StorageClass для динамического предоставления.
$ vim gluster-storage-class.yaml
---
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: glusterfs-storage
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://10.233.108.5:8080"
restuser: "admin"
restuserkey: "MyAdminStrongKey"
$ kubectl create -f gluster-storage-class.yaml
storageclass.storage.k8s.io/glusterfs-storage created
$ kubectl get storageclass
NAME PROVISIONER AGE
glusterfs-storage kubernetes.io/glusterfs 18s
$ kubectl describe storageclass.storage.k8s.io/glusterfs-storage
Name: glusterfs-storage
IsDefaultClass: No
Annotations: <none>
Provisioner: kubernetes.io/glusterfs
Parameters: resturl=http://10.233.108.5:8080,restuser=admin,restuserkey=MyAdminStrongKey
AllowVolumeExpansion: <unset>
MountOptions: <none>
ReclaimPolicy: Delete
VolumeBindingMode: Immediate
Events: <none>
Создание PVC
$ cat gluster-pvc.yaml
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: glusterpvc01
annotations:
volume.beta.kubernetes.io/storage-class: glusterfs-storage
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
$ kubectl create -f gluster-pvc.yaml
persistentvolumeclaim/glusterpvc01 created
Где:
- glusterfs-storage – это аннотация класса хранения Kubernetes и имя класса хранения.
- 1Gi – объем запрошенной памяти