> 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/podgotovka-utm-k8s-master3-1/podgotovka-utm-k8s-master3-1-staraya-statya.md).

# Подготовка utm-k8s-master3-1 (СТАРАЯ СТАТЬЯ!)

## Описание

Как основа использовалась инструкция "Гайд для новичков по установке Kubernetes (версия 03.2025)": [habr.com](https://habr.com/ru/articles/725640/)

Базовая статья с официальной документацией: <https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/>

## Параметры

Виртуальный сервер

Имя узла: utm-k8s-master3-1

IP узла: 192.168.3.1

ОС: Ubuntu Server 24.04.3 LTS

RAM: 4 GB

CPU: 2

Hard Disk: 20 GB

Запущен в VMware Workstation на utm-server3 (192.168.1.3)

## Настройка

### Базовая подготовка

За основу взят подготовленный [базовый образ utm-baseserver](broken://pages/5ldrsacHHPCVHtn2aQKi) для VMware Workstation.

Выполнить действия

1. Если запущен, то остановить ВМ utm-baseserver
2. В VMware Workstation выполнить Full clone ВМ Base Server в ВМ utm-k8s-master3-1
3. Запустить ВМ utm-k8s-master3-1
4. Поменять имя запущенной ВМ на utm-k8s-master3-1
5. На роутере в DHCP присвоить utm-k8s-master3-1 IP адрес 192.168.1.3
6. Перезагрузить ВМ и проверить что имя хоста стало utm-k8s-master3-1 и IP адрес 192.168.1.3
7. Настроить автозапуск ВМ utm-k8s-master3-1

### Базовые пакеты и настройки

Установка и настройка под su

```bash
sudo su
```

Установить базовые пакеты:  curl, wget, gnupg, sudo, iptables

```bash
apt update
apt install -y curl
apt install -y wget
apt install -y gnupg
apt install -y sudo
apt install -y iptables
```

Настройка автозагрузки и запуск модуля ядра br\_netfilter и overlay

```bash
cat <<EOF | tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
```

Включить overlay и br\_netfilter

```bash
modprobe overlay
modprobe br_netfilter
```

Разрешение маршрутизации IP-трафика

<pre class="language-bash"><code class="lang-bash"><strong>echo -e "net.bridge.bridge-nf-call-ip6tables = 1\nnet.bridge.bridge-nf-call-iptables = 1\nnet.ipv4.ip_forward = 1" > /etc/sysctl.d/10-k8s.conf
</strong>sysctl -f /etc/sysctl.d/10-k8s.conf
</code></pre>

Отключение файла подкачки

```bash
swapoff -a
sed -i '/ swap / s/^/#/' /etc/fstab
```

### Проверка базовых настроек

Работа под su

```bash
sudo su
```

Проверка автоматической загрузки модулей *br\_netfilter* и *overlay*

```bash
lsmod | grep br_netfilter
lsmod | grep overlay

## Ожидаемый результат должен быть следующим (цифры могут отличаться):
# br_netfilter           32768  0
# bridge                258048  1 br_netfilter
# overlay               147456  0
```

Проверка настроек сетевого стека

```bash
sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward

# Ожидаемый результат:
# net.bridge.bridge-nf-call-iptables = 1
# net.bridge.bridge-nf-call-ip6tables = 1
# net.ipv4.ip_forward = 1
```

Проверка отключения файла подкачки

```bash
swapon -s

## Ожидаемый вывод команды – пустой. Она ничего не должна отобразить.
```

### Установка kubeadm, kubectl и kubelet

Источник:

<https://kubernetes.io/docs/setup/production-environment/tools/kubeadm/install-kubeadm/>

<https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/>

<https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/#install-using-native-package-management>

Работа под su

```bash
sudo su
```

Определение текущей стабильной версии

```bash
echo $(curl -L -s https://dl.k8s.io/release/stable.txt)
```

На 26.10.2025 текущая стабильная версия v1.34.1

#### Установка с использованием собственного управления пакетами <a href="#install-using-native-package-management" id="install-using-native-package-management"></a>

Подготовить пакеты

```shell
sudo su
apt update
# apt-transport-https may be a dummy package; if so, you can skip that package
apt install -y apt-transport-https ca-certificates curl gnupg
```

**Загрузить открытый ключ подписи для репозиториев пакетов Kubernetes.** Для всех репозиториев используется один и тот же ключ подписи, поэтому версию в URL можно не учитывать:

```shell
# If the folder `/etc/apt/keyrings` does not exist, it should be created before the curl command, read the note below.
# sudo mkdir -p -m 755 /etc/apt/keyrings
curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.34/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
chmod 644 /etc/apt/keyrings/kubernetes-apt-keyring.gpg # allow unprivileged APT programs to read this keyring
```

**Добавьте соответствующий apt репозиторий Kubernetes**. Если вы хотите использовать версию Kubernetes, отличную от v1.34, замените v1.34 на нужную младшую версию в команде ниже:

```shell
# This overwrites any existing configuration in /etc/apt/sources.list.d/kubernetes.list
echo 'deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.34/deb/ /' | tee /etc/apt/sources.list.d/kubernetes.list
sudo chmod 644 /etc/apt/sources.list.d/kubernetes.list   # helps tools such as command-not-found to work correctly
```

**Установите kubeadm, kubectl, kubelet**

```shell
apt update
apt install -y kubeadm
apt install -y kubectl
apt install -y kubelet
```

### Установка контейнерного движка **cri-o**

Официальная документация: <https://github.com/cri-o/cri-o/blob/main/install.md>

Версии <https://github.com/cri-o/cri-o/releases>

Работа под su

```bash
sudo su
```

Выполнить команды:

```bash
KUBERNETES_VERSION=v1.34
CRIO_VERSION=v1.34

apt-get install -y software-properties-common

curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/deb/Release.key |
    gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
    
echo "deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/$CRIO_VERSION/deb/ /" |
    tee /etc/apt/sources.list.d/cri-o.list

apt-get update
apt-get install -y cri-o

systemctl daemon-reload
systemctl enable --now crio.service

# Проверяем статус crio 
systemctl status crio
```

**Проверка доступности сокета cri-o**\
\
Выполнить команду:

```bash
crictl --runtime-endpoint unix:///var/run/crio/crio.sock version

## Ожидаемый результат:
# Version:  0.1.0
# RuntimeName:  cri-o
# RuntimeVersion:  1.34.1
# RuntimeApiVersion:  v1
```

Проверка запуска контейнеров с помощью cri-o

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

Кроме доступности сокета мы можем проверить фактическую возможность запуска контейнеров.

<details>

<summary>Выполнить команды:</summary>

```bash
export CONTAINER_RUNTIME_ENDPOINT=unix:///run/crio/crio.sock

cat > pod.config << _EOF_
{
    "metadata": {
        "name": "test-pod",
        "namespace": "default",
        "attempt": 1,
        "uid": "18fbfef14ae3a43"
    },
    "log_directory": "/tmp",
    "linux": {
    }
}
_EOF_

cat > container.config << _EOF_
{
  "metadata": {
    "name": "hello-world-container"
  },
  "image":{
    "image": "hello-world"
  },
  "log_path":"hello-world.log",
  "linux": {
  }
}
_EOF_

crictl pull hello-world
#crictl run container.config pod.config

POD_ID=$(crictl runp pod.config)
CONTAINER_ID=$(crictl create $POD_ID container.config pod.config)
crictl start $CONTAINER_ID

cat /tmp/hello-world.log

## Ожидаемый ответ
# …
# 2023-03-28T20:06:48.436017504+03:00 stdout F
# 2023-03-28T20:06:48.436017504+03:00 stdout F Hello from Docker!
# …
```

</details>

#### Настройка в cri-o обхода блокировки скачивания образов с docker.io

Настраивается следующее поведение. Если идет обращение к репозиторию docker.io, то оно будет перенаправляться на зеркало mirror.gcr.io от Google.

Решение на основе статьи: <https://devandops.kz/index.php/lesson/registry-mirrors-v-cri-o/>

Внести изменения в файл /etc/containers/registries.conf. Если файла нет, то создать его.

```bash
sudo nano /etc/containers/registries.conf
```

<details>

<summary>Содержание файла /etc/containers/registries.conf</summary>

```
[[registry]]
  prefix="docker.io"
  ### ### префикс будет заменён на значение location
  location = "mirror.gcr.io"
  ### данному registry разрешены pull images
  blocked = false
  ### Ecли insecure = true, то для данного registry разрешены незащищённые протоколы соединения (http),
  ### так же если используется защищённый протокол соединения (https),
  ### то cri-o будет доверяет самоподписному сертификату
  insecure = true
```

</details>

Также необходимо решить еще одну проблему.

При попытке скачать образ без явного указания репозитория, crictl  выдает ошибку.

```bash
sudo crictl pull nginx

E1027 15:30:13.219140  315250 log.go:32] "PullImage from image service failed" err="rpc error: code = Unknown desc = short name mode is enforcing, but image name nginx returns ambiguous list" image="nginx"
FATA[0000] pulling image: short name mode is enforcing, but image name nginx returns ambiguous list
```

Для решения этой проблемы необходимо отредактировать файл /etc/containers/registries.conf.d/crio.conf

```bash
sudo nano /etc/containers/registries.conf.d/crio.conf
```

Стандартно, в этом файле всего одна строка со следующим содержанием

```
unqualified-search-registries = ["docker.io", "quay.io"]
```

Её необходимо отредактировать следующим образом

```
unqualified-search-registries = ["docker.io"]
```

Последним шагом необходимо перезапустить crio

```bash
sudo systemctl daemon-reload
sudo systemctl restart crio
```

Проверка

Скачать образы nginx

```bash
# Последний без явного указания репозитория
sudo crictl pull nginx:latest
# По метке  без явного указания репозитория
sudo crictl pull nginx:1.29.1
# По метке с явным указанием репозитория docker.io
sudo crictl pull docker.io/nginx:1.20.1

# Посмотреть все скачанные образы
sudo crictl images

# Удалить скачанные образы
sudo crictl rmi nginx:latest
sudo crictl rmi nginx:1.29.1
sudo crictl rmi docker.io/nginx:1.20.1
```

### Установка контейнерного движка (**Docker + cri-dockerd)**

{% hint style="danger" %}
НЕ ВЫПОЛНЯТЬ!

Docker + cri-dockerd - не удалось запустить kubeadm init - всё время была ошибка.

kubeadm init сработал только с движком cri-o
{% endhint %}

#### Установка Docker

Официальное руководство: <https://docs.docker.com/engine/install/ubuntu/>

Работа под su

```bash
sudo su
```

Удалить старую версию

Run the following command to uninstall all conflicting packages:

```bash
 for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
```

Установить apt репозитории Docker

<pre class="language-bash"><code class="lang-bash"># Add Docker's official GPG key:
apt update
apt install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
<strong>curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
</strong>chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
  $(. /etc/os-release &#x26;&#x26; echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
  tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
</code></pre>

Установить пакеты Docker

```bash
apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
```

Проверить как установился Docker

```bash
sudo systemctl status docker
```

Также можно запустить.

Эта команда загружает тестовый образ и запускает его в контейнере. После запуска контейнер выводит сообщение с подтверждением и завершает работу.

```bash
sudo docker run hello-world
```

#### Установка плагина cri-docker

Версии плагина cri-docker: <https://github.com/Mirantis/cri-dockerd/releases/>

Работа под su

```bash
sudo su
```

Версия 0.4.0.3-0.ubuntu-jammy\_amd64

Для ubuntu для установки выбрана версия <https://github.com/Mirantis/cri-dockerd/releases/download/v0.4.0/cri-dockerd_0.4.0.3-0.ubuntu-jammy_amd64.deb>

Выполнить команды:

```bash
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.4.0/cri-dockerd_0.4.0.3-0.ubuntu-jammy_amd64.deb
dpkg -i cri-dockerd_0.4.0.3-0.ubuntu-jammy_amd64.deb
rm cri-dockerd_0.4.0.3-0.ubuntu-jammy_amd64.deb
```

Версия 0.3.20.3-0.ubuntu-jammy\_amd64

Для ubuntu для установки выбрана версия <https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.20/cri-dockerd_0.3.20.3-0.ubuntu-jammy_amd64.deb>

Выполнить команды:

```bash
wget https://github.com/Mirantis/cri-dockerd/releases/download/v0.3.20/cri-dockerd_0.3.20.3-0.ubuntu-jammy_amd64.deb
dpkg -i cri-dockerd_0.3.20.3-0.ubuntu-jammy_amd64.deb
rm cri-dockerd_0.3.20.3-0.ubuntu-jammy_amd64.deb
```

Настроить образ (image) для песочницы (sandbox)

```bash
mkdir /etc/systemd/system/cri-docker.service.d/
cat > /etc/systemd/system/cri-docker.service.d/10-pause.conf <<EOF
# File: /etc/systemd/system/cri-docker.service.d/10-pause.conf
[Service]
ExecStart=
ExecStart=/usr/bin/cri-dockerd --container-runtime-endpoint fd:// --pod-infra-container-image "registry.k8s.io/pause:3.10"
EOF

systemctl daemon-reload
systemctl restart cri-docker.service
```

Настройка crictl

```bash
cat > /etc/crictl.yaml << _EOF
runtime-endpoint: unix:///var/run/cri-dockerd.sock
_EOF
```

**Проверка**

```bash
systemctl status cri-docker
```

#### Проверки Docker и cri-dockerd

Проверка доступности сокета cri-dockerd

```bash
crictl --runtime-endpoint unix:///var/run/cri-dockerd.sock version

## Ожидаемый результат:
# Version:  0.1.0
# RuntimeName:  docker
# RuntimeVersion:  28.1.1+1
# RuntimeApiVersion:  v1
```

Проверка возможности Docker запускать контейнеры

```bash
docker run hello-world

## Ожидаемый результат:
# …
# Hello from Docker!
# This message shows that your installation appears to be working correctly.
# …
```

#### Удаление cri-dockerd

Если понадобиться, то можно выполнить следующие команды:

```bash
sudo apt remove cri-dockerd
sudo systemctl stop cri-dockerd
sudo systemctl disable cri-dockerd
rm /etc/crictl.yaml
```

### Создание базового образа utm-k8s-basenode

Текущее состояние utm-k8s-master3-1 сохранить в виде образа utm-k8s-basenode

1. Остановить ВМ utm-k8s-master3-1
2. В VMware Workstation выполнить Full clone ВМ utm-k8s-master3-1 в ВМ utm-k8s-basenode
3. Запустить ВМ utm-k8s-basenode
4. Поменять имя запущенной ВМ на utm-k8s-basenode
5. Перезагрузить ВМ и проверить что имя хоста стало utm-k8s-basenode
6. Выключить ВМ utm-k8s-basenode
7. Запустить ВМ utm-k8s-master3-1 для продолжения настройки
