Поиск по сайту:

Как установить кластер Kubernetes с Kubeadm на Rocky Linux


На этой странице

  1. Предпосылки
  2. Настройка систем
  3. Настройка файла /etc/hosts
  4. Настройка правил брандмауэра
  5. Настройка модулей SELinux и ядра и отключение SWAP
  6. Установка среды выполнения контейнера: Containerd
  7. Установка пакетов Kubernetes
  8. Установка подключаемого модуля CNI: фланель
  9. Инициализация плоскости управления Kubernetes
  10. Добавление рабочих узлов в Kubernetes
  11. Заключение

Kubernetes или k8s — это платформа с открытым исходным кодом для оркестрации контейнеров, которая автоматизирует развертывание, управление и масштабирование контейнерных приложений. Kubernetes — это оркестровка контейнеров, созданная Google, которая теперь стала проектом с открытым исходным кодом и стандартом для современных платформ развертывания приложений и вычислений.

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

В этом руководстве вы настроите кластер Kubernetes, выполнив следующие действия:

  1. Настройка системы, включающая настройку файла /etc/hosts, настройку SELinux, включение модулей ядра и отключение SWAP.
  2. Настройка Firewalld путем добавления некоторых портов, необходимых для Kubernetes.
  3. Установка containerd в качестве среды выполнения контейнера для Kubernetes.
  4. Установка пакетов Kubernetes, таких как kubelet, kubeadm и kubectl.
  5. Установка сетевого подключаемого модуля Flannel для модулей Kubernetes.
  6. Инициализация одного узла плоскости управления и добавление двух рабочих узлов.

Предпосылки

Для выполнения этого руководства вам потребуются следующие требования:

  • Три или более серверов Rocky Linux.
  • Пользователь без полномочий root с правами root/администратора.

Настройка систем

Прежде чем вы начнете устанавливать какие-либо пакеты для развертывания Kubernetes, вам необходимо настроить все свои системы в соответствии с требованиями для развертывания Kubernetes. Сюда входят следующие конфигурации:

  • Настройте правильный файл /etc/hosts: каждое имя хоста сервера должно быть преобразовано в правильный IP-адрес. Это можно сделать несколькими способами, но самый простой и удобный — использовать файл /etc/hosts на всех серверах.
  • Настройка брандмауэра. Для производственной среды всегда рекомендуется включать брандмауэр как на уровне управления, так и на рабочих узлах.
  • Настройка SELinux: В этом примере мы изменим правило SELinux по умолчанию на \разрешающий\.
  • Включить модули ядра. Kubernetes требовал включения некоторых модулей ядра в системе Linux. Модуль ядра \overlay\ и \br_netfilter\ требуется, чтобы позволить iptables видеть трафик моста.
  • Отключить SWAP: это обязательно, вы должны отключить SWAP на всех узлах Kubernetes, как на уровне управления, так и на рабочих узлах. В противном случае служба kubelet будет работать с проблемами.

Настройка файла /etc/hosts

На этом первом шаге вы настроите системное имя хоста и файл /etc/hosts на всех ваших серверах. Для этой демонстрации мы будем использовать следующие серверы.

Hostname              IP Address        Used as
-------------------------------------------------------
kube-master           192.168.5.10      control-plane
kube-kube-worker1     192.168.5.15      worker node
kube-kube-worker2     192.168.5.16      worker node

Выполните приведенную ниже команду hostnamectl, чтобы настроить системное имя хоста на каждом сервере.

Для узла плоскости управления выполните следующую команду, чтобы установить системное имя хоста \kube-master\.

sudo hostnamectl set-hostname kube-master

Для рабочих узлов Kubernetes выполните следующую команду hostnamectl.

# setup hostname kube-worker1
sudo hostnamectl set-hostname kube-worker1

# setup hostname kube-worker2
sudo hostnamectl set-hostname kube-worker2

Затем измените файл /etc/hosts на всех серверах с помощью следующей команды.

sudo nano /etc/hosts

Добавьте следующую конфигурацию в файл. Убедитесь, что каждое имя хоста указывает на правильный IP-адрес.

192.168.5.10 kube-master
192.168.5.15 kube-worker1
192.168.5.16 kube-worker2

Сохраните и закройте файл, когда закончите.

Наконец, если вы запустите команду ping для каждого имени хоста, вам будет указан правильный IP-адрес, указанный в файле /etc/hosts.

ping kube-master -c3
ping kube-worker1 -c3
ping kube-worker2 -c3

Настройка правил брандмауэра

Kubernetes требовал, чтобы некоторые порты были открыты во всех ваших системах. В системе на основе RHEL по умолчанию Firewalld является приложением брандмауэра по умолчанию. Вы добавите несколько портов в Firewalld для развертывания Kubernetes.

Для плоскости управления Kubernetes вам необходимо открыть следующие порты:

Protocol  Direction Port Range  Purpose Used By
-----------------------------------------------
TCP       Inbound   6443        Kubernetes API server All
TCP       Inbound   2379-2380   etcd server client API  kube-apiserver, etcd
TCP       Inbound   10250       Kubelet API Self, Control plane
TCP       Inbound   10259       kube-scheduler  Self
TCP       Inbound   10257       kube-controller-manager Self

Для рабочих узлов Kubernetes необходимо открыть следующие порты:

Protocol  Direction Port Range  Purpose Used By
--------------------------------------------------
TCP       Inbound   10250       Kubelet API Self, Control plane
TCP       Inbound   30000-32767 NodePort Services†  All

На узле плоскости управления \kube-master\ выполните следующую команду firewall-cmd, чтобы открыть порты плоскости управления Kubernetes. Затем перезагрузите правила Firewalld и проверьте список доступных правил.

sudo firewall-cmd --add-port=6443/tcp --permanent
sudo firewall-cmd --add-port=2379-2380/tcp --permanent
sudo firewall-cmd --add-port=10250/tcp --permanent
sudo firewall-cmd --add-port=10259/tcp --permanent
sudo firewall-cmd --add-port=10257/tcp --permanent

sudo firewall-cmd --reload
sudo firewall-cmd --list-all

На рабочих узлах «kube-worker1» и «kube-worker2» выполните следующую команду firewall-cmd, чтобы открыть некоторые рабочие порты Kubernetes. Затем перезагрузите Firewalld и проверьте список доступных правил в Firewalld.

sudo firewall-cmd --add-port=10250/tcp --permanent
sudo firewall-cmd --add-port=30000-32767/tcp --permanent

sudo firewall-cmd --reload
sudo firewall-cmd --list-all

Настройте модули SELinux и ядра и отключите SWAP

Чтобы сервис Kubernetes kubelet работал правильно, вам нужно будет изменить SELinux по умолчанию на «разрешающий» или вы можете полностью отключить SELinux. В этом примере вы измените политику SELinux с «принудительной» на «разрешающую», что означает, что вы будете получать уведомления только от SELinux.

Выполните следующую команду, чтобы изменить политику SELinux по умолчанию на «разрешительную». Затем проверьте и проверьте текущий статус политики SELinux. Вы должны увидеть, что SELinux все еще включен, но с политикой «разрешительной».

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

sestatus

Затем Kubernetes потребовал, чтобы на всех серверах были включены модули ядра «overlay» и «br_netfilter». Это позволит iptbales видеть мостовой трафик. Также вам нужно будет включить переадресацию портов и отключить SWAP.

Запустите следующую команду, чтобы включить модули ядра \overlay\ и \br_netfilter\.

sudo modprobe overlay
sudo modprobe br_netfilter

Чтобы сделать его постоянным, создайте файл конфигурации в \/etc/modules-load.d/k8s.conf\. Это позволит системам Linux включать модули ядра во время загрузки системы.

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

Затем создайте необходимые параметры systemctl с помощью следующей команды.

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 без перезагрузки, используйте следующую команду. Вы должны получить список параметров sysctl по умолчанию в вашей системе и убедиться, что вы получили параметры sysctl, которые вы только что добавили в файл \k8s.conf\.

sudo sysctl --system

Чтобы отключить SWAP, вам нужно будет прокомментировать конфигурацию SWAP в файле \/etc/fstab\. Это можно сделать с помощью одной команды через sed (редактор потока) или вручную отредактировав файл /etc/fstab.

sudo sed -i '/ swap / s/^\(.*\)$/#\1/g' /etc/fstab

или

sudo nano /etc/fstab

Теперь отключите SWAP в текущем сеансе с помощью приведенной ниже команды. Затем убедитесь, что SWAP отключен с помощью команды \free -m\. Вы должны увидеть, что SWAP имеет значения «0», что означает, что теперь он отключен.

sudo swapoff -a
free -m

Установка среды выполнения контейнера: Containerd

Чтобы настроить кластер Kubernetes, необходимо установить среду выполнения контейнера на всех серверах, чтобы могли работать поды. Для развертываний Kubernetes можно использовать несколько сред выполнения контейнеров, таких как containerd, CRI-O, Mirantis Container Runtime и Docker Engine (через cri-dockerd).

В этом примере мы будем использовать «containerd» в качестве контейнера для нашего развертывания Kubernetes. Итак, вы установите containerd на все узлы Kubernetes. И есть несколько способов установить containerd, самый простой из них — использовать готовые бинарные пакеты, предоставленные репозиторием Docker.

Прежде чем добавить репозиторий, запустите приведенную ниже команду DNF, чтобы установить дополнительные инструменты \dnf-utils\.

sudo dnf install dnf-utils

Теперь выполните следующую команду, чтобы добавить репозиторий Docker для систем на базе CentOS.

sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

Выполните следующую команду, чтобы проверить репозитории в ваших системах Rocky Linux. Затем создайте новый кеш метаданных. Вы увидите, что репозиторий Docker добавлен в Rocky Linux.

sudo dnf repolist
sudo dnf makecache

Затем установите пакет containerd с помощью приведенной ниже команды DNF. Введите Y, чтобы подтвердить установку, и нажмите ENTER, и установка начнется. Когда вас попросят импортировать ключ Docker GPG, введите y, чтобы добавить.

sudo dnf install containerd.io

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

sudo mv /etc/containerd/config.toml /etc/containerd/config.toml.orig
sudo containerd config default > /etc/containerd/config.toml

Теперь измените файл конфигурации containerd \/etc/containerd/config.toml\, используя следующую команду.

sudo nano /etc/containerd/config.toml

Измените значение драйвера cgroup \SystemdCgroup=false\ на \SystemdCgroup=true\. Это включит драйвер systemd cgroup для среды выполнения контейнера containerd.

[plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc]
  ...
  [plugins."io.containerd.grpc.v1.cri".containerd.runtimes.runc.options]
    SystemdCgroup = true

Когда вы закончите, сохраните и закройте файл.

Затем выполните следующую команду systemctl, чтобы запустить и включить службу containerd. Это добавит службу containerd для автоматического запуска при загрузке системы.

sudo systemctl enable --now containerd

Наконец, проверьте и подтвердите службу containerd, используя приведенную ниже команду. Вы должны увидеть, что containerd включен и будет запускаться автоматически при загрузке системы. И текущий статус службы containerd работает.

sudo systemctl is-enabled containerd
sudo systemctl status containerd

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

Вы установили среду выполнения контейнера containerd. Теперь вы установите пакеты Kubernetes на все свои системы Rocky Linux. Сюда входят kubeadm для начальной загрузки кластера Kubernetes, kubelet — основной компонент кластера Kubernetes и kubectl — утилита командной строки для управления кластером Kubernetes.

В этом примере мы будем устанавливать пакеты Kubernetes, используя репозиторий, предоставленный Kubernetes. Итак, вы добавите репозиторий Kubernetes во все свои системы Rocky Linux.

Выполните следующую команду, чтобы добавить репозиторий Kubernetes для операционных систем на базе RHEL/CentOS.

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

Теперь проверьте список репозиториев и сгенерируйте новый кеш метаданных с помощью приведенной ниже команды dnf. И вы должны увидеть, что репозиторий Kubernetes добавлен в системы Rocky Linux.

sudo dnf repolist
sudo dnf makecache

Затем установите пакеты Kubernetes с помощью следующей команды dnf. Введите Y, чтобы подтвердить установку, и нажмите ENTER, чтобы продолжить, и установка начнется.

sudo dnf install kubelet kubeadm kubectl --disableexcludes=kubernetes

После завершения установки выполните следующую команду systemctl, чтобы запустить и включить службу kubelet. Затем проверьте службу kubelet и убедитесь, что она включена и работает на всех узлах.

Эта служба является основной службой Kubernetes, которая будет ожидать любых событий при инициализации кластера или присоединении узла к кластеру.

sudo systemctl enable --now kubelet

Установка плагина CNI: фланель

Kubernetes поддерживает различные подключаемые модули Container Network, такие как AWS VPC для Kubernetes, Azure CNI, Cilium, Calico, Flannel и многие другие. В этом примере мы будем использовать Flannel в качестве подключаемого модуля CNI для развертывания Kubernetes. А для этого вам нужно было установить бинарный файл Flannel на узлы Kubernetes.

Выполните приведенную ниже команду, чтобы создать новый каталог \/opt/bin\. Затем загрузите в него бинарный файл Flannel.

mkdir -p /opt/bin/
sudo curl -fsSLo /opt/bin/flanneld https://github.com/flannel-io/flannel/releases/download/v0.19.0/flanneld-amd64

Теперь сделайте двоичный файл flanneld исполняемым, изменив разрешение файла с помощью приведенной ниже команды. Этот двоичный файл flanneld будет выполняться автоматически, когда вы настраиваете сетевое дополнение Pod.

sudo chmod +x /opt/bin/flanneld

Инициализация плоскости управления Kubernetes

Вы выполнили все зависимости и требования для развертывания кластера Kubernetes. Теперь вы запустите кластер Kubernetes, впервые инициализировав узел Control Plane. В этом примере Kubernetes Control Plane будет установлен на сервере «kubem-master» с IP-адресом «192.168.5.10».

Перед инициализацией узла Control Plane выполните следующую команду, чтобы проверить, включены ли модули ядра \br_netfilter\. Если вы получаете вывод команды, это означает, что модуль \br_netfilter\ включен.

lsmod | grep br_netfilter

Затем выполните следующую команду, чтобы загрузить образы, необходимые для кластера Kubernetes. Эта команда загрузит все образы контейнеров, необходимые для создания кластера Kubernetes, такие как coredns, сервер kube-api и т. д., kube-controller, kube-proxy и образ контейнера pause.

sudo kubeadm config images pull

После завершения загрузки выполните следующую команду \kubeadm init\, чтобы инициализировать кластер Kubernetes на сервере \kube-master\. Этот узел «kube-master» будет автоматически выбран в качестве плоскости управления Kubernetes, потому что это первая инициализация кластера.

  • Кроме того, в этом примере мы указываем в качестве сети для модулей значение \10.244.0.0/16\, которое является диапазоном сети по умолчанию для подключаемого модуля Flannel CNI.
  • --apiserver-advertise-address\ определяет, на каком IP-адресе будет работать сервер API Kubernetes. В этом примере используется внутренний IP-адрес 192.168.5.10\.
  • Для параметра \--cri-socket\ здесь мы указываем сокет CRI для сокета среды выполнения контейнера, доступного в \/run/containerd/containerd.sock\. Если вы используете другую среду выполнения контейнера, вы должны изменить путь к файлу сокета или можете просто удалить эту опцию \--cri-socket\, потому что kubeadm автоматически обнаружит сокет среды выполнения контейнера.

sudo kubeadm init --pod-network-cidr=10.244.0.0/16 \
--apiserver-advertise-address=192.168.5.10 \
--cri-socket=unix:///run/containerd/containerd.sock

Когда инициализация завершена, вы можете увидеть сообщение, такое как «Ваша плоскость управления Kubernetes успешно инициализирована!» с некоторыми важными выходными сообщениями для настройки учетных данных Kubernetes и развертывания сетевой надстройки Pod, как добавить рабочий узел в свой кластер Kubernetes.

Прежде чем вы начнете использовать кластер Kubernetes, вам необходимо настроить учетные данные Kubernetes. Выполните следующую команду, чтобы настроить учетные данные Kubernetes.

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

Теперь вы можете использовать команду \kubectl\ для взаимодействия с вашим кластером Kubernetes. Выполните следующую команду \kubectl\, чтобы проверить информацию о кластере Kubernetes. И вы должны увидеть плоскость управления Kubernetes и работающие ядра.

kubectl cluster-info

Чтобы получить полную информацию о вашем Kubernetes, вы можете использовать опцию дампа — так что \kubectl cluster-info dump\.

После запуска плоскости управления Kubernetes выполните следующую команду, чтобы установить сетевой подключаемый модуль Flannel Pod. Эта команда автоматически запустит бинарный файл \flanneld\ и запустит некоторые фланелевые стручки.

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

Проверьте список запущенных модулей в Kubernetes с помощью следующей команды. если ваша установка Kubernetes прошла успешно, вы должны увидеть, что все основные модули для Kubernetes, включая модули Flannel, работают.

kubectl get pods --all-namespaces

Добавление рабочих узлов в Kubernetes

После инициализации плоскости управления Kubernetes на сервере «kube-master» вы добавите рабочие узлы «kube-worker1» и «kube-worker2» в кластер Kubernetes.

Перейдите на сервер \kube-worker1\ и выполните приведенную ниже команду \kubeadm join\, чтобы добавить \kube-worker1\ в кластер Kubernetes. У вас могут быть другие токен и ca-cert-hash, вы можете увидеть подробную информацию об этой информации в выходном сообщении при инициализации узла Control Plane.

kubeadm join 192.168.5.10:6443 --token wlg23u.r5x2nxw2vdu95dvp \
        --discovery-token-ca-cert-hash sha256:71fd28ac2b8108a3d493648a9c702acd2e39a8a0e7efc07326d7b0384c929066

В следующем выводе вы можете видеть, что сервер \kube-worker1\ присоединен к кластеру Kubernetes.

Затем перейдите на сервер \kube-worker2\ и запустите команду \kubeadm join\, чтобы добавить \kube-worker2\ в Kubernetes. Кластер.

kubeadm join 192.168.5.10:6443 --token wlg23u.r5x2nxw2vdu95dvp \
        --discovery-token-ca-cert-hash sha256:71fd28ac2b8108a3d493648a9c702acd2e39a8a0e7efc07326d7b0384c929066

Вы увидите такое же выходное сообщение, когда процесс завершится.

Теперь вернитесь к серверу плоскости управления kube-master\ и выполните следующую команду, чтобы проверить все запущенные модули для всех пространств имен в кластере Kubernetes. Вы должны увидеть дополнительные модули для каждого компонента Kubernetes.

kubectl get pods --all-namespaces

Наконец, проверьте и подтвердите все доступные узлы в кластере Kubernetes с помощью приведенной ниже команды kubectl. Вы должны увидеть, что сервер kube-master работает в качестве плоскости управления Kubernetes, а \kube-worker1\ и\серверы kube-worker2\» работают как рабочий узел.

kubectl get nodes -o wide

Заключение

В рамках этого руководства вы завершили развертывание кластера Kubernetes с тремя серверами Rocky Linux. Кластер Kubernetes работает с одной плоскостью управления и двумя рабочими узлами. Он работает с containerd в качестве среды выполнения контейнера для вашего кластера Kubernetes и с сетевым плагином Flannel для сетевого подключения модулей в вашем кластере. Вы полностью настроили кластер Kubernetes, вы можете начать развертывание своих приложений в кластере Kubernetes или попробовать установить панель управления Kubernetes, чтобы узнать больше о вашей среде Kubernetes.