Kubernetes (K8s) - это система оркестрации с открытым исходным кодом, разработанная для автоматизации развертывания, масштабирования и управления контейнеризованными приложениями. Она позволяет упростить работу с контейнерами, обеспечивая автоматическое управление жизненным циклом приложений, балансировку нагрузки и масштабирование.
В Kubernetes узлы (Nodes) делятся на два основных типа: главные узлы (Master Nodes или Control Plane) и рабочие узлы (Worker Nodes). Главные узлы отвечают за управление кластером Kubernetes, в то время как рабочие узлы выполняют фактическую работу, запуская контейнеры с приложениями.
Так как эта статья может устареть, перед установкой лучше узнать актуальную информацию на официальном сайте:
Каждый узел Kubernetes должен иметь соответствующую DNS запись, чтобы узлы могли обращаться к друг другу по именам.
Для начала обновите дистрибутив и отключите файл подкачки (SWAP):
sudo dnf update
# Отключение файла подкачки
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
Если настроен firewalld нужно будет открыть следующие порты:
# Добавляем основные порты для Master Node
sudo firewall-cmd --permanent --zone=public --add-port=6443/tcp
sudo firewall-cmd --permanent --zone=public --add-port=2379-2380/tcp
sudo firewall-cmd --permanent --zone=public --add-port=10250/tcp
sudo firewall-cmd --permanent --zone=public --add-port=10259/tcp
sudo firewall-cmd --permanent --zone=public --add-port=10257/tcp
# Если используется CNI Calico (BGP)
sudo firewall-cmd --permanent --zone=public --add-port=179/tcp
# Если используется CNI Flannel (VXLAN)
sudo firewall-cmd --permanent --zone=public --add-port=8472/udp
# Опционально: открываем NodePort диапазон
sudo firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
# Перезагружаем firewalld
sudo firewall-cmd --reload
# Проверяем открытые порты
sudo firewall-cmd --zone=public --list-ports
Так же для корректной работы требуется отключить SELinux:
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
Затем произведите настройку сети и модулей ядра Linux:
# Настройка перенаправления IPv4 и разрешение iptables видеть bridge-трафик
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# Загрузка модулей ядра
sudo modprobe overlay
sudo modprobe br_netfilter
#Для проверки автоматической загрузки модулей br_netfilter и overlay выполним команды:
lsmod | grep br_netfilter
lsmod | grep overlay
# Параметры sysctl, необходимые для настройки, сохраняются после перезагрузки
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# Применение параметров sysctl без перезагрузки
sudo sysctl --system
После чего указываем официальный репозиторий пакетов на котором хранятся компоненты Kubernetes:
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key
EOF
Далее перейдем к самой установке пакетов K8s:
sudo dnf makecache
sudo dnf install -y kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
# Помечаем пакеты как исключённые из обновлений
sudo dnf install 'dnf-command(versionlock)'
sudo dnf versionlock add kubelet kubeadm kubectl
#Установка Containerd
#Предварительно стоит убедится, что эта версия containerd совместима с версией k8s
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install containerd.io
sudo systemctl enable --now containerd
По умолчанию конфигурацию Containerd пуста, нам нужно ее создать и правильно отредактировать:
# Создание конфигурации containerd по умолчанию
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
Команды ниже позволяют создать кластер
# Инициализация кластера Kubernetes с указанием сети для pod'ов
sudo kubeadm init --pod-network-cidr=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
# Создание команды для присоединения worker-узлов к кластеру
kubeadm token create --print-join-command
После чего ваш Control Plane и кластер готовы.
Для начала обновите дистрибутив и отключите файл подкачки (SWAP):
sudo dnf update
# Отключение файла подкачки
sudo swapoff -a
sudo sed -i '/ swap / s/^/#/' /etc/fstab
Если настроен firewalld нужно будет открыть следующие порты:
# Добавляем порты для Worker Node
sudo firewall-cmd --permanent --zone=public --add-port=10250/tcp
sudo firewall-cmd --permanent --zone=public --add-port=30000-32767/tcp
# Если используется CNI Calico (BGP)
sudo firewall-cmd --permanent --zone=public --add-port=179/tcp
# Если используется CNI Flannel (VXLAN)
sudo firewall-cmd --permanent --zone=public --add-port=8472/udp
# Для CoreDNS (если поды используют DNS)
sudo firewall-cmd --permanent --zone=public --add-port=53/udp
sudo firewall-cmd --permanent --zone=public --add-port=53/tcp
# Перезагружаем firewalld
sudo firewall-cmd --reload
# Проверяем открытые порты
sudo firewall-cmd --zone=public --list-ports
Так же для корректной работы требуется отключить SELinux:
sudo setenforce 0
sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
Затем произведите настройку сети и модулей ядра Linux:
Настройка перенаправления IPv4 и разрешение iptables видеть bridge-трафик
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF
# Загрузка модулей ядра
sudo modprobe overlay
sudo modprobe br_netfilter
#Для проверки автоматической загрузки модулей br_netfilter и overlay выполним команды:
lsmod | grep br_netfilter
lsmod | grep overlay
# Параметры sysctl, необходимые для настройки, сохраняются после перезагрузки
cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
# Применение параметров sysctl без перезагрузки
sudo sysctl --system
После чего указываем официальный репозиторий пакетов на котором хранятся компоненты Kubernetes:
cat <<EOF | sudo tee /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/
enabled=1
gpgcheck=1
gpgkey=https://pkgs.k8s.io/core:/stable:/v1.33/rpm/repodata/repomd.xml.key
EOF
Далее перейдем к самой установке пакетов K8s:
sudo dnf makecache
sudo dnf install -y kubelet kubeadm kubectl
sudo systemctl enable --now kubelet
# Помечаем пакеты как исключённые из обновлений
sudo dnf install 'dnf-command(versionlock)'
sudo dnf versionlock add kubelet kubeadm kubectl
#Установка Containerd
#Предварительно стоит убедится, что эта версия containerd совместима с версией k8s
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install containerd.io
sudo systemctl enable --now containerd
По умолчанию конфигурацию Containerd пуста, нам нужно ее создать и правильно отредактировать:
# Создание конфигурации containerd по умолчанию
containerd config default | sudo tee /etc/containerd/config.toml
sudo sed -i 's/SystemdCgroup \= false/SystemdCgroup \= true/g' /etc/containerd/config.toml
sudo systemctl restart containerd
Остается только ввести Worker ноду в кластер, для этого используйте команду ввода, которую вы получили на Master ноде. Пример такой команды ниже:
sudo kubeadm join 172.16.1.100:6443 --token l6jogc.wcu2lul3odn9sk31 --discovery-token-ca-cert-hash sha256:df4c8ee5ce7c156e6f67b08bfb78449e8f0735af5a49a8fce4d10480fb5c782e
После ввода проверьте на Мастере, что все узлы появились в кластере:
kubectl get nodes -o wide
Если во время инициализации кластера возникли ошибки, их нужно исправить, откатиться и начать процесс инициализации заново.
Команда для отката инициализации:
kubeadm reset