Часть 2 из серии статей об изучении k8s!

Указатель всей серии

  1. Основы k8s
  2. Создать кластер k8s одной командой
  3. Первое размещение контейнера в k8s
  4. Зачем нам Pod
  5. Важные поля конфигурации модуля
  6. Под проектные объемы
  7. Проверка работоспособности и восстановление pod-контейнера

В своей предыдущей статье я рассказал об истории k8s и некоторых фундаментальных концепциях. Если вы хотите по-настоящему использовать преимущества контейнерной технологии, вы не можете ограничиваться только изучением и использованием контейнеров Linux. Эти концепции больше подходят в качестве вашего технического резерва, так как они могут помочь вам быстрее обнаруживать и решать проблемы, когда это необходимо.

Ключ к более глубокому пониманию технологии контейнеров - это умение использовать эти технологии для «контейнеризации» ваших приложений.

Как построить кластер k8s одной командой?

Начало всегда самое тяжелое, особенно для k8s. Как типичный распределенный проект, развертывание k8s всегда было препятствием для новичков. Особенно в первые дни выпуска проекта k8s его развертывание полностью зависело от набора скриптов, поддерживаемых сообществом.

Фактически, как Golang проект, k8s устранил множество проблем с установкой зависимостей на уровне языка, подобных проектам Python.

Однако, помимо компиляции каждого компонента в двоичные файлы, пользователи также несут ответственность за написание соответствующих файлов конфигурации для этих двоичных файлов, настройку самозапускающихся скриптов и настройку файлов авторизации для kube-apiserver.

В настоящее время наиболее распространенным методом развертывания, используемым на основных облачных платформах, является автоматическое выполнение этих шагов с использованием инструментов эксплуатации и обслуживания, таких как SaltStack, terraform и Ansible. Вы можете прочитать мою статью Infra As Code - Terraform (2) Create AWS EKS Cluster », если хотите изучить ее на собственном горьком опыте.

Но, к счастью, есть проект с открытым исходным кодом под названием eksctl («https://eksctl.io/ acc), который позволяет вам создать кластер k8s одной командой, например:

$ eksctl create cluster --name dev-cluster --version 1.20 --region us-east-1 --nodegroup-name standard-workers --node-type t3.micro --nodes 1 --nodes-min 1 --nodes-max 4 --managed

eksctl

eksctl - это простая утилита командной строки для создания кластеров k8s и управления ими в AWS EKS. Он написан на golang, используйте AWS SDK и CloudFormation сервис. Используя eksctl, вы можете создать базовый кластер EKS за считанные минуты с помощью всего одной команды.

Предпосылки

  1. eksctl установлена ​​0.66.0 или более поздняя версия
  2. kubectl установлена ​​1.21 или более поздняя версия
  3. Существующая пара ключей AWS EC2
  4. Пользователь AWS IAM с соответствующими привилегиями для создания кластеров EKS (файл ~/.aws/credentials настроен правильно)

Правильные разрешения IAM

Права доступа пользователей IAM:

  • CloudFormation: полный доступ
  • Теги EC2: полный доступ
  • Ограничение EC2: список, чтение, запись
  • Автоматическое масштабирование EC2: список, напишите
  • EKS: полный доступ
  • IAM: список, чтение, запись, управление разрешениями
  • Системный менеджер: список, прочтите

Для простоты и облегчения устранения неполадок я предлагаю вам предоставить пользователю IAM admin разрешение во время тестирования.

Мой env

Ниже приведены настройки моей среды:

$ eksctl version
0.63.0
$ kubectl version
Client Version: version.Info{Major:"1", Minor:"21+", GitVersion:"v1.21.2-13+d2965f0db10712", GitCommit:"d2965f0db1071203c6f5bc662c2827c71fc8b20d", GitTreeState:"clean", BuildDate:"2021-06-26T01:02:11Z", GoVersion:"go1.16.5", Compiler:"gc", Platform:"linux/amd64"}

Подготовьте файл YAML конфигурации кластера EKS

Даже вы можете поместить все параметры в одну строку, но я все же предлагаю вам создать cluster.yaml файл конфигурации для вашего кластера, чтобы вы могли легко контролировать его версии.

Вы можете использовать мой файл конфигурации в качестве отправной точки:

apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
  name: basic-cluster
  region: us-east-1
  version: "1.20"
managedNodeGroups:
  - name: managed-ng-public
    instanceType: m5.large
    minSize: 1
    desiredCapacity: 1
    maxSize: 1
    availabilityZones: ["us-east-1a"]
    volumeSize: 20
    ssh: # Using existing EC2 Key pair
      allow: true
      publicKeyName: devops101
    tags:
      nodegroup-role: worker

Примечания: у меня уже есть существующая пара ключей devops101

Создайте кластер EKS

Когда у вас будет готов файл конфигурации, вы можете запустить следующую команду для создания кластера EKS:

$ eksctl create cluster -f dev-cluster.yaml

Результат будет выглядеть так:

Это займет около 15-25 минут, в конце вы должны увидеть следующий результат:

Проверьте из командной строки:

$ eksctl get cluster
2021-09-22 16:10:56 [ℹ]  eksctl version 0.63.0
2021-09-22 16:10:56 [ℹ]  using region us-east-1
NAME  REGION  EKSCTL CREATED
basic-cluster us-east-1 True
$ kubectl get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.100.0.1   <none>        443/TCP   121m

Примечание. После успешного eksctl создания кластера EKS он также автоматически создаст для вас ~/.kube/config файл, поэтому вам не нужно обновлять его вручную.

Вы должны увидеть новый кластер EKS и группу управляемых рабочих узлов в консоли AWS:

На этом этапе вы создали работающий кластер EKS, выполнив всего одну команду! Как это просто!

Как работает eksctl

Давайте подробно рассмотрим, как eksctl работает? Поскольку он написан на golang и имеет открытый исходный код, вы можете найти его исходный код на Github: https://github.com/weaveworks/eksctl

Под капотом инструмент eksctl использует сервис AWS CloudFormation, создавая стеки CNF для главной плоскости управления EKS и рабочих узлов EKS. После выполнения команды eksctl create cluster, если вы перейдете к сервису CloudFormation в консоли AWS, вы должны увидеть следующие стеки CNF:

Просто чтобы просмотреть все ресурсы, которые он для нас создал:

Если вы визуализируете это:

Вы также можете проверить вкладку Templates в CloudFormation, чтобы увидеть подробные определения ресурсов.

Создать постоянное хранилище ладьи

Часто нам нужно использовать тома данных для монтирования каталогов или файлов на внешнем хосте в Mount Namespace контейнера, чтобы достичь цели совместного использования этих каталогов или файлов между контейнером и хостом. Приложение в контейнере также может создавать и записывать файлы в эти тома данных.

Однако, если вы запустите контейнер на одной машине, вы, очевидно, не сможете увидеть файлы, записанные контейнерами на других машинах в их томах данных. Это одна из наиболее типичных характеристик контейнеров: stateless.

Постоянное хранение контейнера - важный механизм для сохранения состояния хранения контейнера:

Подключаемый модуль хранения будет монтировать удаленный том данных на основе сети или других механизмов в контейнере, так что файлы, созданные в контейнере, фактически хранятся на удаленном сервере хранения или хранятся на нескольких узлах распределенным образом, это не имеет связывающих отношений с текущим хостом.

Таким образом, независимо от того, на каком хосте вы запускаете новый контейнер, вы можете запросить монтирование указанного тома постоянного хранилища для доступа к содержимому, хранящемуся в томе данных. Это значение Persistent Storage

В этой практике я буду использовать Rook в качестве подключаемого модуля хранения. Rook подключаемый модуль хранилища Kubernetes на основе Ceph. Однако, в отличие от простой упаковки Ceph, Rook добавил в свою реализацию большое количество функций корпоративного уровня, таких как горизонтальное расширение, миграция, аварийное резервное копирование, мониторинг и т. Д., Что сделало этот проект полноценным доступным хранилищем контейнеров производственного уровня. Плагин.

Чтобы реализовать rook, вам просто нужно выполнить следующие команды:

$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/common.yaml
$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/operator.yaml
$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/crds.yaml
$ kubectl apply -f https://raw.githubusercontent.com/rook/rook/master/cluster/examples/kubernetes/ceph/cluster.yaml

После завершения развертывания вы увидите, что проект Rook разместит свой Pod в двух управляемых им пространствах имен:

Таким образом, кластер Persistent Storage на основе Rook был создан и запущен, и все поды, созданные в этом кластере EKS, могут монтировать том данных, предоставленный Ceph, через постоянный том (PV) и утверждение постоянного тома (PVC).

Rook будет отвечать за управление жизненным циклом, аварийное резервное копирование и другие операции и обслуживание этих томов данных. Подробнее о Persistent Storage я расскажу в следующих статьях.

Удалить кластер EKS

В конце концов, когда вы закончите экспериментировать со своим кластером EKS, вы можете уничтожить его с помощью следующей команды, потому что вы за это платите:

$ eksctl delete cluster --name basic-cluster
2021-09-22 17:04:59 [ℹ]  eksctl version 0.63.0
2021-09-22 17:04:59 [ℹ]  using region us-east-1
2021-09-22 17:04:59 [ℹ]  deleting EKS cluster "basic-cluster"
...
2021-09-22 17:07:52 [ℹ]  waiting for CloudFormation stack "eksctl-basic-cluster-nodegroup-managed-ng-public"
2021-09-22 17:07:52 [ℹ]  will delete stack "eksctl-basic-cluster-cluster"
2021-09-22 17:07:52 [✔]  all cluster resources were deleted

Заключение

Как видите, инструмент eksctl значительно упростил процесс создания кластера EKS, поскольку пользователю / разработчику не нужно понимать концепции VPC, Internet Gateway, Security Groups, EIP, Service Role, Subnet и т. Д., Прежде чем создавать EKS. кластер (Но как инженер DevOps вы должны понимать вышеупомянутые технологии и пытаться вручную создать кластер EKS).

Но под капотом за одной командой происходит множество вещей. Мы все должны поблагодарить WaveWorks за создание такого инструмента и его открытый исходный код.

Надеюсь, вам понравилась эта статья, и увидимся в следующей статье!

Больше контента на plainenglish.io