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

Как запустить кластер Kubernetes с нуля с помощью Kubeadm и Kubectl


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

В этой статье вы узнаете, как настроить простой кластер Kubernetes с использованием конфигурации по умолчанию. Это руководство «с нуля», которое должно работать на только что подготовленном хосте. Предполагается, что система основана на Debian, но вы можете настроить большинство команд в соответствии с менеджером пакетов вашей операционной системы. Эти шаги были протестированы с использованием Ubuntu 22.04 и Kubernetes v1.25.

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

Kubernetes требуется среда выполнения контейнеров, совместимая с CRI, для запуска и запуска ваших контейнеров. Стандартный дистрибутив Kubernetes не поставляется со средой выполнения, поэтому вам следует установить ее, прежде чем продолжить. containerd — самый популярный выбор. Это среда выполнения, включенная в современные выпуски Docker.

Вы можете установить containerd, используя репозиторий Docker Apt. Сначала добавьте некоторые зависимости, которые будут использоваться во время процедуры установки:

$ sudo apt update
$ sudo apt install -y \
   ca-certificates \
   curl \
   gnupg \
   lsb-release

Затем добавьте ключ GPG репозитория в каталог keyrings Apt:

$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

Теперь вы можете добавить правильный репозиторий для вашей системы, выполнив эту команду:

$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

Обновите список пакетов, включив в него содержимое репозитория Docker:

$ sudo apt update

Наконец, установите containerd:

$ sudo apt install -y containerd.io

Убедитесь, что служба containerd запущена:

$ sudo service containerd status
 containerd.service - containerd container runtime
     Loaded: loaded (/lib/systemd/system/containerd.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2022-09-13 16:50:12 BST; 6s ago

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

$ sudo containerd config default > /etc/containerd/config.toml

Это заполняет все доступные поля конфигурации и решает некоторые проблемы, такие как отключение поддержки CRI при новых установках.

Затем откройте /etc/containerd/config.toml и найдите следующую строку:

SystemdCgroup = false

Измените значение на true:

SystemdCgroup = true

Это изменение необходимо для полной поддержки управления cgroup systemd. Без этого параметра системные контейнеры Kubernetes будут периодически перезапускаться.

Перезапустите containerd, чтобы применить изменения:

$ sudo service containerd restart

Установка Kubeadm, Kubectl и Kubelet

Второй этап процесса — установка инструментов Kubernetes. Эти три утилиты предоставляют следующие возможности:

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

Три двоичных файла доступны в репозитории Apt, размещенном в Google Cloud. Сначала зарегистрируйте связку ключей GPG репозитория:

$ sudo curl -fsSLo /etc/apt/keyrings/kubernetes.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg

Затем добавьте репозиторий в свои источники…

$ echo "deb [signed-by=/etc/apt/keyrings/kubernetes.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list

…и обновите список пакетов:

$ sudo apt update

Теперь устанавливаем пакеты:

$ sudo apt install -y kubeadm kubectl kubelet

Лучше всего «удерживать» эти пакеты, чтобы Apt не обновлял их автоматически при запуске apt upgrade. Обновления кластера Kubernetes следует инициировать вручную, чтобы предотвратить простои и избежать нежелательных критических изменений.

$ sudo apt-mark hold kubeadm kubectl kubelet

Отключение свопа

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

Запустите эту команду, чтобы отключить своп:

$ sudo swapoff -a

Затем отредактируйте файл /etc/fstab и отключите любые монтирования подкачки:

UUID=ec6efe91-5d34-4c80-b59c-cafe89cc6cb2 /               ext4    errors=remount-ro 0       1
/swapfile                                 none            swap    sw              0       0

Этот файл показывает монтирование с типом swap в качестве последней строки. Его следует удалить или закомментировать, чтобы своп оставался отключенным после перезагрузки системы.

Загрузка модуля br_netfilter

Модуль ядра br_netfilter необходим для того, чтобы iptables мог видеть трафик через мост. Kubeadm не позволит вам создать свой кластер, если этот модуль отсутствует.

Вы можете включить его с помощью следующей команды:

$ sudo modprobe br_netfilter

Сделайте так, чтобы он сохранялся после перезагрузки, включив его в список модулей вашей системы:

$ echo br_netfilter | sudo tee /etc/modules-load.d/kubernetes.conf

Создание вашего кластера

Вы готовы создать свой кластер Kubernetes. Запустите kubeadm init на машине, на которой вы хотите разместить свою плоскость управления:

$ sudo kubeadm init --pod-network-cidr=10.244.0.0/16

Флаг --pod-network-cidr включен, чтобы правильное распределение CIDR было доступно для сетевого дополнения Pod, которое будет установлено позже. Значение по умолчанию 10.244.0.0/16 работает в большинстве случаев, но вам может потребоваться изменить диапазон, если вы используете сильно настроенную сетевую среду.

Создание кластера может занять несколько минут. Информация о ходе выполнения будет отображаться в вашем терминале. Вы должны увидеть это сообщение в случае успеха:

Your Kubernetes control-plane has initialized successfully!

Выходные данные также включают информацию о том, как начать использовать ваш кластер.

Подготовка файла Kubeconfig

Начните с копирования автоматически сгенерированного файла Kubeconfig в свой собственный каталог .kube/config. Настройте владельца файла на себя, чтобы 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

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

Бязь и фланель — два самых популярных варианта. В этом руководстве используется Flannel из-за простоты установки.

Используйте Kubectl, чтобы добавить Flannel в свой кластер:

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

Подождите несколько секунд, а затем запустите kubectl get nodes в своем терминале. Вы должны увидеть, что ваш узел отображается как Ready, и вы можете начать взаимодействовать с вашим кластером.

$ kubectl get nodes
NAME       STATUS   ROLES           AGE     VERSION
ubuntu22   Ready    control-plane   7m19s   v1.25.0

Если вы запустите kubectl get pods --all-namespaces, вы увидите, что все компоненты плоскости управления, CoreDNS и Flannel запущены и работают:

$ kubectl get pods --all-namespaces
NAMESPACE      NAME                               READY   STATUS    RESTARTS        AGE
kube-flannel   kube-flannel-ds-xlrk6              1/1     Running   5 (16s ago)     11m
kube-system    coredns-565d847f94-bzzkf           1/1     Running   5 (2m9s ago)    14m
kube-system    coredns-565d847f94-njrdc           1/1     Running   4 (30s ago)     14m
kube-system    etcd-ubuntu22                      1/1     Running   6 (113s ago)    13m
kube-system    kube-apiserver-ubuntu22            1/1     Running   5 (30s ago)     16m
kube-system    kube-controller-manager-ubuntu22   1/1     Running   7 (3m59s ago)   13m
kube-system    kube-proxy-r9g9k                   1/1     Running   8 (21s ago)     14m
kube-system    kube-scheduler-ubuntu22            1/1     Running   7 (30s ago)     15m

Взаимодействие с вашим кластером

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

$ kubectl taint node ubuntu22 node-role.kubernetes.io/control-plane:NoSchedule-
node/ubuntu22 untainted

Замените ubuntu22 в приведенной выше команде именем, назначенным вашему собственному узлу.

Теперь попробуйте запустить простой модуль NGINX:

$ kubectl run nginx --image nginx:latest
pod/nginx created

Предоставьте его с помощью службы NodePort:

$ kubectl expose pod/nginx --port 80 --type NodePort
service/nginx exposed

Найдите хост-порт, который был выделен службе:

$ kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        18m
nginx        NodePort    10.106.44.155   <none>        80:30647/TCP   27s

Порт — 30647. HTTP-запросы к этой конечной точке теперь должны выдавать в ответ целевую страницу NGINX по умолчанию:

$ curl http://localhost:30647
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

Ваш кластер Kubernetes работает!

Добавление другого узла

Чтобы настроить дополнительные рабочие узлы, сначала повторите все шаги в разделах до «Создание кластера» на каждой машине, которую вы хотите использовать. На каждом узле должны быть установлены containerd, Kubeadm и Kubelet. Вы также должны убедиться, что ваш узел имеет полное сетевое подключение к машине, на которой запущена ваша плоскость управления.

Затем выполните следующую команду на новом рабочем узле:

kubeadm join 192.168.122.229:6443 \
    --node-name node-b \
    --token <token> \
    --discovery-token-ca-cert-hash sha256:<token-ca-cert-hash>

Замените IP-адрес на адрес вашего узла плоскости управления. Значения <token> и будут отображаться при запуске kubeadm init для создания элемента управления. самолет. Вы можете получить их, выполнив следующие действия.

Токен

Запустите список токенов kubeadm на узле плоскости управления. Значение токена будет показано в столбце TOKEN.

$ kubeadm token list
TOKEN                     TTL         EXPIRES                USAGES                   DESCRIPTION                                                EXTRA GROUPS
lkoz6v.cw1e01ckz2yqvw4u   23h         2022-09-14T19:35:03Z   authentication,signing

Хэш сертификата ЦС токена

Запустите эту команду и используйте ее вывод в качестве значения:

$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \
   openssl dgst -sha256 -hex | sed 's/^.* //'

Присоединение к кластеру

Команда kubeadm join в случае успеха должна выдать следующие выходные данные:

$ kubeadm join 192.168.122.229:6443 \
    --node-name node-b \
    --token <token> \
    --discovery-token-ca-cert-hash sha256:<token-ca-cert-hash>
[kubelet-start] Starting the kubelet[kubelet-start] Waiting for the kubelet to perform the TLS Bootstrap...

This node has joined the cluster:
* Certificate signing request was sent to apiserver and a response was received.
* The Kubelet was informed of the new secure connection details.

Run 'kubectl get nodes' on the control-plane to see this node join the cluster.

Убедитесь, что узел присоединился к кластеру и готов принимать поды, выполнив команду kubectl get nodes:

$ kubectl get nodes
NAME       STATUS   ROLES           AGE    VERSION
node-b     Ready    <none>          91s    v1.25.0
ubuntu22   Ready    control-plane   100m   v1.25.0

Узел отображается в списке и имеет статус Ready. Это означает, что он работает, и Kubernetes может планировать для него поды.

Краткое содержание

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

Большинство проблем возникает из-за того, что нет доступной среды выполнения контейнера, отсутствует модуль ядра br_netfilter, включена подкачка или упущена необходимость предоставления сетевого дополнения Pod. Устранение неполадок следует начинать с проверки этих распространенных ошибок.

Kubeadm предоставляет вам последнюю версию Kubernetes прямо из самого проекта. Доступны альтернативные дистрибутивы, позволяющие запускать одноузловой кластер с помощью одной команды. Minikube, MicroK8s и K3s — три популярных варианта. Хотя их обычно проще настроить и обновить, все они имеют небольшие отличия от вышестоящего Kubernetes. Использование Kubeadm приближает вас к внутренней работе Kubernetes и применимо ко многим различным средам.