Часть 2 из серии статей об изучении k8s!
Указатель всей серии
- Основы k8s
- Создать кластер k8s одной командой
- Первое размещение контейнера в k8s
- Зачем нам Pod
- Важные поля конфигурации модуля
- Под проектные объемы
- Проверка работоспособности и восстановление 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 за считанные минуты с помощью всего одной команды.
Предпосылки
eksctl
установлена 0.66.0
или более поздняя версияkubectl
установлена 1.21
или более поздняя версия- Существующая пара ключей AWS EC2
- Пользователь 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