﻿# Kubernetes-кластер на базе RedOS 8

> [HTML Version](kubernetes-on-redos.html)

Kubernetes — один из самых популярных инструментов для управления контейнеризированными приложениями в современных средах разработки. В этой статье рассмотрим шаги по установке и настройке Kubernetes с использованием kubeadm.

Основные компоненты Kubernetes:

- мастер-нода (master) — узел, управляющий всем кластером. Он отслеживает другие узлы и распределяет нагрузку с помощью менеджера контроллеров и планировщика. Для повышения отказоустойчивости рекомендуем иметь несколько мастер-нод;

- рабочие узлы (worker) — узлы, на которых запускаются контейнеры. Чем больше рабочих узлов, тем больше приложений можно запустить. Количество узлов также влияет на отказоустойчивость кластера, так как при выходе из строя одного узла нагрузка перераспределяется на другие.

Рассмотрим, как развернуть стандартный Kubernetes-кластер, который состоит из master-узла и worker-узла.

````
начало примера

````
**Примечание**

Установка стандартного Kubernetes-кластера предназначена для среды разработки или тестирования. Для продуктовой среды рекомендуем установить [Deckhouse](fail-safe-kubernetes-cluster.md).

````
конец примера

````
Установка Kubernetes-кластера состоит из четырёх этапов:

1. [Подготовить инфраструктуру](#preparation).

2. [Подготовить master-узел](#master-node).

3. [Подготовить worker-узел](#worker-node).

4. [Установить дополнительные компоненты](#other-components).

## Шаг 1. Подготовить инфраструктуру

Для развёртывания Kubernetes-кластера вам потребуются:

1. Сервер физический или ВМ — управляющий узел (master-узлом) будущего кластера.  
Минимальные системные требования:

- виртуальный процессор (CPU) — 2;

- виртуальная память (RAM) — 4 ГБ;

- виртуальный жёсткий диск (Storage) — 36 ГБ.

2. Сервер физический или ВМ — рабочий узел (worker-узлом) будущего кластера.  
Минимальные системные требования:

- виртуальный процессор (CPU) — 2;

- виртуальная память (RAM) — 2 ГБ;

- виртуальный жёсткий диск (Storage) — 36 ГБ.

Выполните следующие действия на всех узлах от пользователя **root**:

1. Для работы kubelet отключите swap:

````
systemctl stop dev-zram0.swap  
systemctl mask dev-zram0.swap  
swapoff -a

````
Отключите загрузку swap после перезагрузки и закомментируйте запись подкачки в \[OBJECT\]:

````
sed -i '/ swap / s/^\\(.\*\\)\$/#\\1/g' /etc/fstab

2. ````
Отключите SELinux:

````
setenforce 0 \&\& sed -i --follow-symlinks  
's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

3. ````
Создайте файл для автозагрузки модулей ядра, необходимых для работы сервиса containerd:

````
cat <<EOF | tee /etc/modules-load.d/containerd.conf  
overlay  
br\_netfilter  
EOF

````
Загрузите модули в ядро:

````
modprobe overlay  
modprobe br\_netfilter

4. ````
Создайте конфигурационный файл для работы сети внутри kubernetes:

````
cat <<EOF | tee /etc/sysctl.d/99-kubernetes-cri.conf  
net.bridge.bridge-nf-call-iptables = 1  
net.bridge.bridge-nf-call-ip6tables = 1  
net.ipv4.ip\_forward = 1  
EOF

````
Примените параметры:

````
sysctl --system

5. ````
Установите необходимые пакеты:

- добавьте репозиторий Kubernetes:

````
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo  
\[kubernetes\]  
name=Kubernetes  
baseurl=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/  
enabled=1  
gpgcheck=1  
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.30/rpm/repodata/repomd.xml.key  
exclude=kubelet kubeadm kubectl cri-tools kubernetes-cni  
EOF

- ````
установите kubelet, kubeadm и kubectl:

````
sudo yum install -y cri-tools containerd  
sudo yum install -y kubelet kubeadm kubectl --disableexcludes=kubernetes

6. ````
Настройте проброс портов в iptables:

````
iptables -P FORWARD ACCEPT

7. ````
Установите настройки по умолчанию для конфигурации контейнера:

````
containerd config default | sudo tee /etc/containerd/config.toml

8. ````
Чтобы разрешить использовать cgroup, переключите флаг параметра \[OBJECT\] в конфигурационном файле \[OBJECT\]:

````
sed -i 's/SystemdCgroup \\= false/SystemdCgroup \\= true/g' /etc/containerd/config.toml

9. ````
Запустите службу containerd и добавьте её в автозагрузку:

````
systemctl enable --now containerd

10. ````
Добавьте службу kubelet в автозагрузку:

````
systemctl enable kubelet.service

## ````
Шаг 2. Подготовить master-узел

Выполните следующие действия на master-узле от пользователя **root**:

1. Запустите инициализацию master-ноды. Эта команда выполнит начальную настройку и подготовку основного узла кластера. Ключ \[OBJECT\] задаёт адрес внутренней подсети для будущего кластера:

````
kubeadm init --pod-network-cidr=10.244.0.0/16

2. ````
После успешной инициализации настройте параметры управления кластером:

````
mkdir /home/\$USER/.kube  
cp -i /etc/kubernetes/admin.conf /home/\$USER/.kube/config  
chown \$USER. /home/\$USER/.kube /home/\$USER/.kube/config 

3. ````
Установите внутреннюю конфигурацию сети в кластере:

````
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml

4. ````
Чтобы вывести команду присоединения worker-узлов к кластеру, выполните следующую команду:

````
kubeadm token create --print-join-command

````
В результате сформируется команда вида:

````
kubeadm join 192.168.1.10:6443 --token c7nysv.vyt6wwx3df459ha5a --discovery-token-ca-cert-hash sha256:7cab98d22238e6240add52db9a25465d4668ac588fd70e8e3d9d3cbd4688c7

## ````
Шаг 3. Подготовить worker-узел

На worker-узле от пользователя **root** запустите полученную на предыдущем этапе команду, чтобы подключиться к master-узлу:

````
kubeadm join 192.168.1.10:6443 --token c7nysv.vyt6wwx3df459ha5a --discovery-token-ca-cert-hash sha256:7cab98d22238e6240add52db9a25465d4668ac588fd70e8e3d9d3cbd4688c7

## ````
Шаг 4. Установить дополнительные компоненты

Выполните следующие действия на master-узле от пользователя **root**:

1. Для установки Helm перейдите на страницу релизов [Helm](https://github.com/helm/helm/releases) и загрузите архив \[OBJECT\] необходимой версии. 

Для установки через интернет выполните команду:

````
wget https://get.helm.sh/helm-vX.Y.Z-linux-amd64.tar.gz

````
Для оф-лайн установки в закрытом контуре без доступа в интернет

1. На компьютере с доступом в интернет перейдите на страницу релизов [Helm](https://github.com/helm/helm/releases) и загрузите архив \[OBJECT\] необходимой версии:

````
wget https://get.helm.sh/helm-vX.Y.Z-linux-amd64.tar.gz

2. ````
Полученный архив скопируйте на master-узел.

2. Распакуйте архив и переместите бинарный файл **helm**:

````
tar -zxvf helm-vX.Y.Z-linux-amd64.tar.gz  
mv linux-amd64/helm /usr/bin/helm

3. ````
Установите nginx контроллер:

````
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.5/deploy/static/provider/cloud/deploy.yaml

4. ````
Обновите тип сервиса Ingress Nginx Controller на LoadBalancer и добавьте указанный внешний IP-адрес в список тех, которые могут использоваться для доступа к сервису, где \[OBJECT\] — IP-адрес worker-ноды:

````
kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '\{"spec": \{"type": "LoadBalancer", "externalIPs":\["<host\_ip>"\]\}\}'

5. ````
Установите инструмент для динамического выделения томов Kubernetes HostPath:

````
helm repo add rimusz https://charts.rimusz.net  
helm repo update  
helm upgrade --install hostpath-provisioner --namespace kube-system rimusz/hostpath-provisioner

````
