Kubernetes — один из самых популярных инструментов для управления контейнеризированными приложениями в современных средах разработки. В этой статье рассмотрим шаги по установке и настройке Kubernetes с использованием kubeadm.
Основные компоненты Kubernetes:
- мастер-нода (master) — узел, управляющий всем кластером. Он отслеживает другие узлы и распределяет нагрузку с помощью менеджера контроллеров и планировщика. Для повышения отказоустойчивости рекомендуем иметь несколько мастер-нод;
- рабочие узлы (worker) — узлы, на которых запускаются контейнеры. Чем больше рабочих узлов, тем больше приложений можно запустить. Количество узлов также влияет на отказоустойчивость кластера, так как при выходе из строя одного узла нагрузка перераспределяется на другие.
Рассмотрим, как развернуть стандартный Kubernetes-кластер, который состоит из master-узла и worker-узла.
начало примера
Примечание
Установка стандартного Kubernetes-кластера предназначена для среды разработки или тестирования. Для продуктовой среды рекомендуем установить Deckhouse.
конец примера
Установка Kubernetes-кластера состоит из четырёх этапов:
- Подготовить инфраструктуру.
- Подготовить master-узел.
- Подготовить worker-узел.
- Установить дополнительные компоненты.
Шаг 1: Подготовить инфраструктуру
Для развёртывания Kubernetes-кластера вам потребуются:
- Сервер физический или ВМ — управляющий узел (master-узлом) будущего кластера.
Минимальные системные требования:
- виртуальный процессор (CPU) — 2;
- виртуальная память (RAM) — 4 ГБ;
- виртуальный жёсткий диск (Storage) — 36 ГБ.
- Сервер физический или ВМ — рабочий узел (worker-узлом) будущего кластера.
Минимальные системные требования:
- виртуальный процессор (CPU) — 2;
- виртуальная память (RAM) — 2 ГБ;
- виртуальный жёсткий диск (Storage) — 36 ГБ.
Выполните следующие действия на всех узлах от пользователя root:
- Для работы kubelet отключите swap:
systemctl stop dev-zram0.swap
systemctl mask dev-zram0.swap
swapoff -a
Отключите загрузку swap после перезагрузки и закомментируйте запись подкачки в /etc/fstab
:
sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab
- Отключите SELinux:
setenforce 0 && sed -i --follow-symlinks
's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
- Создайте файл для автозагрузки модулей ядра, необходимых для работы сервиса containerd:
cat <<EOF | tee /etc/modules-load.d/containerd.conf
overlay
br_netfilter
EOF
Загрузите модули в ядро:
modprobe overlay
modprobe br_netfilter
- Создайте конфигурационный файл для работы сети внутри 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
- Установите необходимые пакеты:
- добавьте репозиторий 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
- Настройте проброс портов в iptables:
iptables -P FORWARD ACCEPT
- Установите настройки по умолчанию для конфигурации контейнера:
containerd config default | sudo tee /etc/containerd/config.toml
- Чтобы разрешить использовать cgroup, переключите флаг параметра
systemdCgroup
в конфигурационном файле/etc/containerd/config.toml
:
sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
- Запустите службу containerd и добавьте её в автозагрузку:
systemctl enable --now containerd
- Добавьте службу kubelet в автозагрузку:
systemctl enable kubelet.service
Шаг 2: Подготовить master-узел
Выполните следующие действия на master-узле от пользователя root:
- Запустите инициализацию master-ноды. Эта команда выполнит начальную настройку и подготовку основного узла кластера. Ключ
--pod-network-cidr
задаёт адрес внутренней подсети для будущего кластера:
kubeadm init --pod-network-cidr=10.244.0.0/16
- После успешной инициализации настройте параметры управления кластером:
mkdir /home/$USER/.kube
cp -i /etc/kubernetes/admin.conf /home/$USER/.kube/config
chown $USER. /home/$USER/.kube /home/$USER/.kube/config
- Установите внутреннюю конфигурацию сети в кластере:
kubectl apply -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.0/manifests/calico.yaml
- Чтобы вывести команду присоединения 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:
- Для установки Helm перейдите на страницу релизов Helm и загрузите архив
helm-vX.Y.Z-linux-amd64.tar.gz
необходимой версии.
Для установки через интернет выполните команду:
wget https://get.helm.sh/helm-vX.Y.Z-linux-amd64.tar.gz
Для оф-лайн установки в закрытом контуре без доступа в интернет
wget https://get.helm.sh/helm-vX.Y.Z-linux-amd64.tar.gz
|
- Распакуйте архив и переместите бинарный файл helm:
tar -zxvf helm-vX.Y.Z-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/helm
- Установите nginx контроллер:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.5/deploy/static/provider/cloud/deploy.yaml
- Обновите тип сервиса Ingress Nginx Controller на LoadBalancer и добавьте указанный внешний IP-адрес в список тех, которые могут использоваться для доступа к сервису, где
host_ip
— IP-адрес worker-ноды:
kubectl patch svc ingress-nginx-controller -n ingress-nginx -p '{"spec": {"type": "LoadBalancer", "externalIPs":["<host_ip>"]}}'
- Установите инструмент для динамического выделения томов Kubernetes HostPath:
helm repo add rimusz https://charts.rimusz.net
helm repo update
helm upgrade --install hostpath-provisioner --namespace kube-system rimusz/hostpath-provisioner