Начинающие инженеры DevOps довольно быстро сталкиваются с необходимостью развернуть кластер Kubernetes, который обычно используется для управления и запуска контейнеров Docker. Рассмотрим надежный способ развертывания кластера Kubernetes в облаке на ОС Ubuntu, а затем кратко опишем другие возможные варианты.
Для начала немного важной терминологии. Под кластером мы понимаем объединение ресурсов, находящееся под управлением Kubernetes. В состав кластера входит как минимум один мастер-узел, он же master node, и как минимум один рабочий, он же worker node. Узлы в руководствах нередко называются нодами. На нодах производится запуск контейнеров, Kube же обеспечивает возможности для отслеживания состояния нод, а также позволяет автоматически управлять и масштабировать кластер. Проще всего развернуть кластер Kubernetes следующим способом.
Для развертывания нам потребуются внешние IP для каждой ноды, при этом каждый узел нужно будет обеспечить 2 ГБ RAM и 2 ядрами CPU. Для Ubuntu желательно увеличить объем RAM до 4 ГБ, а также предусмотреть 30-35 ГБ дискового пространства. Такой конфигурации хватит для старта, но учтите, что при увеличении числа работающих контейнеров может потребоваться резервирование новых виртуальных мощностей. Это нетрудно сделать «на лету» через панель управления Timeweb Cloud.
Далее будем предполагать, что ОС у вас уже установлена и есть два сервера (ноды), один из которых будет использоваться в качестве главного, master, а другой — рабочего, worker.
Для каждой ноды понадобится сгенерировать SSH-ключи, чтобы вы могли управлять кластером удаленно. Это делается при помощи следующей инструкции:
ssh-keygen
Вы можете использовать флаг -t
, чтобы указать тип создаваемого ключа. Например, для создания ключа RSA выполните:
ssh-keygen -t rsa
Также вы можете использовать флаг -b
для указания разрядности:
ssh-keygen -b 2048 -t rsa
Теперь укажите путь к файлу для хранения ключа. Путь по умолчанию и имя файла предлагаются обычно в таком формате: /home/user_name/ .ssh/id_rsa
. Чтобы принять путь и имя файла по умолчанию, нажмите Enter сразу. В противном случае введите требуемые путь и имя файла, а затем нажмите Enter. Далее вам будет предложено ввести пароль. Это рекомендуется сделать для защиты ключа от несанкционированного использования.
После подтверждения пароля программа сгенерирует пару ключей SSH, открытого и закрытого, а также сохранит их по указанному пути. Имя файла открытого ключа создается автоматически путем добавления .pub к имени файла закрытого ключа. Например, если имя файла закрытого ключа SSH — id_rsa
, имя файла открытого ключа будет id_rsa.pub
.
Запишите путь и имена файлов закрытого и открытого ключей. Для использования на удаленном устройстве необходимо указать значение открытого ключа SSH. А при входе вы должны указать путь к соответствующему закрытому ключу SSH и ввести пароль при появлении запроса.
И еще один важный момент, касающийся безопасности. Ни в коем случае не делитесь закрытым ключом SSH, иначе доступ к серверу сможет получить кто угодно. Расшаривать можно только открытый ключ с «говорящим» расширением .pub
.
kube
Теперь давайте установим соединение с worker node, чтобы обновить используемые приложения. Вводим:
apt-get update
Далее через sudo
мы ставим требуемые пакеты при помощи инструкции install
. Имена пакетов разделяем пробелом:
sudo apt-get install apt-transport-https ca-certificates curl -y
Не забудьте про -y
в конце. Данный флаг нужен, чтобы автоматически отвечать «да» на все запросы системы.
Для этого последовательно вводим следующие строчки:
sudo mkdir \
-p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg – dearmor -o /etc/apt/keyrings/docker.gpg
Наконец, поставим и сам Docker. Получаем пакет:
sudo add-apt-repository 'deb [arch=amd64] your_URL_here'
Вместо your_URL_here
укажите адрес реального репозитория, который определяется типом и версией установленной ОС. Далее обновляем пакеты:
sudo apt update
Теперь набираем инструкцию:
sudo apt install docker-ce -y
И проверяем корректность установки вот такой инструкцией:
sudo docker run hello-world
Тем же, у кого стоит Ubuntu, предлагаем воспользоваться расширенной инструкцией.
Теперь начинаем ставить модули Kube, из которых нам понадобятся следующие три:
Установка требуемых модулей выполняется простой инструкцией с их перечислением:
apt-get install -y kubelet kubeadm kubectl
После этого выполняем перезагрузку:
rm /etc/containerd/config.toml
systemctl restart containerd
После настройки одной worker node можно легко создать и развернуть ее копии в нужном количестве при помощи снапшотов. Для этого в панели управления Timeweb Cloud перейдите в раздел резервных копий и нажмите на создание точки восстановления. После этого резервная копия может быть легко скопирована на другой сервер.
Далее нам потребуется преобразовать одну из worker node в master node, с которой будем управлять созданным кластером. Чтобы сделать это, вводим инструкцию:
kubeadm init --pod-network-cidr=10.244.0.0/16
В ответ мы получим большое сообщение, начинающееся со строчки Your Kubernetes control-plane has initialized successfully!
Это означает, что получилось создать кластер.
Теперь перейдите на последнюю строку, которая представляет собой код токена. Не забудьте скопировать его и сохранить, например, в текстовом редакторе, поскольку этот код пригодится для дальнейшей настройки.
Делаем это инструкцией:
export KUBECONFIG=$HOME/admin.conf
Далее разрешаем запускать контейнеры следующим кодом:
kubectl taint nodes --all node-role.kubernetes.io/master-
Вышеприведенную инструкцию задействуют не всегда, однако подстраховаться и сделать главный узел также рабочим не помешает.
Для этого рекомендуется поставить SDN Flannel, свежую версию которого можно найти здесь. Далее для проверки вводим:
kubectl -n kube-system get pods
Теперь осталось получить токен, чтобы авторизоваться. Добавьте заранее сохраненный токен или, если забыли про это, введите:
kubeadm token list
Токен создан, приступаем к развертыванию кластера. Учтите, что токен действует всего сутки, но вы всегда можете сгенерировать новый при помощи следующей инструкции:
kubeadm token create --print-join-command
Итак, наш кластер работает. Начинаем подключать к нему worker node, используя токен (значения IP и токена приведены просто в качестве примера):
kubeadm join 172.31.43.204:6443 --token fg691w.pu5qexz1n654vznt --discovery-token-ca-cert-hash [вставьте сгенерированный токен сюда и уберите квадратные скобки]
При возникновении ошибки (такое иногда случается) просто перезапускаем кластер и снова вводим приведенную выше инструкцию kubeadm join
.
Вот и всё, осталось посмотреть, отвечают ли узлы. Это делают следующие инструкции:
kubectl get pods --all-namespaces
kubectl get nodes
Если в ответных сообщениях Kube будут выведены значения Running
и Ready
, значит всё сделано правильно, начинайте работать.
Теперь кратко рассмотрим другие способы развертывания кластера, в частности через приложения VMware и Azure.
Приведенный выше способ не единственный, это можно сделать и по-другому. Например, при помощи vCloud Director:
CSE или Container service extension представляет собой расширение для продуктов VMware, обеспечивая полную поддержку кластеров Kubernetes в виртуальной инфраструктуре. Системные требования к кластеру и его нодам такие же, как и в приведенном примере выше. Единственной проблемой здесь может быть доступность продуктов VMware, если вы работаете в России. Но если вы по-прежнему используете ПО от VMware, то процесс установки и развертывания кластера Kube через vCloud Director описан в документации разработчика.
Кластер в Azure CLI создается через инструкцию az aks create
со следующими параметрами (подставьте свои значения вместо myResourceGroup_name_here
, myAKSCluster_name_here
и acrName_here
):
az aks create \
--resource-group myResourceGroup_name_here \
--name myAKSCluster_name_here \
--node-count 2 \
--generate-ssh-keys \
--attach-acr <acrName_here>
Если же вы используете PowerShell, то та же инструкция будет такой (не забудьте указать свои корректные значения вместо myResourceGroup_name_here
, myAKSCluster_name_here
):
New-AzAksCluster -ResourceGroupName myResourceGroup_name_here -Name myAKSCluster_name_here -NodeCount 2 -GenerateSshKey -AcrNameToAttach <acrName_here>
apt-get install -y docker.io
, то, например, в CentOS эта инструкция будет выглядеть немного по-другому: yum install -y docker
.Выгодные тарифы на VDS/VPS
А еще один вариант развертывания кластера — обратиться в Timeweb Cloud за готовым решением KaaS (Kubernetes as a Service). Вам не придется выполнять шаги по установке ОС и оркестратора, так как сервер уже настроен и готов к работе. Просто выберите подходящую конфигурацию и перенастройте отдельные параметры под свои задачи, используя нужные части данного руководства.