Как настроить кластер Kubernetes с Kubeadm в Ubuntu 22.04
На этой странице
- Предпосылки
- Настройка систем
- Настройка файла /etc/hosts
- Настройка брандмауэра UFW
- Включить модули ядра и отключить SWAP
- Установка среды выполнения контейнера: Containerd
- Установка пакета Kubernetes
- Установка подключаемого модуля CNI (контейнерного сетевого интерфейса): Flannel
- Инициализация плоскости управления Kubernetes
- Добавление рабочих узлов в Kubernetes
- Заключение
Kubernetes или k8s — это платформа с открытым исходным кодом для оркестрации контейнеров, которая автоматизирует развертывание, управление и масштабирование контейнерных приложений. Kubernetes — это оркестровка контейнеров, созданная Google, которая теперь стала проектом с открытым исходным кодом и стандартом для современных платформ развертывания приложений и вычислений.
Kubernetes — это решение для современной эпохи развертывания контейнеров. Он обеспечивает обнаружение служб и балансировку нагрузки, оркестрацию хранилища, автоматическое развертывание и откат, службу самовосстановления, управление секретами и конфигурацией. Kubernetes обеспечивает экономичную облачную разработку.
В этом руководстве вы настроите кластер Kubernetes, выполнив следующие действия:
- Настройка систем, в том числе настройка файла /etc/hosts, включение модулей ядра и отключение SWAP.
- Настройка брандмауэра UFW путем добавления некоторых портов, необходимых для Kubernetes.
- Установка containerd в качестве среды выполнения контейнера для Kubernetes.
- Установка пакетов Kubernetes, таких как kubelet, kubeadm и kubectl.
- Установка сетевого подключаемого модуля Flannel для модулей Kubernetes.
- Инициализация одного узла плоскости управления и добавление двух рабочих узлов.
Предпосылки
Для выполнения этого руководства вам потребуются следующие требования:
- Три или более серверов Ubuntu 22.04.
- Пользователь без полномочий root с правами root/администратора.
Настройка систем
Прежде чем вы начнете устанавливать какие-либо пакеты для развертывания Kubernetes, вам необходимо настроить все свои системы в соответствии с требованиями для развертывания Kubernetes. Сюда входят следующие конфигурации:
- Настройте правильный файл /etc/hosts: каждое имя хоста сервера должно быть преобразовано в правильный IP-адрес. Это можно сделать несколькими способами, но самый простой и удобный — использовать файл /etc/hosts на всех серверах.
- Настройка брандмауэра UFW. В производственной среде всегда рекомендуется включать брандмауэр как на уровне управления, так и на рабочих узлах.
- Включить модули ядра. Kubernetes требовал включения некоторых модулей ядра в системе Linux. Модуль ядра \overlay\ и \br_netfilter\ требуется, чтобы позволить iptables видеть трафик моста.
- Отключить SWAP: это обязательно, вы должны отключить SWAP на всех узлах Kubernetes, как на уровне управления, так и на рабочих узлах. В противном случае служба kubelet будет работать с проблемами.
Настройка файла /etc/hosts
На этом первом шаге вы настроите системное имя хоста и файл /etc/hosts на всех ваших серверах. Для этой демонстрации мы будем использовать следующие серверы.
Hostname IP Address Used as
--------------------------------------------
cplane1 192.168.5.10 control-plane
worker1 192.168.5.25 worker node
worker2 192.168.5.26 worker node
Запустите следующую команду hostnamectl ниже, чтобы настроить системное имя хоста на каждом сервере.
Для узла плоскости управления выполните следующую команду, чтобы установить системное имя хоста \cplane1\.
sudo hostnamectl set-hostname cplane1
Для рабочих узлов Kubernetes выполните следующую команду hostnamectl.
# setup hostname worker1
sudo hostnamectl set-hostname worker1
# setup hostname worker2
sudo hostnamectl set-hostname worker2
Затем измените файл /etc/hosts на всех серверах с помощью следующей команды.
sudo nano /etc/hosts
Добавьте следующую конфигурацию в файл. Убедитесь, что каждое имя хоста указывает на правильный IP-адрес.
192.168.5.10 cplane1
192.168.5.25 worker1
192.168.5.26 worker2
Сохраните и закройте файл, когда закончите.
Наконец, если вы запустите команду ping для каждого имени хоста, вам будет указан правильный IP-адрес, указанный в файле /etc/hosts.
ping cplane1 -c3
ping worker1 -c3
ping worker2 -c3
Настройка брандмауэра UFW
Kubernetes требует, чтобы некоторые порты были открыты во всех ваших системах. В системе Ubuntu по умолчанию в качестве брандмауэра по умолчанию используется брандмауэр UFW. Вы добавите несколько портов в брандмауэр UFW для развертывания 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
Перед добавлением правил UFW обязательно добавьте приложение OpenSSH в свой брандмауэр с помощью приведенной ниже команды. Затем включите брандмауэр UFW. При запросе подтверждения введите \y\, чтобы включить и запустить брандмауэр UFW.
sudo ufw allow "OpenSSH"
sudo ufw enable
На узле плоскости управления \cplane1\ выполните следующую команду ufw, чтобы открыть порты.
sudo ufw allow 6443/tcp
sudo ufw allow 2379:2380/tcp
sudo ufw allow 10250/tcp
sudo ufw allow 10259/tcp
sudo ufw allow 10257/tcp
sudo ufw status
На рабочих узлах \worker1\ и \worker2\ выполните следующую команду ufw, чтобы открыть некоторые порты.
sudo ufw allow 10250/tcp
sudo ufw allow 30000:32767/tcp
sudo ufw status
Включить модули ядра и отключить SWAP
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 на все серверы, панель управления и рабочие узлы.
Есть несколько способов установить containerd, самый простой из них — использовать готовые бинарные пакеты, предоставленные репозиторием Docker.
Теперь выполните следующую команду, чтобы добавить репозиторий Docker и ключ GPG.
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Обновите и обновите индекс пакета в вашей системе Ubuntu, используя приведенную ниже команду.
sudo apt update
Теперь установите пакет containerd с помощью приведенной ниже команды apt. И начнется установка.
sudo apt install containerd.io
После завершения установки выполните следующую команду, чтобы остановить службу containerd.
sudo systemctl stop 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.
sudo systemctl start containerd
Наконец, проверьте и подтвердите службу containerd, используя приведенную ниже команду. Вы должны увидеть, что containerd включен и будет запускаться автоматически при загрузке системы. И текущий статус службы containerd работает.
sudo systemctl is-enabled containerd
sudo systemctl status containerd
Установка пакета Kubernetes
Вы установили среду выполнения контейнера containerd. Теперь вы установите пакеты Kubernetes на все свои системы Ubuntu. Сюда входят kubeadm для начальной загрузки кластера Kubernetes, kubelet — основной компонент кластера Kubernetes и kubectl — утилита командной строки для управления кластером Kubernetes.
В этом примере мы будем устанавливать пакеты Kubernetes, используя репозиторий, предоставленный Kubernetes. Итак, вы добавите репозиторий Kubernetes во все свои системы Ubuntu.
Запустите следующую команду apt, чтобы установить некоторые зависимости пакета.
sudo apt install apt-transport-https ca-certificates curl -y
Теперь добавьте репозиторий Kubernetes и ключ GPG, используя следующую команду.
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
Обновите и обновите репозиторий Ubuntu и индекс пакетов.
sudo apt update
Когда обновление будет завершено, установите пакеты Kubernetes с помощью следующей команды apt. Введите Y, чтобы подтвердить установку, и нажмите ENTER, чтобы продолжить, и установка начнется.
sudo apt install kubelet kubeadm kubectl
После завершения установки выполните следующую команду, чтобы закрепить текущую версию пакетов Kubernetes. Это предотвратит автоматическое обновление пакетов Kubernetes и предотвратит перекос версий между пакетами Kubernetes.
sudo apt-mark hold kubelet kubeadm kubectl
Установка подключаемого модуля CNI (контейнерный сетевой интерфейс): Flannel
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 будет установлена на сервере \cplane1\ с 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 на сервере \cplane1\. Этот узел \cplane1\ будет автоматически выбран в качестве плоскости управления 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 на сервере \cplane1\.
Когда инициализация завершена, вы можете увидеть сообщение, такое как «Ваша плоскость управления 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 запущены.
kubectl get pods --all-namespaces
Добавление рабочих узлов в Kubernetes
После инициализации плоскости управления Kubernetes на сервере cplane1 вы добавите рабочие узлы worker1 и worker2 в кластер Kubernetes.
Перейдите на сервер «worker1» и выполните приведенную ниже команду «kubeadm join», чтобы добавить «worker1» в кластер Kubernetes. У вас могут быть другие токен и ca-cert-hash, вы можете увидеть подробную информацию об этой информации в выходном сообщении при инициализации узла Control Plane.
kubeadm join 192.168.5.10:6443 --token po3sb1.oux4z76nwb0veuna \
--discovery-token-ca-cert-hash sha256:f5068150fabaf85f3d04e19a395c60d19298ba441e2d9391e20df3267ea6cd28
В следующем выводе видно, что к серверу worker1 присоединяется кластер Kubernetes.
Затем перейдите на сервер «worker2» и запустите команду «kubeadm join», чтобы добавить «worker2» в кластер Kubernetes.
kubeadm join 192.168.5.10:6443 --token po3sb1.oux4z76nwb0veuna \
--discovery-token-ca-cert-hash sha256:f5068150fabaf85f3d04e19a395c60d19298ba441e2d9391e20df3267ea6cd28
Вы увидите такое же выходное сообщение, когда процесс завершится.
Теперь вернитесь к серверу Control Plane cplane1\ и выполните следующую команду, чтобы проверить все запущенные модули в кластере Kubernetes. Вы должны увидеть дополнительные модули на каждом компоненте Kubernetes.
kubectl get pods --all-namespaces
Наконец, проверьте и подтвердите все доступные узлы в кластере Kubernetes с помощью приведенной ниже команды kubectl\. Вы должны увидеть, что сервер cplane1\ работает в качестве плоскости управления Kubernetes, а сервер \worker1\ и серверы worker2 работают как рабочий узел.
kubectl get nodes -o wide
Заключение
В рамках этого руководства вы завершили развертывание кластера Kubernetes с тремя узлами серверов Ubuntu 22.04. Кластер Kubernetes работает с одной плоскостью управления и двумя рабочими узлами. Он работает с containerd в качестве среды выполнения контейнера для вашего кластера Kubernetes и с сетевым плагином Flannel для сетевого подключения модулей в вашем кластере. Вы полностью настроили кластер Kubernetes, вы можете начать развертывание своих приложений в кластере Kubernetes или попробовать установить панель управления Kubernetes, чтобы узнать больше о вашей среде Kubernetes.