Установка Minio на Kubernetes, используя Kubespray и Ansible

Thank you for reading this post, don't forget to subscribe!

Minio – это S3-сов­ме­сти­мое хра­ни­ли­ще объ­ек­тов с откры­тым исход­ным кодом, кото­рое мож­но раз­ме­стить на Linode.

Раз­вер­ты­ва­ние в кла­сте­ре Kubernetes под­дер­жи­ва­ет­ся как в авто­ном­ном, так и в рас­пре­де­лен­ном режимах.

В этом руко­вод­стве Kubespray исполь­зу­ет­ся для раз­вер­ты­ва­ния кла­сте­ра Kubernetes на трех сер­ве­рах под управ­ле­ни­ем Ubuntu 16.04.

Kubespray постав­ля­ет­ся с Ansible playbooks, кото­рые упро­ща­ют настрой­ку в кластере.

Затем Minio мы уста­но­вим в кла­сте­ре в авто­ном­ном режи­ме, что­бы про­де­мон­стри­ро­вать вам, как создать службу.

Перед тем, как начнем

В демон­стра­ци­он­ных целях это руко­вод­ство уста­нав­ли­ва­ет etcd и мастер Kubernetes на одном узле.

Для кла­сте­ров высо­кой доступ­но­сти потре­бу­ет­ся дру­гая кон­фи­гу­ра­ция, кото­рая выхо­дит за рам­ки дан­но­го руководства.

Должен быть поль­зо­ва­тель с при­ви­ле­ги­я­ми sudo.

Кла­стер мож­но моде­ли­ро­вать локаль­но, исполь­зуя Minikube, что­бы осво­ить­ся Kubernetes.

IP-адре­са каж­до­го узла в кла­сте­ре и их роли будут пред­став­ле­ны как kubernetes-master-ip, etcd-ip и slave-ip

Если вы не хоти­те уста­нав­ли­вать Ansible и дру­гое про­грамм­ное обес­пе­че­ние локаль­но, рас­смот­ри­те воз­мож­ность исполь­зо­ва­ния дру­го­го сер­ве­ра в каче­стве пере­клю­ча­те­ля, кото­рый будет исполь­зо­вать­ся для соеди­не­ния с глав­ным узлом.

Уста­нов­ка Ansible
Обно­ви­тесь при необходимости.

sudo apt-get update
sudo apt-get install software-properties-common
Добавь­те Ansible PPA; нажми­те Enter
sudo apt-add-repository ppa:ansible/ansible
Обно­ви­тесь сно­ва, затем уста­но­ви­те Ansible.
sudo apt-get update
sudo apt-get install ansible
Допол­ни­тель­ная установка
Kubespray суще­ству­ет как репо­зи­то­рий Git и тре­бу­ет python-netaddr для мани­пу­ли­ро­ва­ния сете­вым адресом.

Уста­но­ви­те Git:
sudo apt install git
Уста­но­ви­те python-netaddr:
sudo apt install python-netaddr
Изме­ни­те кон­фи­гу­ра­цию Kubespray
Kubespray постав­ля­ет­ся с несколь­ки­ми вари­ан­та­ми кон­фи­гу­ра­ции, не пока­зан­ны­ми в этом руководстве.

Обра­ти­тесь к доку­мен­та­ции для полу­че­ния допол­ни­тель­ной инфор­ма­ции по таким темам, как сете­вое вза­и­мо­дей­ствие с Flannel, уста­нов­ка Helm и круп­но­мас­штаб­ные развертывания.

Кло­ни­руй­те репо­зи­то­рий Kubespray из Github, затем перей­ди­те в репо.
git clone https://github.com/kubernetes-incubator/kubespray.git
cd kubespray
Про­верь­те тег для жела­е­мой вер­сии Kubespray.
Это руко­вод­ство напи­са­но для вер­сии 2.4.0.
git checkout -b tag/v.2.4.0
Изме­ни­те ~/kubespray/ansible.cfg, что­бы запус­кать playbook Ansible на хостах от име­ни дан­но­го пользователя.
Заме­ни­те имя поль­зо­ва­те­ля на имя вашей учет­ной запи­си Unix в remote_user = username в [defaults].

Ско­пи­руй­те ката­лог inventory и пере­име­нуй­те его:
cp -r inventory/sample inventory/minio
Исполь­зуй­те гене­ра­тор Kubespray, что­бы создать спи­сок узлов для Ansible.
Объ­яви­те спи­сок IP-адре­сов для каж­до­го сервера.
declare -a IPS=(kubernetes-master-ip etcd-ip slave-ip)
CONFIG_FILE=inventory/minio/hosts.ini python3 contrib/inventory_builder/inventory.py ${IPS[@]}
Не исполь­зуй­те име­на хостов при объ­яв­ле­нии $IPS. В насто­я­щее вре­мя гене­ра­тор инвен­та­ри­за­ции под­дер­жи­ва­ет толь­ко IP-адреса.
При­мер кон­фи­гу­ра­ции для кла­сте­ра в этом руководстве.

Рас­ком­мен­ти­руй­те стро­ку docker_dns_servers_strict: false в ~ /kubernetes/inventory/minio/group_vars/all.yml

Подготовьте хосты для Ansible

Преж­де чем Ansible смо­жет пра­виль­но запу­стить Playbooks Kubespray, на хостах дол­жен быть вклю­чен без­па­роль­ный вход для поль­зо­ва­те­ля sudo и отклю­чен swap.

Убе­ди­тесь, что ука­зан­ный поль­зо­ва­тель суще­ству­ет на каж­дом сер­вер до нача­ла этих шагов.

В этом раз­де­ле пока­за­но, как ско­пи­ро­вать клю­чи SSH на каж­дый сер­вер и изме­нить файл sudoers через SSH.

Создай­те закры­тый ключ, если у вас его нет:

Ско­пи­руй­те ключ SSH на каж­дый IP-адрес, ука­зан­ный в перечне, с помо­щью объ­яв­лен­ной ранее пере­мен­ной $IPS и заме­ни­те имя поль­зо­ва­те­ля для каж­до­го из хостов.

Создайте безпарольный sudo на нодах

Ниже при­ве­ден цикл, кото­рый добав­ля­ет стро­ку username ALL = (ALL: ALL) NOPASSWD: ALL в послед­нюю стро­ку фай­ла sudoers.

Вам будет пред­ло­же­но вве­сти пароль для каж­до­го сервера.

Отключите swap

Добавь­те этот фраг­мент ниже в конец ~/kubespray/role/bootstrap-os/tasks/main.yml, что­бы отклю­чить swap с помо­щью Ansible.

Запу­сти­те Ansible Playbook
Перед запус­ком Ansible playbook убе­ди­тесь, что бранд­мау­э­ры отклю­че­ны, что­бы избе­жать непред­ви­ден­ных ошибок.

Запу­сти­те cluster.yml.

Если ваш закры­тый ключ назван по-дру­го­му или нахо­дит­ся в дру­гом месте, добавь­те –private-key = /path/to/id_rsa

ansible-playbook -i inventory/minio/hosts.ini cluster.yml -b -v
Это может занять до 20 минут.

Как доба­вить или уда­лить узлы
Перей­ди­те в ~/kubespray/inventory/minio/hosts.ini и добавь­те IP-адрес ново­го узла.

Запу­сти­те ssh-copy-id, что­бы ско­пи­ро­вать ваш SSH-ключ на новый узел:

ssh-copy-id username@new-node-ip
Запу­сти­те scale.yml:

ansible-playbook -i inventory/minio/hosts.ini scale.yml -b -v
Перей­ди­те по SSH на глав­ный узел Kubernetes, что­бы выве­сти спи­сок всех доступ­ных узлов:
kubectl get nodes
Что­бы уда­лить узел, про­сто выклю­чи­те сер­вер и очи­сти­те мастер-узел с помощью:

kubectl delete node <ip-of-node>
Minio на Kubernetes
Коман­ды в этом раз­де­ле долж­ны быть выпол­не­ны на узле kubernetes-master

Создай­те посто­ян­ный том
Посто­ян­ные тома (PV) – это абстрак­ция в Kubernetes, пред­став­ля­ю­щая еди­ни­цу хра­не­ния, выде­лен­ную в кластере.

PersistentVolumeClaim (PVC) поз­во­лит моду­лю исполь­зо­вать хра­ни­ли­ще, выде­лен­ное PV.

Этот раз­дел созда­ет PV 15Gi (гибибайт), а затем поз­во­ля­ет Minio затре­бо­вать 10Gi пространства.

На глав­ном узле Kubernetes создай­те файл с име­нем minio-volume.yaml со сле­ду­ю­щим YAML, отоб­ра­жен­ным ниже.

Заме­ни­те имя поль­зо­ва­те­ля на hostPath на соот­вет­ству­ю­щий путь.

Создай­те PV:
kubectl create -f minio-volume.yaml
Создай­те PVC с помо­щью minio-pvc.yaml:

Создай­те PVС:
kubectl create -f minio-pvc.yaml
Создай­те развертывание
Создай­те кон­фи­гу­ра­цию раз­вер­ты­ва­ния в minio-deploy.yaml и под­ставь­те имя поль­зо­ва­те­ля в послед­нюю строку.

Доступ и сек­рет­ный ключ нахо­дят­ся в фай­ле YAML.

 

Создайте развертывание

Создайте сервис

Посмот­ри­те спи­сок запу­щен­ных сервисов.
Под столб­цом PORT (S) вы може­те уви­деть, что служ­ба Minio рабо­та­ет внут­ри по пор­ту 9000, а 30593 – это внеш­ний порт через LoadBalancer.

 

 

В бра­у­зе­ре перей­ди­те по обще­до­ступ­но­му IP-адре­су с любо­го сер­ве­ра в кла­сте­ре по пор­ту (30593 в при­ве­ден­ном выше примере).
Вве­ди­те кре­ды, кото­рые писа­ли ранее.
Minio име­ет схо­жую функ­ци­о­наль­ность с S3: загруз­ка фай­лов, созда­ние сег­мен­тов и хра­не­ние дру­гих данных.