В этой статье мы рассмотрим несколько распространенных способов создания кластера 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)


  1. thunderspb
    17.11.2023 18:22
    +1

    А почему не eksctl, раз уж aws? Очень странная вода....

    Я вообще терраформ + террагрант разворачиваю всю инфру... Почему именно копс и ранчер, который, судя по тексту еще и отдельную ec2(??) требует?

    Я понимаю, что перевод... Но, блин... Не в блоге же компании, которая обучением занимается... И уже не первый раз замечаю... Это личное мнение.

    Ну и написано "распространённые способы". Даже авс документация предлагает eksctl...


  1. Fa11en_Angel
    17.11.2023 18:22

    "Использование EKS" - два скриншота и ссылка на документацию. Огонь


  1. 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


  1. vic_1
    17.11.2023 18:22

    AWS в РФ не доступен, зачем, тратить время на перевод, а уж тем более на чтение? :)


    1. 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