Kubernetes - установка кластера через kubespray(официальный)

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

что у нас имеется.
1 тач­ка с ansible
3 тач­ки под мастеров
1 тач­ка под воркер

192.168.1.177 - ansible
192.168.1.201 - kub-master-201
192.168.1.202 - kub-master-202
192.168.1.203 - kub-master-203
192.168.1.204 - kub-worker-204

Кло­ни­ру­ем репо Kubespray на сер­вер, где у нас сто­ит ansible:

[root@ansible ~]# git clone https://github.com/kubernetes-incubator/kubespray.git

Достав­ля­ем паке­ты на ansible:

[root@ansible ~]# cd kubespray/
[root@ansible kubespray]# pip install -r requirements.txt
[root@ansible kubespray]# pip install -U jinja2

Идем в ска­чан­ную дирек­то­рию kubespray и созда­ем сле­ду­ю­щий файл:
vim inventory/sample/hosts.ini

[codesyntax lang="php"]

[/codesyntax]

 

Далее уста­нав­ли­ва­ем необ­хо­ди­мые нам пара­мет­ры в

vim inventory/sample/group_vars/k8s-cluster/addons.yml

Далее пра­вим
vim inventory/sample/group_vars/all/all.yml

Здесь мож­но почи­тать про пере­мен­ные для Kubespray:

https://github.com/kubernetes-sigs/kubespray/blob/master/docs/vars.md

теперь захо­дим на все ноды и ста­вим sshpass
yum install sshpass
в одну коман­ду это будет так:

[root@ansible kubespray]# for i in `cat inventory/sample/hosts.ini | awk -F 'ip=' '{print $2}' | grep -v etc | grep -v ^$`; do ssh -t root@$i "yum install sshpass -y"; done

Далее запус­ка­ем плейбук:
ansible-playbook -u root -i inventory/sample/hosts.ini cluster.yml -b --ask-pass

Раз­во­ра­чи­ва­ет­ся от 20 до 40 минут.

После про­ве­ря­ем что у нас все в состо­я­нии Ready:
kubectl get nodes
kubectl get pod -A

 

Затем URL Dashboard:
kubectl cluster-info
https://192.168.1.201:6443/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/#/login

Полу­ча­ем токен:
kubectl describe secret $(kubectl get secret | grep cluster-admin | awk '{print $1}')

Берем кото­рый для dashboard, идем по ссыл­ке и встав­ля­ем его в форму:

Далее может воз­ник­нуть воз­ник­нуть ошиб­ка: kubernetes dashboard unknown server error (404)

Реша­ет­ся она уда­ле­ни­ем dashboard 1.10 и уста­нов­кой dashboard 2.0:
kubectl delete deployments kubernetes-dashboard -n kube-system
kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.0.0-rc2/aio/deploy/recommended.yaml

Пере­хо­дим по тому же URL, встав­ля­ем токен и все рабо­та­ет без ошибок

 

======================================================================================================

 

Расширенная установка с prometheus, grafana, fluent-bit и kibana Elasticsearch

тре­бо­ва­ния для запус­ка кластера:
3 masters node
6 cpu core
sda disk 40G (lvm)
12G memory

3 workers node
8 cpu core
sda disk 40G (lvm)
sdb disk 120G (
без раз­мет­ки)
16G memory

Мини­маль­ные тре­бо­ва­ния под­ра­зу­ме­ва­ют запуск кла­сте­ра с сер­ви­са­ми СШ, prometheus, grafana, fluent-bit и kibana (Elasticsearch уста­нов­лен отдель­но), с воз­мож­но­стью запус­ка всех пере­чис­лен­ных сер­ви­сов при отка­зе одной вычис­ли­тель­ной ноды.

Предварительная подготовка хранилищ на worker нодах.

Для исполь­зо­ва­ния prometheus, grafana, fluent-bit и kibana на каж­дой worker ноде необ­хо­ди­мо смон­ти­ро­вать несколь­ко допол­ни­тель­ных дисков.
Реко­мен­ду­е­мый объ­ём дисков:
БД Prometheus не менее 12Гб
БД alertmanager не менее 12Гб
БД grafana не менее 12Гб
В нашем слу­чае исполь­зу­ет­ся один физи­че­ский диск sdb раз­би­тый на логи­че­ские диски.

Созда­ем физи­че­ский том

созда­ем груп­пу томов из одно­го физи­че­ско­го тома

созда­ем логи­че­ские тома

 

Созда­ем фай­ло­вую систе­му ext4 на этих дисках

созда­ем ката­ло­ги в /mnt

мон­ти­ру­ем диски

про­ве­ря­ем

mount | grep mnt

добав­ля­ем мон­ти­ро­ва­ние при автозагрузке

vi /etc/fstab

Установка кластера

Уста­нов­ка выпол­ня­ет­ся на любой машине с CentOS, не отно­ся­щей­ся к буду­ще­му кластеру.
кло­ни­ру­ем репо­зи­то­рий Kubespray и перей­дем в его каталог
yum -y install git
cd ~
git clone https://github.com/kubernetes-incubator/kubespray.git
cd kuberspray/

доба­вим репо­зи­та­рий допол­ни­тель­ных пакетов
yum -y install epel-release

уста­но­вим систе­му управ­ле­ния python пакетами
yum -y install python-pip

отре­дак­ти­ру­ем файл requirements.txt
vi requirements.txt
ansible=2.8.1

уста­но­вим необ­хо­ди­мые python паке­ты для kubespray
pip install -r requirements.txt

ско­пи­ру­ем дирек­то­рию inventory и перей­дем в нее
cp -rfp inventory/sample inventory/mycluster
cd inventory/mycluster

отре­дак­ти­ру­ем файл inventory.ini
vi inventory.ini

содер­жи­мое фай­ла inventory.ini

[codesyntax lang="php"]

[/codesyntax]

откро­ем файл group_vars/all/all.yml
В YAML фай­лах не под­дер­жи­ва­ет­ся табу­ля­ция, толь­ко пробелы.
vi group_vars/all/all.yml

и вклю­чим воз­мож­ность kubelet загру­жать моду­ли ядра (рас­ком­мен­ти­ро­вать и убрать отступ)
kubelet_load_modules: true

откро­ем файл /group_vars/k8s-cluster/addons.yml
vi /group_vars/k8s-cluster/addons.yml

и вклю­чим необ­хо­ди­мые допол­ни­тель­ные сер­ви­сы, по умол­ча­нию вклю­чен толь­ко dashboard (обра­ти­те вни­ма­ние на отсту­пы в yml фай­лах, моду­ли долж­ны быть без отступов)

[codesyntax lang="php"]

[/codesyntax]

откро­ем файл /group_vars/k8s-cluster/k8s-cluster.yml
vi k8s-cluster.yml

и вклю­чим все вари­ан­ты аутен­ти­фи­ка­ции (обра­ти­те вни­ма­ние на отсту­пы в yml фай­лах, моду­ли долж­ны быть без отступов)

кон­фи­гу­ра­ция для уста­нов­ки гото­ва, теперь необ­хо­ди­мо под­го­то­вить ноды
созда­дим клю­чи ssh, ути­ли­та тре­бу­ет ука­зать имя, путь фай­ла и пароль­ную фра­зу (есть воз­мож­ность, оста­вить все по умол­ча­нию и про­сто нажи­мать enter - продолжить)
ssh-keygen

перей­дем в ката­лог ssh
cd ~/.ssh

ско­пи­ру­ем пуб­лич­ные клю­чи на наши сер­ве­ра (пона­до­бит­ся под­твер­жде­ние на под­клю­че­ние и пароль от уда­лен­но­го сервера)

вер­нем­ся в ката­лог inventory/mycluster
cd ~/kubespray/inventory/mycluster

созда­дим playbook для под­го­тов­ки систе­мы на всех нодах

vi prerequisites.yml

содер­жи­мое фай­ла prerequisites.yml

[codesyntax lang="php"]

[/codesyntax]

запу­стим под­го­то­ви­тель­ный playbook
после вво­да коман­ды, будет запрос паро­лей ssh и sudo уда­лен­ных машин
вре­мя выпол­не­ния коман­ды зави­сит от кол-ва хостов, про­пуск­ной спо­соб­но­сти кана­ла, и вычис­ли­тель­ных мощностей
ansible-playbook -u centos -i inventory.ini prerequisites.yml -b --ask-become-pass

запу­стим playbook уста­нов­ки кла­сте­ра kubernetes
ansible-playbook -i inventory.ini --become --become-user=root ~/kubespray/cluster.yml --timeout=30

если выпол­не­ние коман­ды завер­ша­ет­ся с ошиб­ка­ми timeout, то уве­личь­те его, логи­ро­ва­ние настра­и­ва­ет­ся в /kubespray/ansible.cfg

после успеш­но­го выпол­не­ния перей­ди­те на стра­ни­цу dashboard
Логин для вхо­да: kube
Слу­чай­но сге­не­ри­ро­ван­ный пароль нахо­дит­ся на любом масте­ре в /etc/kubernetes/users/known_users.csv

Установка elasticsearch и curator

Elasticsearch - это поис­ко­вый дви­жок, с откры­тым исход­ным кодом, напи­сан­ный на java.
Уста­нов­ка про­из­во­дит­ся на отдель­ную маши­ну, т.к. elasticsearch очень тре­бо­ва­те­лен к ресур­сам. Реко­мен­ду­ет­ся не менее 16Gb RAM, кол-во CPU не менее 4.
под­го­то­вим диск для дан­ных, в дан­ном слу­чае это вто­рой физи­че­ский диск sdb на 100Gb, обьем дис­ка зави­сит от кол-ва посту­па­ю­щих дан­ных, зало­жи­те воз­мож­ность уве­ли­че­ния диска.
pvcreate /dev/sdb

созда­ем груп­пу томов из физи­че­ско­го тома
vgcreate vg_es /dev/sdb

созда­ем логи­че­ский том
lvcreate -L 100G -n lv_es vg_es

Созда­ем фай­ло­вую систе­му ext4 на этих дисках
mkfs.ext4 /dev/vg_es/lv_es

созда­ем ката­ло­ги в /mnt
mkdir -p /mnt/disks/lv_es

мон­ти­ру­ем диски
mount /dev/vg_es/lv_es /mnt/disks/lv_es

про­ве­ря­ем
mount | grep mnt

добав­ля­ем мон­ти­ро­ва­ние при автозагрузке
vi /etc/fstab
/dev/mapper/vg_es-lv_es /mnt/disks/lv_es ext4 rw,seclabel,relatime,data=ordered 0 0

уста­но­вим java
yum install -y java-1.8.0-openjdk

доба­вим пакет

 

Установка elasticsearch

уста­нов­ка пакета
yum install -y elasticsearch

запуск сер­ви­са и добав­ле­ние его в автозагрузку
systemctl start elasticsearch.service
systemctl enable elasticsearch.service

настрой­ка elasticsearch про­из­во­дит­ся в фай­ле /etc/elasticsearch/elasticsearch.yml
vi /etc/elasticsearch/elasticsearch.yml

ука­жи­те путь к ката­ло­гу хра­не­ния дан­ных и ука­жи­те интер­фейс для прослушивания

при исполь­зо­ва­нии кла­сте­ра ука­жи­те сле­ду­ю­щие пара­мет­ры на каж­дой ноде

 

сме­ним вла­дель­ца ката­ло­га на elasticsearch
chown elasticsearch:elasticsearch /mnt/disks/lv_es

после вне­се­ния изме­не­ний пере­за­пус­ка­ем сервис
systemctl restart elasticsearch.service

Тюнинг elasticsearch

Изме­не­ние раз­ме­ра JVM heap, реко­мен­ду­ет­ся 50% от физи­че­ско­го раз­ме­ра RAM. Пара­мет­ры исполь­зо­ва­ния памя­ти при ини­ци­а­ли­за­ции и мак­си­маль­но­го коли­че­ства памя­ти долж­ны быть одинаковыми.

отклю­че­ние swap файла
открой­те файл загруз­ки томов
и заком­мен­ти­руй­те строч­ку содер­жа­щую swap
уве­ли­че­ние вир­ту­аль­ной памяти

Установка curator

curator - это сер­вис для пери­о­ди­че­ской очист­ки индек­сов elasticsearch.
доба­вим пакет
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch

 

непо­сред­ствен­но установка
yum install -y elasticsearch-curator

созда­ние ката­ло­га и кон­фи­гу­ра­ци­он­ных файлов
mkdir /etc/curator
touch /etc/curator/config.yml
touch /etc/curator/action.yml

содер­жи­мое фай­ла config.yml

 

[/codesyntax]

содер­жи­мое фай­ла action.yml

[codesyntax lang="php"]

[/codesyntax]

при­ме­не­ние кон­фи­гу­ра­ци­он­ных файлов
/usr/bin/curator --config /etc/curator/config.yml /etc/curator/action.yml

Доба­вим зада­ние в cron, каж­дый день в час ночи
crontab -e
0 1 * * * /usr/bin/curator --config /etc/curator/config.yml /etc/curator/action.yml

откро­ем порт 9200 в firewall
firewall-cmd --zone=public --permanent --add-port=9200/tcp

Установка fluent-bit и kibana

Ини­ци­а­ли­зи­ру­ем Helm - это пакет­ный мене­джер для kubernetes, по боль­шей части исполь­зу­ет­ся для оркест­ров­ки yaml файлами.
все коман­ды ниже вво­дить на любом мастер сервере.

Установка fluent-bit

fluent-bit - это сер­вер пере­сыл­ки жур­на­лов и обра­бот­чик жур­на­лов, кото­рый помо­га­ет соби­рать дан­ные из раз­ных источ­ни­ков, объ­еди­нять их и затем отправ­лять их в elasticsearch.
необ­хо­ди­мо ука­зать ip адрес elasticsearch (в дан­ном слу­чае 10.100.1.101)

helm install --namespace logging stable/fluent-bit --name fluent-bit \ --set backend.type=es \ --set backend.es.host=10.100.1.101,backend.es.tls_verify=off,backend.es.replace_dots=off

Установка kibana

kibana - это веб-при­ло­же­ние для визу­а­ли­за­ции и поис­ка логов.
необ­хо­ди­мо ука­зать DNS имя, в при­ме­ре ука­зан wildcard домен. И ip адрес elasticsearch (в дан­ном слу­чае 10.100.1.101)

helm install --namespace logging stable/kibana --name kibana \ --set ingress.enabled=true,ingress.hosts[0]=kibana.10.100.1.13.nip.io \ --set env.ELASTICSEARCH_HOSTS=http://10.100.1.101:9200

Настройка kibana

пере­хо­дим на адрес kibana.10.100.1.13.nip.io (ip адрес вычис­ли­тель­ной ноды с wildcard доме­номвыби­ра­ем "Managment"-"Create Index Patterns", вво­дим в поле пат­терн logstash-*, на сле­ду­ю­щем шаге выби­ра­ем в поле “Time Filter field name” – @timestamp и жмем кноп­ку "Create Index pattern".
Поиск логов. На вклад­ке Discover в стро­ке поис­ка вве­ди­те назва­ние сер­ви­са или запрос подоб­но­го фор­ма­та: log-name AND start NOT 408893030505 (долж­но при­сут­ство­вать сло­во log-name и start, но без чис­ла 408893030505 в сооб­ще­нии логов).

Сохра­не­ние логов. В kibana есть воз­мож­ность сохра­нять резуль­тат запро­сов в csv фор­ма­те, один из них созда­ние визу­а­ли­за­ции в виде таб­ли­цы и после­ду­ю­щее сохра­не­ние. На вклад­ке Visualize создай­те визу­а­ли­за­цию Data Table, выбе­ри­те индекс logstash-*, выбе­ри­те вре­мен­ной пери­од, ука­жи­те необ­хо­ди­мый запрос (напри­мер имя сер­ви­са) и при­ве­ди­те мет­ри­ки к сле­ду­ю­ще­му виду:

после вне­се­ния изме­не­ний нажми­те кноп­ку Apply changes (выгля­дит как кноп­ка play) и Save (в верх­нем части окна) для сохра­не­ния визу­а­ли­за­ции. В ниж­ней части таб­ли­цы появит­ся ссыл­ки на загруз­ку, в фор­ма­тах Raw или Formatted. Formatted загру­жа­ет дан­ные в фор­ма­те таб­ли­цы. Raw загру­жа­ет дан­ные как пред­став­ле­но - дата, как unix time и т.д.

Установка prometheus и grafana

Установка prometheus

prometheus - это систе­ма мони­то­рин­га docker-кон­тей­не­ров., она состо­ит из раз­лич­ных ком­по­нен­тов, в нашем слу­чае исполь­зу­ют­ся следующие:
prometheus-server - счи­ты­ва­ет мет­ри­ки и сохра­ня­ет их в тем­по­раль­ной базе данных
prometheus-alertmanager - мене­джер уведомлений
prometheus-pushgateway - ком­по­нент для при­е­ма мет­рик крат­ко­вре­мен­ных процессов
prometheus-kube-state-metrics - сни­ма­ет мет­ри­ки с подов, сер­ви­сов и т.д.
prometheus-node-exporter - сни­ма­ет мет­ри­ки с хостов kubernetes
elasticsearch-exporter - агент кото­рый соби­ра­ет мет­ри­ки из elasticsearch и пере­да­ет их prometheus
в helm чар­те, необ­хо­ди­мо ука­зать DNS имя, в при­ме­ре ука­зан wildcard домен. и два пер­си­стент­ных хра­ни­ли­ща (обьем дис­ка зави­сит от кол-ва посту­па­ю­щих дан­ных, зало­жи­те воз­мож­ность уве­ли­че­ния дис­ка), для prometheus и alertmanager (сер­вис уведомлений).

helm install --namespace logging stable/prometheus --name prometheus \ --set server.ingress.enabled=true,server.ingress.hosts[0]=prometheus.10.100.1.13.nip.io \ --set alertmanager.persistentVolume.enabled=true \ --set alertmanager.persistentVolume.storageClass=local-storage,alertmanager.persistentVolume.size=10Gi \ --set server.persistentVolume.enabled=true,server.persistentVolume.storageClass=local-storage,server.persistentVolume.size=10Gi

Настройка prometheus-server

Пра­ви­ла для отправ­ки уве­дом­ле­ний настра­и­ва­ют­ся в Config Maps prometheus-server в бло­ке "rules:", в при­ме­ре настро­е­но несколь­ко пра­вил опо­ве­ще­ний, при отка­зе хоста и при load average выше 1.5 и т.д.
Config Maps в интер­фей­се kubernetes исполь­зу­ет JSON фор­мат, кото­рый не допус­ка­ет раз­рыв строк и исполь­зу­ет для пере­но­са стро­ки "\n", а в YAML син­так­се для мно­го­строч­но­го тек­ста исполь­зу­ет­ся пайп "|". Для удоб­ства редак­ти­ро­ва­ния и кон­вер­та­ции JSON<->YAML мож­но исполь­зо­вать онлайн кон­вер­тор, напри­мер https://www.json2yaml.com/convert-yaml-to-json

[codesyntax lang="php"]

[/codesyntax]

Уведомления prometheus-alertmanager

Для настрой­ки отправ­ки уве­дом­ле­ний на почту при­ве­ди­те к сле­ду­ю­ще­му виду Config Maps prometheus-alertmanager

[codesyntax lang="php"]

[/codesyntax]

Установка и настройка elasticsearch-exporter

 

уста­но­вим его в том же namespace logging, ука­зав http адрес elasticsearch

в Config Maps для prometheus-server доба­вим в блок "prometheus.yml:" еще один scrape_configs

[codesyntax lang="php"]

[/codesyntax]

туда же доба­вим пра­ви­ла опо­ве­ще­ний для elasticsearch, в бло­ке "rules:". Будет созда­на новая груп­па пра­вил с име­нем "elasticsearch"

 

[/codesyntax]

Установка grafana


grafana - инстру­мент визу­а­ли­за­ции для prometheus.
необ­хо­ди­мо ука­зать DNS имя, в при­ме­ре ука­зан wildcard домен. и пер­си­стент­ное хра­ни­ли­ще для grafana (обьем дис­ка зави­сит от кол-ва посту­па­ю­щих дан­ных, зало­жи­те воз­мож­ность уве­ли­че­ния диска).

helm install --namespace logging stable/grafana --name grafana \ --set ingress.enabled=True,ingress.hosts[0]=grafana.10.100.1.13.nip.io \ --set rbac.create=true \ --set persistence.enabled=true,persistence.storageClassName=local-storage,persistence.size=10Gi

полу­чить пароль для admin мож­но в свой­ствах кон­тей­не­ра, или в тер­ми­на­ле кон­тей­не­ра в пере­ме­ной GF_SECURITY_ADMIN_PASSWORD или коман­дой на мастере

kubectl get secret --namespace logging grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

Настройка grafana

Вой­ди­те в веб-интер­фейс grafana.10.100.1.13.nip.io, выбе­ре­те "Add data source" - "Prometheus", вве­ди­те URLhttp://prometheus-server.logging.svc.cluster.local и нажми­те "Save & Test", появит­ся сооб­ще­ние "Data source is working"
Далее выбе­ре­те вклад­ку "Dashboard" и импор­ти­руй­те все пред­ло­жен­ные дашборды.
Для добав­ле­ния новых даш­бор­дов выбе­ре­те "Dashboards" - Manage - Import и вставь­те ссыл­ку или id даш­бор­да или json файл, полу­чен­ные на сай­те https://grafana.com/grafana/dashboards
Попу­ляр­ный dashboard для мони­то­рин­га kubernetes - Cluster Monitoring for Kubernetes by Pivotal Observability - https://grafana.com/grafana/dashboards/10000 
Dashboard для мони­то­рин­га подов в kubernetes - Pod Stats & Info by karstensiemer https://grafana.com/grafana/dashboards/10518
Dashboard для мони­то­рин­га elasticsearch - ElasticSearch by infinity https://grafana.com/grafana/dashboards/2322
Любой даш­борд мож­но отре­дак­ти­ро­вать, для это­го зай­ди­те в его "Dashboard setting" и выбе­ре­те "Make editable" и сохра­ни­те изме­не­ния. После чего в пане­лях появит­ся кноп­ка Edit.

Уведомления в grafana

в Config Maps для grafana добавь­те сле­ду­ю­щие стро­ки для бло­ка [smtp]

 

пароль не дол­жен содер­жать сим­во­лы "#" и ";"
в веб-интер­фей­се после­до­ва­тель­но нажми­те Alerting - Notification channels - Add New channel и добавь­те имя кана­ла и email адре­са получателей.

Установка утилиты kubectl на windows, для управления кластером

после уста­нов­ки кла­сте­ра необ­хо­ди­мо забрать файл из любой мастер ноды /etc/kubernetes/admin.conf
ска­чать https://storage.googleapis.com/kubernetes-release/release/v1.14.0/bin/windows/amd64/kubectl.exe
в команд­ной стро­ке перей­ти в пап­ку куда вы ско­пи­ро­ва­ли файл admin.conf и доба­вить переменную

про­вер­ка пока­жет ваши хосты

созда­ем прок­си тун­нель с кластером

Добавление новой ноды в кластер

на новой ноде меня­ем имя хоста

hostnamectl set-hostname k8s-02-node07
systemctl restart systemd-hostnamed

на любой linux машине, не отно­ся­щей­ся к кла­сте­ру, с уста­нов­лен­ным ansible, созда­ем ssh ключ и копи­ру­ем на новую ноду
ssh-keygen
cd ~/.ssh
ssh-copy-id centos@10.100.1.16

редак­ти­ру­ем ansible файл inventory.ini

 

[/codesyntax]

запус­ка­ем под­го­то­ви­тель­ный плей­бук (содер­жи­мое фай­ла prerequisites.yml выше)

sudo ansible-playbook -i inventory.ini -u centos -k prerequisites.yml -b --ask-become-pass 

запус­ка­ем playbook ~/kuberspray/scale.yml

sudo ansible-playbook -i inventory.ini -u centos -k scale.yml --ask-become-pass 

на масте­ре созда­ем token досту­па

kubeadm token create --print-join-command 

вывод коман­ды

kubeadm join 10.100.1.10:6443 --token 9tgd0g.90hwyjiafe6267mm --discovery-token-ca-cert-hash sha256:a568507ac9b2ca4735b2b2d63b4464694f410f3d711a78dc829a3ba808f54bb7

на ноде выполняем

kubeadm join 10.100.1.10:6443 --token 9tgd0g.90hwyjiafe6267mm --discovery-token-ca-cert-hash \ sha256:a568507ac9b2ca4735b2b2d63b4464694f410f3d711a78dc829a3ba808f54bb7

ста­вим label для новой ноды

kubectl label node k8s-02-node07 node-role.kubernetes.io/node=