Kubernetes - постоянные диски на GlusterFS и heketi
Heketi – это открытый проект, предназначенный для предоставления сторонним приложениям RESTful интерфейса управления жизненным циклом дисков в GlusterFS.
В прошлой статье “Kubernetes: использование совместно с GlusterFS” мы рассмотрели ручной процесс создания кластера GlusterFS с последующим подключением его к вашему кластеру Kubernetes в виде отдельного StorageClass-а для предоставления вашим приложениям возможности использовать постоянные диски (PersistentVolume). В этой статье речь пойдет о той же, но более автоматизированной и простой инсталляции и интеграции GlusterFS с кластером Kubernetes с использованием heketi.
Heketi – это открытый проект, предназначенный для предоставления сторонним приложениям RESTful интерфейса управления жизненным циклом дисков в GlusterFS. Этот проект используется OpenStack, Kubernetes и OpenShift для гибкого предоставления дисковых ресурсов GlusterFS с любым поддерживаемым GlusterFS режимом надежности. Heketi автоматически определяет расположение бриков по кластеру GlusterFS таким образом, чтобы обеспечить расположение бриков и их реплик в разных доменах отказоустойчивости (failure domains). Heketi также поддерживает любое количество кластеров GlusterFS, позволяя облачным сервисам использовать дисковые ресурсы без привязки к единственному типу стораджа. Архитектурная схема решения будет точно такой же, как и в прошлой статье.
Если у вас еще нет собственного кластера Kubernetes, вы можете установить его самостоятельно в K2 Cloud, AWS, Google Cloud или же любой системе виртуализации. В качестве примера инсталляции можно использовать статью “Kubeadm: создание Kubernetes кластера за 10 минут“.
Предварительные требования
Предполагается, что у вас есть установленный кластер Kubernetes, содержащий в себе два и более вычислительных узла. Каждый вычислительный сервер должен иметь отдельный диск, который будет полностью отдан в распоряжение heketi. В моем примере инсталляция будет проходить на примере кластера, состоящего из одного мастер и трех вычислительных узлов с подключенным пустым диском vdb.
На все вычислительные узлы необходимо предварительно поставить пакетglusterfs-client. Для этого на каждом из вычислительных серверов выполните следующие команды:
yum -y install centos-release-gluster
yum -y install glusterfs-client
Это нужно для обеспечения возможности работы пода (Pod) heketi-storage-copy-job.
Установка heketi в кластере Kubernetes
Как описано в официальной документации по интеграции heketi с Kubernetes, для упрощения установки heketi можно использовать проект gluster-kubernetes, что мы и сделаем. Далее все команды будут выполняться на мастере вашего Kubernetes кластера.
Для начала на мастер-сервере необходимо установить heketi-client:
mkdir heketi
cd heketi
wget https://github.com/heketi/heketi/releases/download/v4.0.0/heketi-client-v4.0.0.linux.amd64.tar.gz
tar zxvf heketi-client-v4.0.0.linux.amd64.tar.gz
cp heketi-client/bin/heketi-cli /usr/local/bin/
Далее необходимо скачать исходники gluster-kubernetes и описать топологию вашего кластера GlusterFS в файле topology.json:
git clone https://github.com/gluster/gluster-kubernetes.git
cd gluster-kubernetes/deploy
touch topology.json
Содержимое файла topology.json для моего кластера будет следующим:
{
"clusters": [
{
"nodes": [
{
"node": {
"hostnames": {
"manage": [
"node-1.comp.avmaksimov.ru"
],
"storage": [
"192.168.0.5"
]
},
"zone": 1
},
"devices": [
"/dev/vdb"
]
},
{
"node": {
"hostnames": {
"manage": [
"node-2.comp.avmaksimov.ru"
],
"storage": [
"192.168.0.6"
]
},
"zone": 1
},
"devices": [
"/dev/vdb"
]
},
{
"node": {
"hostnames": {
"manage": [
"node-3.comp.avmaksimov.ru"
],
"storage": [
"192.168.0.7"
]
},
"zone": 1
},
"devices": [
"/dev/vdb"
]
}
]
}
]
}
Содержимое файла интуитивно понятно. Единственное, что необходимо отметить – это то, что структура clusters.nodes.node.hostnames.manage должна содержать правильное имя вычислительного узла вашего кластера Kubernetes, а структура clusters.nodes.node.hostnames.storage его правильный IP-адрес. Узнать имена ваших узлов можно командой:
kuberctl get nodes
NAME STATUS AGE
master-1.comp.avmaksimov.ru Ready,master 13d
node-1.comp.avmaksimov.ru Ready 13d
node-2.comp.avmaksimov.ru Ready 13d
node-3.comp.avmaksimov.ru Ready 13d
Выполняем установку heketi следующей командой:
./gk-deploy -g
После того, как heketi будет установлен, можно переходить к настройке клиента heketi-cli.
export HEKETI_CLI_SERVER=$(kubectl get svc/heketi --template 'http://{{.spec.clusterIP}}:{{(index .spec.ports 0).port}}')
curl $HEKETI_CLI_SERVER/hello
Hello from Heketi
Как только клиент heketi получил возможность взаимодействовать с кластером, перечитайте конфигурацию кластера и запустите команду интеграции heketi с Kubernetes:
heketi-cli topology load --json=topology.json
heketi-cli setup-openshift-heketi-storage
kubectl create -f heketi-storage.json
На этом этапе все. Если все выполненные вами команды завершились без ошибок, значит вы правильно выполнили установку heketi. По сути, внутри вашего кластера запущено несколько сущностей heketi (сервисы, поды, наборы демонов и т.д., обеспечивающие работу heketi), а также по одному поду c GlusterFS управляемым heketi на каждом вычислительном узле.
Если вы столкнулись с какими либо ошибками в процессе установки heketi поверх Kubernetes, рекомендую посмотреть статью “Two days of pain or how I deployed GlusterFS cluster to Kubernetes“, где разобрано большое количество всевозможных ошибок, часто возникающих в процессе установки.
Интеграция heketi и kubernetes
По сути все, что требуется для интеграции – это создание отдельного StorageClass-а внутри Kubernetes, который смогу использовать ваши приложения. Для этого создайте файл storage-class.yml, следующего содержания:
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:
name: slow
provisioner: kubernetes.io/glusterfs
parameters:
resturl: "http://10.99.25.47:8080"
Внимание: resturl содержит URL сервиса heketi. Его необходимо заменить на ваш. Он определен в переменной $HEKETI_CLI_SERVER
Примените конфигурацию StorageClass-а в вашем клатере:
kubectl create -f storage-class.yml
Запрос постоянного тома в кластере kubernetes
Для создания запроса на получение постоянного тома в кластере Kubernetes необходимо создать файл test-pvc.yml следующего содержания:
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: myclaim
annotations:
volume.beta.kubernetes.io/storage-class: "slow"
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
Выполните запрос на создание тома командой:
kubectl create -f test-pvc.yml
Через некоторое время можно удостовериться, что тестовый постоянный том создан.
kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESSMODES AGE
myclaim Bound pvc-8a5fa318-fdd8-11e6-8743-d00d3c1e2c41 10Gi RWO 20h
Заключение
В предыдущих статьях я описал установку кластера Kubernetes, а также подключение к нему кластерного стораджа на базе GlusterFS. В следующих статьях я расскажу про использование постоянных дисков Kubernetes вашими приложениями.