логотип PurpleSchool
логотип PurpleSchool

Гайд по Kubernetes на разных дистрибутивах Linux

Автор

Олег Марков

Введение

Kubernetes — это популярная система для автоматизации развертывания, масштабирования и управления контейнеризированными приложениями. Одна из причин, почему Kubernetes стал таким востребованным инструментом, — его кроссплатформенность: вы можете запускать его на различных дистрибутивах Linux в любых инфраструктурах, от облака до bare metal-серверов.

В этой статье вы найдете практический гайд по установке и базовой настройке Kubernetes на ряде популярных дистрибутивов Linux: Ubuntu, CentOS, Debian, Fedora, RHEL и openSUSE/SUSE. Я покажу, какие различия и особенности встречаются на разных системах, как быстро подготовить серверы к запуску кластера и с какими нюансами чаще всего сталкиваются разработчики и администраторы.

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


Обзор: как работает установка Kubernetes

Kubernetes — это система, которая обычно разворачивается минимум на двух машинах (узлах): управляющий узел (control plane) и рабочий узел (worker node). Для установки и управления Kubernetes используются несколько ключевых компонентов:

  • kubeadm — инструмент для инициализации и управления кластером.
  • kubelet — агент, который запускается на каждом узле и управляет контейнерами.
  • kubectl — утилита командной строки для управления кластером.

Наиболее распространённый способ установки Kubernetes — с помощью официальных пакетов, через репозитории дистрибутива или Docker-контейнеры. Но важно помнить: разные дистрибутивы Linux могут иметь свои нюансы — поддержка версий, различия в системах управления пакетами, правила работы с firewall и SELinux/AppArmor.


Установка Kubernetes на Ubuntu

Ubuntu — один из самых популярных дистрибутивов для серверов, в том числе для Kubernetes. Давайте разберём пошаговую установку самого последнего стабильного релиза Kubernetes (на момент написания статьи — 1.29).

Подготовка окружения

Для начала стоит убедиться, что у вас как минимум две машины с Ubuntu 20.04 LTS или новее, и каждая имеет уникальный hostname и статический IP.

# Проверяем версию ОС
lsb_release -a

# Меняем hostname (например, для управляющего узла)
sudo hostnamectl set-hostname master-node

Установка Docker

Kubernetes для работы с контейнерами использует container runtime. Самый популярный — Docker, хотя можно использовать и containerd.

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce

Не забудьте добавить пользователя в группу docker, чтобы избегать проблем с правами:

sudo usermod -aG docker $USER

Добавление репозитория Kubernetes и установка компонентов

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Используйте apt-mark hold, чтобы избежать автоматического обновления этих пакетов.

Отключение swap

Kubernetes не работает с включённым swap. Отключите его:

sudo swapoff -a
# Чтобы отключить swap навсегда, закомментируйте или удалите строку swap в /etc/fstab
sudo sed -i '/ swap / s/^/#/' /etc/fstab

Открытие портов firewall (если используется UFW)

sudo ufw allow 6443/tcp   # API server
sudo ufw allow 2379:2380/tcp # etcd server client API
sudo ufw allow 10250/tcp  # Kubelet API
sudo ufw allow 10251/tcp  # kube-scheduler
sudo ufw allow 10252/tcp  # kube-controller-manager

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

На управляющем узле запускается команда инициализации:

sudo kubeadm init --pod-network-cidr=10.244.0.0/16
# --pod-network-cidr указывает диапазон IP для Pod-сети, для Flannel обычно используется 10.244.0.0/16

Далее выводится команда, которую надо выполнить на рабочих узлах, чтобы подключить их к кластеру. Скопируйте её.

Настройка kubectl

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

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

Для работы Pod'ов необходим сетевой плагин. Например, Flannel:

kubectl apply -f https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml

Установка Kubernetes на CentOS и RHEL

CentOS и Red Hat Enterprise Linux часто используются в корпоративных инфраструктурах. Смотрите, как здесь отличается процесс установки.

Подготовка системы

Убедитесь, что у вас CentOS 7 или новее.

Отключение SELinux

Kubernetes и многие сетевые плагины не работают с включённым SELinux в режиме Enforcing:

sudo setenforce 0    # Временно
# Чтобы отключить навсегда:
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

Отключение swap и настройка sysctl

sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab

Для включения необходимых параметров ядра:

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF
sudo sysctl --system

Установка Docker (или containerd)

sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce
sudo systemctl enable --now docker

Добавление репозитория Kubernetes

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

Установка компонентов

sudo yum install -y kubelet kubeadm kubectl
sudo systemctl enable --now kubelet

Открытие портов firewall (Firewalld)

sudo firewall-cmd --permanent --add-port=6443/tcp
sudo firewall-cmd --permanent --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --add-port=10250/tcp
sudo firewall-cmd --permanent --add-port=10251/tcp
sudo firewall-cmd --permanent --add-port=10252/tcp
sudo firewall-cmd --reload

Инициализация и настройка аналогична Ubuntu

Используйте аналогичные команды инициализации и настройки kubectl, как описано выше.


Установка Kubernetes на Debian

Debian стабилен и прогнозируем, а процесс развёртывания близок к Ubuntu с парой отличий.

Установка Docker

sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io

Добавление Kubernetes repository

sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubelet kubeadm kubectl
sudo apt-mark hold kubelet kubeadm kubectl

Остальные шаги идентичны Ubuntu


Установка Kubernetes на Fedora

Fedora актуальна на workstation и может использоваться для тестовых стендов или CI/CD.

Установка containerd

sudo dnf install -y dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo
sudo dnf install -y containerd.io
sudo systemctl enable --now containerd

Установка Kubernetes

cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://packages.cloud.google.com/yum/doc/yum-key.gpg https://packages.cloud.google.com/yum/doc/rpm-package-key.gpg
EOF

sudo dnf install -y kubelet kubeadm kubectl
sudo systemctl enable --now kubelet

Отключение SELinux

sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config

Swap, sysctl и firewall — как на CentOS


Установка Kubernetes на openSUSE и SUSE Linux Enterprise

SUSE славится своей стабильностью и продуманной документацией, но установка Kubernetes здесь чуть менее “канонична”.

Установка Docker

sudo zypper refresh
sudo zypper install -y docker
sudo systemctl enable --now docker

Добавление Kubernetes репозитория

sudo zypper ar -f https://packages.cloud.google.com/yum/repos/kubernetes-el7-x86_64 kubernetes
sudo rpm --import https://packages.cloud.google.com/yum/doc/yum-key.gpg
sudo zypper ref
sudo zypper in kubelet kubeadm kubectl

Настройка параметров ядра и swap

sudo swapoff -a
sudo sed -i '/swap/d' /etc/fstab

sudo tee /etc/sysctl.d/99-kubernetes.conf <<EOF
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
EOF
sudo sysctl --system

SELinux и firewall

SUSE также требует перевести SELinux в permissive (или отключить) и открыть необходимые порты в firewall (firewalld или iptables).

Остальные шаги, включая инициализацию и настройку kubectl, аналогичны другим дистрибутивам


Сравнение подходов и нюансы разных дистрибутивов

Bootstrapping: В чем разница?

  • Ubuntu/Debian: Быстрее всего стартует благодаря широкому использованию на DevOps-рынке; обновления часто выходят в первую очередь.
  • CentOS/RHEL/SUSE: Придется вручную настраивать SELinux, firewall и sysctl, что добавляет шаги, но зато повышает безопасность.
  • Fedora: Отличается свежими пакетами, подходит скорее для экспериментов, чем для production.
  • SUSE: Иногда требуется пересобирать некоторые пакеты либо использовать неофициальные репозитории.

Работа с сетевыми плагинами

Плагины сети (например, Flannel, Calico, Weave Net, Cilium) требуют дополнительных настроек на системном уровне. На дистрибутивах с SELinux часто приходится включать permissive-режим (или внимательно настраивать политики).

Интеграция с контейнерными рантаймами

  • Docker совместим почти со всеми, но с 1.20 Kubernetes рекомендуется использовать containerd.
  • Не все дистрибутивы быстро обновляют containerd, иногда требуется ручная установка актуальной версии.

Автоматизация и поддержка

  • На всех дистрибутивах можно использовать Ansible, Terraform или kubespray, чтобы автоматизировать установку.
  • Для корпоративных сетей стоит использовать только репозитории дистрибутива или официальные образы.

Развёртывание рабочих узлов

Подключение рабочих узлов производится на любом дистрибутиве одинаково:

# Выполните выводимую на управляющем узле команду
sudo kubeadm join <master_ip>:<port> --token <token> --discovery-token-ca-cert-hash sha256:<hash>
# После подключения можно проверить узлы:
kubectl get nodes

Если возникает ошибка, убедитесь, что firewall открыт, hostname уникален, swap отключен, clock синхронизирован (ntpd/chrony) и DNS-разрешение работает.


Советы по обновлению и резервному копированию

  • Для обновления используйте только документацию вашей “ветки” Kubernetes.
  • Держите резервные копии /etc/kubernetes, etcd (если управляете им напрямую) и резервируйте yaml-манифесты.
  • Не обновляйте kubelet, kubeadm, kubectl “вслепую” — используйте test cluster.

Заключение

Теперь у вас есть пошаговое представление, как развернуть Kubernetes на самых распространённых дистрибутивах Linux — Ubuntu, Debian, CentOS, Fedora, RHEL и SUSE. Каждый из них требует некоторых уникальных настроек, особенно в части SELinux, управления пакетами, работы с firewall и настройкой контейнерного рантайма. Но основной принцип развертывания — неизменен, если вы понимаете архитектуру и следуете рекомендациям официальной документации. Примеры команд и решений из этого гайда позволят вам быстро подготовить любую платформу для продуктивной работы с Kubernetes.


Частозадаваемые технические вопросы по теме

Как безопасно обновлять кластер Kubernetes на разных дистрибутивах?

Перед обновлением убедитесь, что есть резервные копии etcd и всех манифестов. Используйте команду kubeadm upgrade plan на управляющем узле, чтобы узнать доступные версии. Сначала обновляйте control-plane, потом worker nodes. На каждом узле обновляйте kubeadm, затем запускайте kubeadm upgrade node. Только после этого обновляйте kubelet и kubectl.

Как сменить IP-адрес master-узла, если сеть изменилась?

Вам потребуется обновить значение advertise-address и все связанные записи (например, сертификаты, настройки kubelet, файлы /etc/kubernetes/*). Затем перезапустите службы или пересоздайте кластер, если это тестовая среда. В production-средах обычно такие операции проводят через HA или миграцию на новый кластер.

Что делать, если после установки network plugin не работает связь между Pod'ами?

Проверьте, отключен ли swap, настроены ли параметры sysctl (net.bridge.bridge-nf-call-iptables = 1). Если используете SELinux, попробуйте режим permissive. Проверьте логи плагина (kubectl -n kube-system logs <podname>).

Как устранить ошибку "Failed to create pod sandbox: rpc error: code = Unknown desc = failed to set up sandbox container"?

Судя по ошибке, проблема в interaction с контейнерным рантаймом (docker/containerd). Проверьте, что ваша версия runtime поддерживается текущей версией Kubernetes. Перезапустите службу контейнерного рантайма (sudo systemctl restart docker или containerd). Также убедитесь, что cgroups у runtime и kubelet совпадают.

Как добавить дополнительный disk и использовать его для хранения данных etcd?

Смонтируйте новый диск (например, /mnt/etcd-data). Обновите файл /etc/kubernetes/manifests/etcd.yaml, заменив путь в volumeMounts на свежесмонтированный диск. Перезапустите pod etcd (или node), проверьте его статус через kubectl -n kube-system get pods.


Стрелочка влевоManaged Kubernetes плюсы и минусыУстановка и настройка Kubernetes с нуляСтрелочка вправо

Постройте личный план изучения Kubernetes до уровня Middle — бесплатно!

Kubernetes — часть карты развития DevOps

  • step100+ шагов развития
  • lessons30 бесплатных лекций
  • lessons300 бонусных рублей на счет

Бесплатные лекции

Все гайды по Kubernetes

Terraform и Kubernetes инфраструктура как кодНастройка и использование Runners в KubernetesНастройка и деплой PostgreSQL в KubernetesСравнение и интеграция Openshift и KubernetesПримеры интеграции GitHub Actions и KubernetesDeploy приложений в Kubernetes - пошаговое руководство для начинающих и не толькоКак настроить CD в KubernetesИнтеграция Ansible в KubernetesИнтеграция CI/CD с Jenkins и KubernetesИнтеграция Kubernetes с GitLab - Автоматизация CI CD в облачной инфраструктуреГайд по DevOps инструментам в KubernetesОсобенности платформы Deckhouse в Kubernetes
Открыть базу знаний

Лучшие курсы по теме

изображение курса

Kubernetes и Helm

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.9
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Docker и Ansible

Антон Ларичев
AI-тренажеры
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Микросервисы

Антон Ларичев
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее

Отправить комментарий