> For the complete documentation index, see [llms.txt](https://utm-1.gitbook.io/utm-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/kubernetes/razvertyvanie-ha-klastera/inicializaciya-klastera.md).

# Инициализация кластера

## Ссылки

Официальная документация: <https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/high-availability/>

## Установка и настройка

Для настройки выбран вариант [stacked control plane](https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/ha-topology/#stacked-etcd-topology) (etcd находя на управляющих узлах).

Инициализация кластера будет выполняться с помощью kubeadm

### Установка первого управляющего узла

Настройка производится на:

* utm-k8s-master3-1

Выполнить:

```bash
kubeadm init \
               --cri-socket unix:///var/run/crio/crio.sock \
               --pod-network-cidr=10.244.0.0/16 \
               --control-plane-endpoint "192.168.1.100:8888" \
               --upload-certs
```

> Примечание 1. --pod-network-cidr=10.244.0.0/16 выбрано для упрощения дальнейшей установки сетевого плагина flannel.

По окончанию процедуры должна появиться строка для добавления управляющих узлов в кластер.<br>

```
….
You can now join any number of the control-plane node running the following command on each as root:

  kubeadm join 192.168.1.100:8888 --token 4uvhjf.pmq742i3rofly0qr \
        --discovery-token-ca-cert-hash sha256:9cf1614b335f50f8a0014d45534f4ab702319c32111d2124285655cc7cbcdf60 \
        --control-plane --certificate-key 15489535ff4f00324eb23808585d3b9acddf38801069f92bf39f8404c677ffa9
….
```

Сохранить это значение для дальнейшего использования!\
\
Кроме указанной строки, будет показана строка для добавления рабочих узлов в кластер.

```

...
Then you can join any number of worker nodes by running the following on each as root:

kubeadm join 192.168.1.100:8888 --token 4uvhjf.pmq742i3rofly0qr \
        --discovery-token-ca-cert-hash sha256:9cf1614b335f50f8a0014d45534f4ab702319c32111d2124285655cc7cbcdf60
...
```

Сохранить это значение для дальнейшего использования!

> Примечание. Приведенные выше строки будут изменяться от инсталляции к инсталляции. Здесь они приведены для примера, копировать их отсюда не имеет смысла.

{% hint style="info" %}
Если в процессе kubeadm init возникли ошибки, то можно выполнить сначала kubeadm reset, а потом повторить kubeadm init
{% endhint %}

### Установка последующих управляющих узлов

Настройка производится на:

* utm-k8s-master4-1
* utm-k8s-master5-1

Использовать строку подключения, полученную после создания первого управляющего узла кластера.

Важно!

С учетом что используется контейнерный движок cri-o, то в строке подключения должен быть параметр --cri-socket unix:///var/run/crio/crio.sock

Если такого параметра нет в строке подключения, то его необходимо добавить.

> Внимание! В строке содержится конфиденциальная информация. Сертификаты для подключения будут автоматически удалены после 2-х часов с момента первичной инициализации кластера.

В случае успешного добавления узла среди вывода *kubeadm* должна быть строка:

```
…
This node has joined the cluster and a new control plane instance was created:
…
```

### Установка рабочих узлов кластера

Настройка производится на:

* utm-k8s-node3-5
* utm-k8s-node3-6
* и на остальных рабочих узлах, если они имеются

Запустить команду добавления рабочих узлов, полученную при установке первого управляющего узла.

> Примечание. Если по каким-то причинам вы ее потеряли, то на любом узле кластера введите команду «kubeadm token create --print-join-command», и она отобразится снова.

### Настройка kubeсtl

Настройка производится на:

* utm-k8s-master3-1
* utm-k8s-master4-1
* utm-k8s-master5-1

Выполнить:

```bash
echo "export KUBECONFIG=/etc/kubernetes/admin.conf" > /etc/environment
export KUBECONFIG=/etc/kubernetes/admin.conf
```

> Примечание. Выполнение этой команды на рабочих узлах не имеет смысла, так как на них отсутствует файл */etc/kubernetes/admin.conf*, автоматически создаваемый *kubeadm* при добавлении управляющего узла.

### Установка сетевого плагина

Настройка производится на:

* utm-k8s-master3-1

Выполнить:

```bash
kubectl apply -f https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
```

### Проверка

Приведенные ниже проверки можно запускать на любом узле кластера, на котором настроена работа kubectl.\
\
Проверка включения узлов в кластер:

```bash
kubectl get nodes

## Ожидаемый ответ:
# NAME             STATUS   ROLES           AGE   VERSION
# utm-k8s-master3-1   Ready    control-plane   60m   v1.34.1
# utm-k8s-master4-1   Ready    control-plane   47m   v1.34.1
# utm-k8s-master5-1   Ready    control-plane   46m   v1.34.1
# utm-k8s-node3-5     Ready    <none>          34m   v1.34.1
# utm-k8s-node3-6     Ready    <none>          34m   v1.34.1
```

Проверить состояние "*подов*" можно с помощью команды:

```
kubectl get pods -A
```

#### Тест 1. Запуск "*пода*" в интерактивном режиме.

Данный тест позаимствован из официальной [документации](https://kubernetes.io/ru/docs/reference/kubectl/cheatsheet/).

```bash
kubectl run -i --tty busybox --image=busybox -- sh

## Ожидаемый результат:
# If you don't see a command prompt, try pressing enter.
# / #
# / #
```

\
Вспомогательные команды:\
\
Переподключение к "*поду*" при выходе из интерактивного режима:<br>

```
kubectl attach busybox -i
```

Удаление "*пода*":

```
kubectl delete pod busybox
```

#### Тест 2. Запуск NGINX

\
Тест заключается в запуске Web-сервера nginx и обращения к нему после этого.

```
kubectl create deployment nginx-app --image=nginx
kubectl expose deployment nginx-app --type=NodePort --port=80 --target-port=80
sleep 5s
curl http://10.10.10.10

## Ожидаемый результат
# <!DOCTYPE html>
# <html>
# <head>
# <title>Welcome to nginx!</title>
# ...
```

\ <br>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://utm-1.gitbook.io/utm-docs/dokumentaciya/utm-it/resheniya/kubernetes/razvertyvanie-ha-klastera/inicializaciya-klastera.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
