Введение
Kubernetes — это инструмент с открытым исходным кодом, который имеет решающее значение для оркестрации контейнеров. Kubernetes работает путем оркестрации и управления масштабируемыми кластерами в различных облачных средах или даже на локальных серверах. Кластер — это набор хостов, предназначенных для запуска контейнеризированных приложений и служб. Для работы кластера требуется как минимум два узла – один master узел и worker узел. С учетом масштабируемости у вас есть возможность расширять кластер, добавляя столько рабочих узлов, сколько требуется.
Узел в Kubernetes означает сервер. Master-узел — это сервер, который управляет состоянием кластера. Worker-узлы — это серверы, на которых выполняются рабочие нагрузки – обычно это контейнеризированные приложения и службы.
Это руководство проведет вас по шагам установки и развертывания кластера Kubernetes, состоящего из двух узлов, на Ubuntu 20.04. Как уже упоминалось, наличие двух узлов — это самая базовая конфигурация при работе с Kubernetes. У вас также есть возможность добавить больше рабочих узлов, как только вы освоите основы. Далее мы покажем вам, как связать два сервера, чтобы master-узел мог управлять worker-узлом.
Чтобы протестировать нашу конфигурацию, мы развернем Docker контейнер, в котором запущен веб-сервер Nginx в кластере. Это типичное реальное применение Kubernetes. Вы узнаете больше о некоторых определяющих компонентах Kubernetes, таких как kubectl и kubeadm, по мере продвижения. Также рекомендуется сначала ознакомиться с нашим руководством по знакомству с основами инструментария Kubernetes, чтобы ознакомиться с основами платформы Kubernetes.
Итак, начнем!
Предварительные требования
Вам понадобится подготовить два сервера, работающих на Ubuntu 20.04. Для наилучшей производительности минимальные системные требования для Kubernetes составляют 2 ГБ оперативной памяти и 2 процессора. Вы можете выполнить шаги с 1 по 4 этого пошагового руководства, которое поможет вам настроить сервер Ubuntu на CloudSigma. Один сервер будет master-узлом, другой — worker-узлом. Мы удачно назвали наши два сервера kubernetes-master и kubernetes-worker. Это облегчает прохождение руководства. Тем не менее, вы можете выбрать любые имена хостов, какие предпочтете.
-
Обязательно добавьте пользователя с привилегиями sudo на обоих узлах, которого мы будем использовать для запуска команд, как описано в руководстве выше. Следуйте этому руководству по настройке файла sudoers in Linux для получения инструкций.
-
Сетевое подключение – серверы в кластере должны иметь возможность взаимодействовать друг с другом. Когда вы развертываете свои виртуальные машины из CloudSigma, они будут подключены к интернету с публичным IP-адресом по умолчанию. Если вы работаете в локальной сети, вам, возможно, придется отредактировать файл /etc/hosts на каждом сервере и связать их соответствующим образом.
-
Вам нужно будет установить и включить Docker на каждом из узлов. Kubernetes полагается на среду выполнения контейнеров для запуска контейнеров в подах. Хотя существуют и другие контейнерные платформы на выбор, в этом руководстве мы будем использовать Docker. Docker предоставит среду выполнения, необходимую для Ubuntu. Вы можете выполнить шаги 1, 2 и 3 нашего руководства по установке и эксплуатации Docker.
Шаг 1. Установка Kubernetes
На этом шаге мы установим Kubernetes. Как и в случае с Docker в разделе предварительных требований, вы должны запустить команды на обоих узлах для установки Kubernetes. Используйте ssh для входа на оба узла и продолжения. Вы начнете с установки пакета apt-transport-https, который позволяет работать с http и https в репозиториях Ubuntu. Также установите curl, так как он понадобится для следующих шагов. Выполните следующую команду:
|
1 |
sudo apt install apt-transport-https curl |
Затем добавьте Kubernetes подписывающий ключ на оба узла, выполнив команду:
|
1 |
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add |
Затем мы добавим Kubernetes репозиторий в качестве источника пакетов на обоих узлах с помощью следующей команды:
|
1 2 |
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" >> ~/kubernetes.list sudo mv ~/kubernetes.list /etc/apt/sources.list.d |
После этого обновите узлы:
|
1 |
sudo apt update |
- Установка инструментов Kubernetes
После завершения обновления мы установим Kubernetes. Это включает в себя установку различных инструментов, из которых состоит Kubernetes: kubeadm, kubelet, kubectl, и kubernetes-cni. Эти инструменты устанавливаются на обоих узлах. Ниже мы даем определение каждому инструменту:
-
kubelet – агент, который запускается на каждом узле и отвечает за связь с главным узлом для запуска рабочих нагрузок в среде выполнения контейнеров. Введите следующую команду для установки kubelet:
|
1 |
sudo apt install kubelet |
-
kubeadm – часть проекта Kubernetes, которая помогает инициализировать кластер Kubernetes. Введите следующую команду для установки kubeadm:
|
1 |
sudo apt install kubeadm |
-
kubectl – инструмент командной строки Kubernetes, который позволяет выполнять команды внутри кластеров Kubernetes. Выполните следующую команду для установки kubectl:
|
1 |
sudo apt install kubectl |
-
kubernetes-cni – обеспечивает сетевое взаимодействие внутри контейнеров, гарантируя, что контейнеры могут общаться и обмениваться данными. Выполните следующую команду для установки:
|
1 |
sudo apt-get install -y kubernetes-cni |
При желании вы можете установить все четыре инструмента одной командой:
|
1 |
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni |
Шаг 2: Отключение памяти swap
Kubernetes не может работать в системе, использующей swap память. Следовательно, ее необходимо отключить на главном узле и на всех рабочих узлах. Выполните следующую команду, чтобы отключить память swap:
|
1 |
sudo swapoff -a |
Эта команда отключает память swap до перезагрузки системы. Мы должны убедиться, что она остается отключенной и после перезагрузки. Это необходимо сделать на главном и на всех рабочих узлах. Мы можем сделать это, отредактировав fstab файл и закомментировав строку /swapfile с помощью #. Откройте файл в текстовом редакторе nano, введя следующую команду:
|
1 |
sudo nano /etc/fstab |
Внутри файла закомментируйте строку swapfile , как показано на скриншоте ниже:

Если вы не видите строку swapfile, просто проигнорируйте это. Сохраните и закройте файл после завершения редактирования. Выполните тот же процесс для обоих узлов. Теперь настройки памяти swap останутся отключенными даже после перезагрузки вашего сервера.
Шаг 3: Установка уникальных имен хостов
Ваши узлы должны иметь уникальные имена хостов для более простой идентификации. Если вы развертываете кластер со множеством узлов, вы можете задать идентифицирующие имена для ваших рабочих узлов, такие как node-1, node-2 и т. д. Как мы уже упоминали ранее, мы назвали наши узлы kubernetes-master и kubernetes-worker. Мы установили их во время создания сервера. Однако вы можете настроить или установить свои, если вы еще этого не сделали из командной строки. Чтобы изменить имя хоста на главном узле, выполните следующую команду:
|
1 |
sudo hostnamectl set-hostname kubernetes-master |
На рабочем узле выполните следующую команду:
|
1 |
sudo hostnamectl set-hostname kubernetes-worker |
Вы можете закрыть текущую сессию терминала и ssh снова подключиться к серверу, чтобы увидеть изменения.
Шаг 4: Настройка видимости мостового трафика для Iptables
Чтобы главный и рабочие узлы правильно видели мостовой трафик, вам необходимо убедиться, что параметр net.bridge.bridge-nf-call-iptables установлен в значение 1 в вашей конфигурации. Сначала убедитесь, что модуль br_netfilter загружен. Вы можете подтвердить это, выполнив команду:
|
1 |
lsmod | grep br_netfilter |
При желании вы можете явно загрузить его с помощью команды:
|
1 |
sudo modprobe br_netfilter |
Теперь вы можете запустить эту команду, чтобы установить значение в 1:
|
1 |
sudo sysctl net.bridge.bridge-nf-call-iptables=1 |
Шаг 5: Изменение драйвера cgroup в Docker
По умолчанию Docker устанавливается с “cgroupfs” в качестве драйвера cgroup. Kubernetes рекомендует , чтобы Docker работал с “systemd” в качестве драйвера. Если вы пропустите этот шаг и попытаетесь инициализировать kubeadm на следующем шаге, вы получите следующее предупреждение в терминале:
|
1 2 |
[preflight] Running pre-flight checks [WARNING IsDockerSystemdCheck]: detected "cgroupfs" as the Docker cgroup driver. The recommended driver is "systemd". Please follow the guide at https://kubernetes.io/docs/setup/cri/ |
На главном и рабочих узлах обновите cgroupdriver с помощью следующих команд:
|
1 2 3 4 5 6 7 8 9 |
sudo mkdir /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "storage-driver": "overlay2" } EOF |
Затем выполните следующие команды, чтобы перезапустить и включить Docker при загрузке системы:
|
1 2 3 |
sudo systemctl enable docker sudo systemctl daemon-reload sudo systemctl restart docker |
Как только это будет настроено, мы сможем перейти к самому интересному — развертыванию кластера Kubernetes!
Шаг 6: Инициализация главного узла Kubernetes
Первым шагом при развертывании кластера Kubernetes является запуск главного узла. Находясь в терминале вашего главного узла, выполните следующую команду для инициализации kubernetes-master:
|
1 |
sudo kubeadm init --pod-network-cidr=10.244.0.0/16 |
Если вы выполните указанную выше команду, а ваша система не будет соответствовать ожидаемым требованиям, таким как минимальный объем оперативной памяти или процессора, как описано в разделе «Предварительные требования», вы получите предупреждение, и кластер не запустится:

На скриншоте ниже видно, что инициализация прошла успешно. Мы также добавили флаг для указания сети подов с IP-адресом 10.244.0.0. Это IP-адрес по умолчанию, который использует kube-flannel. Более подробно мы обсудим сеть подов на следующем шаге.

В выводе вы можете увидеть kubeadm join команду (мы скрыли наш IP-адрес) и уникальный токен, который вам нужно будет запустить на рабочем узле и всех остальных рабочих узлах, которые вы хотите присоединить к этому кластеру. Скопируйте и вставьте эту команду, так как она понадобится вам позже на рабочем узле.
В выводе Kubernetes также отображает некоторые дополнительные команды, которые вам следует запустить от имени обычного пользователя на главном узле перед началом использования кластера. Давайте запустим эти команды:
|
1 2 3 |
mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config |
Теперь мы инициализировали главный узел. Однако нам также необходимо настроить сеть подов на главном узле перед присоединением рабочих узлов.
Шаг 7: Развертывание сети подов
Сеть подов облегчает связь между серверами, и она необходима для правильного функционирования кластера Kubernetes. Вы можете узнать больше о сетевом взаимодействии в кластере Kubernetes из официальной документации. В этом руководстве мы будем использовать сеть подов Flannel для этого руководства. Flannel — это простая оверлейная сеть, которая удовлетворяет требованиям Kubernetes.
Перед развертыванием сети подов нам необходимо проверить статус брандмауэра. Если вы включили брандмауэр после выполнения шага 5 руководства по настройке сервера Ubuntu, сначала необходимо добавить правило брандмауэра, чтобы создать исключения для порта 6443 (порт по умолчанию для Kubernetes). Выполните следующие команды ufw на управляющем и рабочих узлах:
|
1 2 |
sudo ufw allow 6443 sudo ufw allow 6443/tcp |
После этого вы можете выполнить следующие две команды для развертывания сети подов на управляющем узле:
|
1 2 |
kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/k8s-manifests/kube-flannel-rbac.yml |
Загрузка сети flannel может занять от нескольких секунд до минуты в зависимости от вашего окружения. Выполните следующую команду, чтобы убедиться, что все запущено:
|
1 |
kubectl get pods --all-namespaces |
В случае успешного выполнения в выводе команды статус всех служб должен быть указан как running:

Вы также можете просмотреть состояние компонентов с помощью команды get component status:
|
1 |
kubectl get componentstatus |

Эта команда имеет краткую форму cs:
|
1 |
kubectl get cs |

Если вы видите статус unhealthy, отредактируйте следующие файлы и удалите строку в (spec->containers->command), содержащую эту фразу - --port=0 :
|
1 |
sudo nano /etc/kubernetes/manifests/kube-scheduler.yaml |
Сделайте то же самое для этого файла:
|
1 |
sudo nano /etc/kubernetes/manifests/kube-controller-manager.yaml |
Наконец, перезапустите службу Kubernetes:
|
1 |
sudo systemctl restart kubelet.service |
Шаг 8. Присоединение рабочих узлов к кластеру Kubernetes
После того как kubernetes-master запущен и сеть подов готова, мы можем присоединить наши рабочие узлы к кластеру. В этом руководстве у нас есть только один рабочий узел, поэтому мы будем работать с ним. Если у вас больше рабочих узлов, вы всегда можете выполнить те же шаги, которые мы опишем ниже, чтобы присоединить их к кластеру.
Сначала войдите на свой рабочий узел в отдельной сессии терминала. Вы будете использовать команду kubeadm join, которая была показана в вашем терминале при инициализации управляющего узла на Шаге 6. Выполните команду:
|
1 |
sudo kubeadm join 127.0.0.188:6443 --token u81y02.91gqwkxx6rnhnnly --discovery-token-ca-cert-hash sha256:4482ab1c66bf17992ea02c1ba580f4af9f3ad4cc37b24f189db34d6e3fe95c2d |
После завершения присоединения к кластеру вы должны увидеть вывод, аналогичный скриншоту ниже:

После завершения процесса присоединения переключитесь на терминал управляющего узла и выполните следующую команду, чтобы подтвердить, что ваш рабочий узел присоединился к кластеру:
|
1 |
kubectl get nodes |
На скриншоте вывода команды выше видно, что рабочий узел присоединился к кластеру:

Шаг 9. Развертывание приложения в кластере Kubernetes
К этому моменту вы успешно настроили кластер Kubernetes. Давайте сделаем кластер полезным, развернув в нем службу. Nginx — популярный веб-сервер, обладающий невероятной скоростью работы даже при тысячах подключений. Мы развернем веб-сервер Nginx в кластере, чтобы доказать, что вы можете использовать эту конфигурацию в реальном приложении.
Выполните следующую команду на управляющем узле, чтобы создать развертывание Kubernetes для Nginx:
|
1 |
kubectl create deployment nginx --image=nginx |
Вы можете просмотреть созданное развертывание с помощью команды describe deployment:
|
1 |
kubectl describe deployment nginx |

Чтобы сделать nginx сервис доступным через интернет, выполните следующую команду:
|
1 |
kubectl create service nodeport nginx --tcp=80:80 |

Команда выше создаст публичный сервис для развертывания Nginx. Поскольку это nodeport развертывание, Kubernetes назначает сервису порт из диапазона 32000+.
Вы можете получить текущие сервисы, выполнив команду:
|
1 |
kubectl get svc |

Вы можете видеть, что наш назначенный порт — 32264. Обратите внимание на порт, отображаемый в вашем терминале, чтобы использовать его на следующем шаге.
Чтобы убедиться, что развертывание сервиса Nginx прошло успешно, выполните curl запрос к рабочей ноде с мастер-ноды. Замените IP-адрес вашей рабочей ноды и порт, полученный из команды выше:
|
1 |
curl your-kubernetes-worker-ip:32264 |
Вы должны увидеть вывод стандартной страницы Nginx index.html:

При желании вы можете открыть IP-адрес рабочей ноды и порт в браузере, чтобы просмотреть стандартную индексную страницу Nginx:

Вы можете удалить развертывание, указав его имя. Например, эта команда удалит наше развертывание:
|
1 |
kubectl delete deployment nginx |
Теперь мы успешно протестировали наш кластер!
Заключение
В этом руководстве вы узнали, как установить кластер Kubernetes на Ubuntu 20.04. Вы настроили кластер, состоящий из мастер-ноды и рабочей ноды. Вы смогли установить набор инструментов Kubernetes, создали сеть подов и присоединили рабочую ноду к мастер-ноде. Мы также протестировали нашу концепцию, выполнив базовое развертывание веб-сервера Nginx в кластере. Это должно послужить основой для работы с кластерами Kubernetes на Ubuntu.
Хотя мы использовали только одну рабочую ноду, вы можете расширить свой кластер любым количеством нод. Если вы хотите глубже погрузиться в DevOps с помощью таких инструментов автоматизации, как Ansible, у нас есть руководство, посвященное развертыванию кластеров Kubernetes с помощью Ansible и Kubeadm, ознакомьтесь с ним. Если вы хотите узнать, как развернуть PHP-приложение в кластере Kubernetes, изучите это руководство.
Приятной работы!
Комментарии
Комментариев пока нет. Будьте первым.