В этой статье мы рассмотрим несколько распространенных способов создания кластера Kubernetes на AWS:
Создание кластера с помощью kops: kops — это инструмент, предназначенный для промышленной эксплуатации, используемый для установки, обновления и управления Kubernetes на AWS.
Создание кластера с помощью Amazon Elastic Kubernetes Service (EKS): EKS — это управляемый сервис Kubernetes, предоставляемый компанией Amazon. Кластер Kubernetes с EKS можно создать с помощью AWS Management Console.
Создание кластера с помощью Rancher: Rancher — это платформа управления Kubernetes, которая упрощает развертывание Kubernetes и контейнеров.
Развертывание Kubernetes на AWS с помощью Kops
Kops — это инструмент производственного уровня, используемый для установки, обновления и эксплуатации высокодоступных кластеров Kubernetes на AWS и других облачных платформах с помощью командной строки.
Установка кластера Kubernetes на AWS
Прежде чем приступить к работе, вам нужно будет установить инструменты kubectl, kops и AWS CLI.
Учетные данные для клиента AWS
Первым шагом будет настройка учетных данных (Access Credentials) для доступа к клиенту AWS.
Для корректной работы kops нужно чтобы пользователь AWS IAM обладал следующими правами:
AmazonEC2FullAccess
AmazonRoute53FullAccess
AmazonS3FullAccess
IAMFullAccess
AmazonVPCFullAccess
Настройте AWSCLIi с учетными данными этого пользователя, выполнив команду:
# aws configure
Создание бакета S3 для хранения состояния кластера
Теперь мы создадим выделенный бакет S3, который будет использоваться kops для хранения состояния, представляющего кластер. Назовем этот бакет my-cluster-state
:
# aws s3api create-bucket --bucket my-cluster-state
Обязательно активируйте версионирование бакета, чтобы впоследствии иметь возможность восстановиться или вернуться к предыдущему состоянию:
# aws s3api put-bucket-versioning --bucket my-cluster-state --
versioning-configuration Status=Enabled
Настройка DNS
Что касается DNS, то у нас есть выбор между публичным или приватным DNS. В случае использования публичного DNS для создания кластера требуется действительный домен верхнего уровня или поддомен. DNS требуется рабочим узлам для обнаружения мастер-узла, а мастер-узлу — для обнаружения всех etcd-серверов. Домен, регистратор которого не является AWS, создает зону Route 53, размещенную на AWS, и соответствующим образом изменяет записи сервера преобразования имен у своего регистратора.
В этом примере мы будем использовать простой приватный DNS для создания кластера на основе механизма сплетен (gossip-based). Единственное требование к такому сетапу — чтобы имя кластера заканчивалось на k8s.local
.
Создание кластера Kubernetes
Следующая команда создаст кластер с одним мастером (инстанс m3.medium
) и двумя узлами (два инстанса t2.medium
) в зоне доступности us-west-2a
:
# kops create cluster \ --name my-cluster.k8s.local \ --zones us-west-2a \
--dns private \ --master-size=m3.medium \ --master-count=1 \
--node-size=t2.medium \ --node-count=2 \ --state s3://my-cluster-state \
--yes
Некоторые параметры команды в приведенном выше примере имеют значения по умолчанию: --master-size
, --master-count
, --node-size
и --node-count
. Мы использовали именно эти значения по умолчанию, поэтому результат был бы таким же, даже если бы мы явно не прописали эти опции. Также отметим, что kops будет создавать по одному мастер-узлу в каждой указанной зоне доступности, поэтому при использовании опции: --zones us-west-2a,us-west-2b
будет создано два мастер-узла, по одному в каждой из двух зон (даже если опция --master-count
не была указана в командной строке).
Обратите внимание, что создание кластера может занять некоторое время, поскольку инстансы должны загрузиться, загрузить стандартные компоненты Kubernetes и достичь состояния готовности ("ready"). Kops предоставляет команду для проверки состояния кластера и проверки его готовности:
# kops validate cluster --state=s3://my-cluster-state Using cluster from
kubectl context: my-cluster.k8s.local Validating cluster my-cluster.k8s.local
INSTANCE GROUPS NAME ROLE MACHINETYPE MIN MAX SUBNETS master-us-west-2a
Master m3.medium 1 1 us-west-2a nodes Node t2.medium 2 2 us-west-2a
NODE STATUS NAME ROLE READY ip-172-20-32-203.us-west-2.compute.internal
node True ip-172-20-36-109.us-west-2.compute.internal node True
ip-172-20-61-137.us-west-2.compute.internal master True Your cluster
my-cluster.k8s.local is ready
Если вы хотите внести некоторые изменения в кластер, выполните следующие действия:
# kops edit cluster my-cluster.k8s.local # kops update cluster
my-cluster.k8s.local --yes
Обновление кластера до более актуальной версии Kubernetes
Kops позволяет обновить существующий кластер (мастер и узлы) до последней рекомендованной версии Kubernetes без необходимости указания точной версии. Kops поддерживает плавное (поэтапное) обновление кластера, при котором мастер и рабочие узлы обновляются поочередно.
1. Обновление Kubernetes
# kops upgrade cluster \ --name $NAME \ --state s3://my-cluster-state \
--yes
2. Обновление хранилище состояний, чтобы оно соответствовало состоянию кластера.
# kops update cluster \ --name my-cluster.k8s.local \ --state
s3://my-cluster-state \ --yes
3. Выполнение поэтапного обновления.
# kops rolling-update cluster \ --name my-cluster.k8s.local \ --state
s3://my-cluster-state \ --yes
Таким образом обновления будут выполняться на всех инстансах кластера, сначала на главном, а затем на рабочих.
Удаление кластера
Для удаления существующего кластера, который мы использовали, например, для экспериментов или тестов, можно выполнить команду:
# kops delete cluster my-cluster.k8s.local \ --state=s3://my-cluster-state \
--yes
Больше информации можно найти в документации AWS: Управление кластерами Kubernetes на AWS с помощью Kops
Использование Kubernetes EKS Managed Service
Amazon Elastic Container Service для Kubernetes (EKS) — это полностью управляемый сервис, который берет на себя все заботы по настройке и созданию кластера, обеспечивая поддержку multi-AZ
на всех кластерах и автоматическую замену неработающих инстансов (мастера или рабочих узлов).
По умолчанию кластеры в EKS состоят из трех мастеров, распределенных по трем различным зонам доступности для защиты от сбоев при одной из зон доступности AWS:
Создание нового кластера Kubernetes с помощью EKS может быть выполнено с помощью консоли управления AWS (Management Console). После получения доступа к кластеру контейнеризированные приложения могут быть запланированы на новом кластере так же, как и при любой другой установке Kubernetes:
Больше информации можно найти в документации AWS: Amazon EKS
Запуск Kubernetes на EC2 с помощью Rancher
Rancher — это комплексная платформа управления контейнерами, которая упрощает развертывание Kubernetes в частности и контейнеров вцелом.
Настройка Rancher в AWS
Rancher (приложение) работает под операционной системой RancherOS, которая доступна в виде Amazon Machine Image (AMI) и, соответственно, может быть развернута на инстансе EC2.
Создание инстанса RancherOS на EC2
После установки и настройки инструмента AWS CLI можно сразу переходить к созданию инстанса EC2 с помощью AMI RancherOS. Узнать идентификаторы AMI для каждого региона можно в документации RancherOS. Например, выполните следующую команду:
$ aws ec2 run-instances --image-id ami-12db887d --count 1 --instance-type
t2.micro --key-name my-key-pair --security-groups my-sg
которая создаст один новый инстанс t2.micro EC2 с RancherOS в регионе ap-south-1 AWS. Убедитесь в том, что вы используете правильное имя ключа и группу безопасности. Также убедитесь, что группа безопасности разрешает трафик на TCP-порт 8080 для нового инстанса.
Запуск сервера Rancher
Когда новый инстанс будет готов, просто подключитесь к нему с помощью ssh и запустите сервер Rancher:
$ sudo docker run --name rancher-server -d --restart=unless-stopped \
-p 8080:8080 rancher/server:stable
Это может занять несколько минут. После этого по порту 8080 инстанса EC2 можно получить доступ к пользовательскому интерфейсу. Поскольку по умолчанию доступ к пользовательскому интерфейсу и API Rancher может получить любой желающий, вам рекомендуется серьезно подойти к управлению доступом.
Создание кластера Kubernetes с помощью Rancher в AWS
Настройка шаблона среды Kubernetes
Среда (environment) в Rancher — это логическая сущность, предназначенная для совместного использования развертываний и ресурсов различными группами пользователей. Среды создаются на основе шаблонов.
Создание кластера Kubernetes (среды)
Добавление среды Kubernetes сводится к выбору подходящего для нашего случая шаблона и вводу имени кластера. Если включен контроль доступа, мы можем добавить участников и выбрать их роли. Все, кто добавлен в список участников, будут иметь доступ к среде.
Добавление хостов в кластер Kubernetes
Нам необходимо добавить в только что созданную среду Kubernetes как минимум один хост. В данном случае в качестве хоста будут выступать ранее созданные инстансы AWS EC2.
После добавления первого узла Rancher автоматически начнет развертывание инфраструктуры (мастера), включая сервисы Kubernetes (например, kubelet, etcd, Kubee-proxy и т.д.). Хосты, которые будут использоваться в качестве узлов Kubernetes, потребуют, чтобы для kubectl были открыты TCP-порты 10250 и 10255. Обязательно ознакомьтесь с полным списком требований Rancher к хостам.
После добавления узлов в среду Kubernetes настройка/обновление кластера Kubernetes может занять несколько минут:
Развертывание приложений в кластере Kubernetes
После того как кластер готов, контейнеризированные приложения могут быть развернуты с помощью каталога приложений Rancher или kubectl.
Дополнительную информацию можно найти в документации Rancher: Kubernetes
Другие варианты развертывания Kubernetes в облаке
Помимо уже рассмотренных вариантов развертывания Kubernetes, для развертывания Kubernetes в публичных облаках, таких как AWS, можно использовать и другие инструменты. Каждый инструмент имеет свои уникальные возможности и подход к работе:
Heptio — Heptio представляет собой решение на основе CloudFormation и kubeadm для развертывания Kubernetes на AWS, поддерживающее multi-AZ. Heptio подходит для пользователей, уже знакомых с инструментом оркестровки AWS CloudFormation.
Kismatic Enterprise Toolkit (KET) — KET представляет собой набор инструментов с продуманными настройками по умолчанию, из коробки готовых к использованию на продакшене для создания корпоративных кластеров Kubernetes.
kubeadm — Проект kubeadm ориентирован на упрощение создания кластера на AWS с использованием Terraform. Этот инструмент подходит только для тестирования и экспериментов, поскольку он не поддерживает multi-AZ и другие продвинутые фичи.
В заключение приглашаем всех желающих на открытый урок, на котором мы рассмотрим процесс разворачивания кластера managed Kubernetes в Yandex.Cloud с использованием инструмента Terraform. Урок пройдет в рамках курса "Cloud Solution Architecture", записаться можно на странице курса.
Комментарии (5)
kWatt
17.11.2023 18:22Есть ещё вариант через
ekscli
, манифест в стилеkubernetes
, как пример:apiVersion: eksctl.io/v1alpha5 availabilityZones: - us-east-1a - us-east-1b cloudWatch: clusterLogging: {} iam: vpcResourceControllerPolicy: true withOIDC: false kind: ClusterConfig metadata: name: node region: us-east-1 version: "1.19" nodeGroups: - amiFamily: AmazonLinux2 desiredCapacity: 1 disableIMDSv1: false disablePodIMDS: false iam: withAddonPolicies: albIngress: true appMesh: false
запускать так:
eksctl create nodegroup -f manifest.yaml
документация тут. В разы проще чем ковыряться вcloudformation
vic_1
17.11.2023 18:22AWS в РФ не доступен, зачем, тратить время на перевод, а уж тем более на чтение? :)
kWatt
17.11.2023 18:22Вы в каком-то другом РФ живёте?
У меня всё работает.$ curl https://ipinfo.io/region Moscow
aws:
$ curl -I https://aws.amazon.com/ HTTP/2 200 content-type: text/html;charset=UTF-8 server: Server date: Mon, 20 Nov 2023 05:33:06 GMT
thunderspb
А почему не eksctl, раз уж aws? Очень странная вода....
Я вообще терраформ + террагрант разворачиваю всю инфру... Почему именно копс и ранчер, который, судя по тексту еще и отдельную ec2(??) требует?
Я понимаю, что перевод... Но, блин... Не в блоге же компании, которая обучением занимается... И уже не первый раз замечаю... Это личное мнение.
Ну и написано "распространённые способы". Даже авс документация предлагает eksctl...