Как запустить кластер 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 и применимо ко многим различным средам.