Развертывание кластера Kubernetes из дистрибутива Base Infra
Подготовка кластера Kubernetes с базовой инфраструктурой, необходимой для установки VK Data Platform в версиях Standalone и Standalone в составе VK Private Cloud, выполняется с помощью дистрибутива Base Infra.
Перед запуском инсталлятора убедитесь, что выполнены условия, приведенные в разделе Предусловия.
-
Подключитесь к деплой-ноде.
-
Экспортируйте переменную
RELEASE_VERSIONсо значением55416-baseinfra-26-1:$ export RELEASE_VERSION=55416-baseinfra-26-1 -
Распакуйте архив с артефактами Base Infra:
$ tar -xvf nexus-${RELEASE_VERSION}.tar && \tar -xf repos_mcs_distr_*.tar.gz -
Перейдите в директорию
nexus-${RELEASE_VERSION}и распакуйте архив с набором RPM-пакетов:$ cd nexus-${RELEASE_VERSION} && \tar xf docker-rpms.tar.gz -
Установите Docker:
$ sudo dnf install -y ./docker-ce/*.rpm$ sudo systemctl enable --now docker$ sudo systemctl status docker$ sudo usermod -aG docker $USER -
Выйдите из текущей SSH-сессии и повторно авторизуйтесь в системе.
-
Экспортируйте переменную
RELEASE_VERSIONсо значением55416-baseinfra-26-1:$ export RELEASE_VERSION=55416-baseinfra-26-1 -
Перейдите в директорию
nexus-${RELEASE_VERSION}:$ cd nexus-${RELEASE_VERSION} -
Задайте объем оперативной памяти, выделенной для работы Nexus:
$ sed -i 's/--memory="2800m"//g' run_nexus.sh -
Получите root-права:
$ sudo su -
Запустите скрипт развертывания Nexus
run_nexus.sh:# ./run_nexus.sh ${RELEASE_NAME} | tee ~/run_nexus.outЕсли сервер развернут в CorpCloud, скрипт
run_nexus.shзавершится с ошибкой. После этого выполните команды:# sudo dnf install ansible-2.9.27-202510061155.git0cfcfde6a1.cmpt.el7 createrepo -y# exitЕсли во время работы скрипта возникли ошибки, перед его перезапуском удалите под и том Nexus.
-
Выйдите из root-сессии:
# exit -
После завершения работы скрипта
run_nexus.shподождите несколько минут, затем проверьте, что Nexus запущен и возвращает список репозиториев:$ sudo docker ps$ curl -s localhost:8081/service/rest/v1/repositories$ curl localhost:5553/v2/_catalog
Выполните следующие шаги на каждом узле, предназначенном для кластера.
-
Получите root-права:
$ sudo su -
Установите переменную с IP-адресом Nexus:
# export NEXUS_IP="<IP_ДЕПЛОЙ_НОДЫ>"Здесь
<IP_ДЕПЛОЙ_НОДЫ>— IP-адрес деплой-ноды с установленным Nexus. Пример:100.70.18.42.Если сервер развернут в CorpCloud, выполните команду
alias yum=dnf. -
Удалите все существующие файлы репозиториев:
# find /etc/yum.repos.d/ -name "*.repo" | xargs -i rm -f {} -
Создайте файл
vkcloud.repoв директории/etc/yum.repos.d/со следующим содержимым:
Создайте файл hosts.yml и укажите в нем список узлов и их роли. Выберите конфигурацию: один master-узел или три master-узла. Для мультизонального режима раскомментируйте строки с параметрами labels под каждым IP-адресом узла.
Пример содержимого файла:
---all:children:standalone_kube:vars:etcd_listen_address: "{{ ansible_facts['default_ipv4']['address'] }}"children:standalone_corp_kube:children:standalone_corp_kube_etcd:hosts:<IP-АДРЕС_УЗЛА_1>:standalone_kube_master:vars:kube_components_log:dest: "syslog"hosts:<IP-АДРЕС_УЗЛА_1>:standalone_kube_node:hosts:<IP-АДРЕС_УЗЛА_1>:vars:ansible_user: <ПОЛЬЗОВАТЕЛЬ>ansible_ssh_private_key_file: <ПУТЬ_К_КЛЮЧУ>
Здесь:
<IP-АДРЕС_УЗЛА_1>,<IP-АДРЕС_УЗЛА_2>,<IP-АДРЕС_УЗЛА_3>— IP-адреса узлов, которые войдут в кластер.<ПОЛЬЗОВАТЕЛЬ>— имя пользователя, от лица которого будет выполняться установка (должен иметь праваsudoна всех узлах).<ПУТЬ_К_КЛЮЧУ>— путь к приватному SSH-ключу для подключения к узлам.<ЗОНА>— имя зоны для развертывания в мультизональном режиме.
-
Создайте файл
vars.ymlсо следующим содержимым: -
Отредактируйте значения в зависимости от конфигурации кластера Kubernetes:
<IP-адрес_NEXUS>— IP-адрес сервера Nexus. Пример:10.20.0.5.<ПОДСЕТЬ_СЕРВИСОВ>— подсеть для сервисов (ClusterIP). Пример:10.32.0.0/24.<ПОДСЕТЬ_ПОДОВ>— подсеть для IP-адресов подов. Пример:10.200.0.0/16.<СЕТЕВОЙ_ИНТЕРФЕЙС>— имя сетевого интерфейса для SNAT и kubelet. Пример:ens3.
-
Если сервер развернут в CorpCloud, в файле
vars.ymlукажите параметры:
kube_etcd_deploy_type: redos.calico_nat_outgoing: true.calico_ipip: Always.<СЕТЕВОЙ_ИНТЕРФЕЙС>: укажите имя сетевого интерфейса для SNAT и kubelet. Чтобы узнать его, выполните командуip addr. Пример:ens3.<ПОДСЕТЬ_СЕРВИСОВ>: 10.32.0.0/24.<ПОДСЕТЬ_ПОДОВ>: 10.200.0.0/16.
Для работы с дисками на узлах кластера создайте группу томов lvmvg на каждом узле. Для этого выполните следующие шаги на каждом узле кластера, используя отдельный свободный диск. Пример диска: /dev/vdb:
-
Инициализируйте физический том:
$ sudo pvcreate /dev/vdb -
Создайте группу томов с именем
lvmvg:$ sudo vgcreate lvmvg /dev/vdb -
Проверьте, что группа томов создана:
$ sudo vgs$ sudo lvs
Перед развертыванием кластера Kubernetes внесите изменения в шаблоны и плейбуки для корректной работы сервисов с дополнительными DNS-именами и настройками DNS-кеша.
-
Перейдите в директорию с дистрибутивом:
$ cd repos_mcs_distr_${RELEASE_VERSION} -
Внесите изменения в файлы:
-
Откройте файлы:
ansible-openstack/roles/kube/cluster/defaults/main.yml,ansible-openstack/roles/kube/preflight/defaults/main.yml.
-
В параметре
kube_apiserver_san_defaultкаждого файла добавьте запись:- "DNS:kubernetes.default.svc.cluster.local" -
Проверьте, что запись появилась в зависимых файлах:
ansible-openstack/playbooks/roles/kube/cluster/defaults/main.yml,ansible-openstack/playbooks/roles/kube/preflight/defaults/main.yml.
-
-
Внесите изменения в шаблоны и задачи Ansible с помощью следующих команд:
$ sed -i "s|'DNS:localhost',|'DNS:localhost', 'DNS:kubernetes.default.svc.cluster.local', 'DNS:ciam.local',|" ansible-openstack/roles/kube/cluster/tasks/preinstall.yml$ sed -i "s|'DNS:localhost',|'DNS:localhost', 'DNS:kubernetes.default.svc.cluster.local', 'DNS:ciam.local',|" ansible-openstack/roles/kube/preflight/tasks/preinstall.yml$ sed -i '/^[[:space:]]*kubernetes {{ kube_cluster_name }}/i\ rewrite name exact ciam.local ciam-ingress-nginx-controller.paas-standalone.svc.cluster.local' ansible-openstack/roles/kube/cluster/templates/coredns-manifest.yaml.j2$ sed -i '/Corefile: |/a\\ local:53 {\\ errors\\ {% if kube_core_dns_nodelocal_dns_query_logs | bool %}\\ log\\ {% endif %}\\ cache {\\ success 9984 30\\ denial 9984 5\\ }\\ reload\\ loop\\ bind {{ kube_pod_dns_addr }}\\ forward . {{ kube_core_dns_floating_ip | join(" ") if kube_core_dns_nodelocal_floating | bool else kube_core_dns_svc_ip }} {\\ force_tcp\\ }\\ prometheus :9253\\ health {{ kube_pod_dns_addr }}:8080\\ }\' ansible-openstack/roles/kube/cluster/templates/node-local-cache.yaml.j2 -
Перед запуском установки Kubernetes разверните Calico CRDs.
Шаблоны
calico-manifest.yaml.j2иcalicoctl.j2расположены в дистрибутиве по путиansible-openstack/roles/kube/cluster/templates/calico/3.30.2/.-
Создайте директорию:
$ export ANSIBLE_DIR="$HOME/ansible-openstack"$ mkdir -p "${ANSIBLE_DIR}/overrides/calico/3.30.2" -
Скопируйте файл
calico-crds.yaml, полученный от администратора VK Private Cloud, в директорию${ANSIBLE_DIR}/overrides/calico/3.30.2/. -
Проверьте, что копирование прошло успешно:
$ ls -l "${ANSIBLE_DIR}/overrides/calico/3.30.2/calico-crds.yaml" -
Чтобы скопировать файл
calico-crds.yamlв директорию шаблонов дистрибутива и добавить в файлcni.ymlзадачу для развертывания Calico CRDs, выполните скрипт: -
Вернитесь в исходную директорию:
$ cd ..
-
Выполните команду:
$ ansible-playbook -i <ПУТЬ_К_HOSTS> -e @<ПУТЬ_К_VARS> repos_mcs_distr_${RELEASE_VERSION}/ansible-openstack/playbooks/kube.yml -e env=standalone -l standalone_corp_kube -D
Чтобы передать параметры, обязательно используйте в команде символ @ перед путем к файлу vars.
Здесь:
<ПУТЬ_К_HOSTS>— путь к файлуhosts.yml.<ПУТЬ_К_VARS>— путь к файлуvars.yml.
-
Подключитесь по SSH к любому из узлов кластера.
-
Укажите и выполните скрипт для создания пользователя:
В результате выполнения скрипта будут созданы пользователь
admс рольюcluster-adminи файлadm-kubeconfig.jsonдля подключения к кластеру от имени этого пользователя. -
Скопируйте содержимое файла
adm-kubeconfig.jsonс узла кластера на деплой-ноду в файл~/.kube/config.
Настройте прохождение трафика между портами одним из способов:
Получите идентификатор порта каждого узла кластера и добавьте разрешенные адреса:
$ openstack port set --allowed-address ip-address=10.20.0.252/32 <ID_ПОРТА_УЗЛА>$ openstack port set --allowed-address ip-address=10.20.0.253/32 <ID_ПОРТА_УЗЛА>$ openstack port set --allowed-address ip-address=10.20.0.254/32 <ID_ПОРТА_УЗЛА>
Здесь:
<ID_ПОРТА_УЗЛА>— идентификатор порта узла кластера. Получите его с помощью командыopenstack port list --server <ИМЯ_УЗЛА>.<ИМЯ_УЗЛА_1>,<ИМЯ_УЗЛА_2>,<ИМЯ_УЗЛА_3>— имена или IP-адреса узлов кластера.<ПОДСЕТЬ_УЗЛОВ>— подсеть, в которой находятся узлы кластера. Пример:10.20.0.0/24.