Хаос-инженерия с LitmusChaos на AWS EKS с использованием IRSA

Я уже начал совершенно новую серию на своем канале YouTube под названием Learn Chaos Engineering series. Первые несколько эпизодов будут посвящены LitmusChaos. Последние несколько недель я работаю над LitmusChaos. Чем больше я работаю, тем больше вопросов возникает о механике LitmusChaos. В эпизоде 2 мы увидели эксперимент по завершению работы экземпляра EC2 с использованием AWS Secrets, что является одним из способов запуска хаоса на AWS. Раскрытие секретов и ключей доступа не рекомендуется. Введите IRSA. Роль IAM для служебной учетной записи. Вместо того чтобы создавать видео, позвольте мне написать это в виде статьи в блоге; я надеюсь, что это произведет большое впечатление на людей, которые только начинают. Прежде чем написать эту статью, я несколько раз попрактиковался. Давайте продолжим.

Предварительные условия

Когда речь идет о AWS EKS, есть несколько движущихся компонентов. Некоторые из них необязательны, но они станут отличным дополнением, если вы столкнетесь с трудностями. Например, я использую Octant для визуализации экосистемы Kubernetes. Вы можете использовать Lens или Kubernetes Dashboard, если вы с ними знакомы.

Ниже приведены материалы, которые вам понадобятся, прежде чем вы приступите к работе:

  1. eksctl для раскрутки кластера AWS EKS
  2. LitmusChaos
  3. Доступ к созданию ролей и политик AWS IAM
  4. Helm (опционально)
  5. Octant (опционально)
  6. Экземпляр EC2 для запуска на нем экспериментов.

Что такое LitmusChaos?

Litmus — это платформа для хаос-инженерии с открытым исходным кодом, которая позволяет командам выявлять слабые места и потенциальные сбои в инфраструктуре путем контролируемого проведения хаос-тестов.

Недавно она была приобретена компанией Harness. Это проект CNCF Incubation.

eksctl

eksctl — это отличная утилита CLI для выполнения различных задач AWS EKS, таких как управление кластером, усиление безопасности, GitOps и многое другое. Она написана на языке Go и использует CloudFormation под капотом.

Используя eksctl, мы можем создать кластер одной командой. Но я не рекомендую этого делать. Например, это создаст два рабочих узла m5.large на us-west-2, что нам не нужно для целей обучения.

Вместо этого используйте команду --dry-run для вывода в файл и изменения параметров, таких как регион, тип экземпляра, зона доступности и т.д.

Установите eksctl из этой документации.

Введите приведенную ниже команду, которая создаст yaml-манифест EKS.

eksctl create cluster --name=chaos-playground --region=us-east-1 --dry-run > chaos-playground.yaml

Имя нашего кластера chaos-playground и он будет создан на us-east-1. Измените регион в зависимости от вашего местоположения так, чтобы вы попали в ближайшую зону доступности.

Откройте yaml манифест в вашем любимом редакторе, например, vim chaos-playground.yaml.

Измените тип экземпляра на t3.medium. Сохраните его и примените приведенную ниже команду, чтобы начать создание кластера.

eksctl create cluster -f chaos-playground.yaml

Пойдите выпейте кофе, чай или ваш любимый напиток и вернитесь через 15-25 минут.

Когда EKS будет запущен, вы получите следующее сообщение.

EKS cluster "chaos-playground" in "us-east-1" region is ready

Обновление конфигурации kube

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

aws eks update-kubeconfig --name chaos-playground --region us-east-1

Приведенная выше команда изменит контекст на chaos-playground. Чтобы проверить текущий контекст, введите следующую команду.

k config current-context

У меня есть псевдоним k для kubectl. Вам может понадобиться ввести kubectl вместо k.

Установите kubectl отсюда.

LitmusChaos

Начнем с установки LitmusChaos в пространстве имен litmus. Вы можете установить LitmusChaos отсюда. По умолчанию сервисы litmusportal-frontend-service и litmusportal-server-service отображаются как NodePort. Нам нужно выставить его как ClusterIP. Я уже изменил тип и сохранил его в своем репозитории GitHub. Давайте применим это к нашему кластеру с помощью приведенной ниже команды.

k apply -f https://raw.githubusercontent.com/QAInsights/Learn-Chaos-Engineering-Series/main/LitmusChaos-AWS-EKS/litmuschaos-2.9.0.yaml

Приведенная выше команда создаст различные объекты Kubernetes, как показано ниже.

По умолчанию все пользовательские определения ресурсов Litmus (CRD) будут установлены в пространстве имен litmus.

Давайте проверим капсулы, которые запущены в пространстве имен litmus.

k get po -n litmus

Следующим шагом будет открытие службы litmusportal-frontend-service для получения URL с балансировкой нагрузки.

Введите приведенную ниже команду для исправления службы.

k patch svc litmusportal-frontend-service -p '{"spec": {"type": "LoadBalancer"}}' -n litmus

Чтобы получить URL-адрес сбалансированной нагрузки, введите следующую команду.

k get -n litmus svc litmusportal-frontend-service -o wide

Вы получите URL и порт. Например, вы можете получить доступ к пользовательскому интерфейсу LitmusChaos, используя порт 9091 и URL http://a336e7fc0d2d64029abdf53d95aa1cca-97284119.us-east-1.elb.amazonaws.com:9091.

Давайте подождем несколько мгновений, пока URL не станет доступным. Тем временем, давайте установим Octant отсюда.

Запустите программу Octant и запустите 127.0.0.1:7777 домашнюю страницу Octant.

Первым шагом будет настройка конфигурации kube. Перейдите в Preferences > General и запишите путь к конфигурации kube. Убедитесь, что наш AWS EKS kube config присутствует в Octant kube config. Если он отсутствует, Octant не будет отображать объекты chaos-playground.

Вот капсулы, которые запущены в пространстве имен litmus на кластере chaos-playground.

Теперь пришло время запустить пользовательский интерфейс LitmusChaos.

По умолчанию используется учетная запись admin/litmus.

При первом входе в систему LitmusChaos предложит вам изменить пароль. Вы можете пропустить его или изменить учетные данные.

После успешного входа нажмите ChaosAgents, чтобы подтвердить статус Self-Agent.

Подождите, пока Self-Agent не перейдет в статус Active, как показано ниже.

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

Один экземпляр EC2 работает без группы автомасштабирования.

Предоставлено .

Отказ одного экземпляра EC2 приведет к нарушению обслуживания клиентов.

Гипотеза

Раскрутка экземпляра EC2

Если вы новичок в AWS, пожалуйста, следуйте этому руководству, чтобы создать экземпляр EC2 в вашем регионе.

Для этой демонстрации я запустил экземпляр EC2 с t2.micro, на котором работает сервер nginx.

Эксперимент EC2 Terminate By ID

Давайте вернемся в LitmusChaos и создадим новый эксперимент, который завершит вышеупомянутый экземпляр EC2 по его ID.

Нажмите Litmus Workflows > Schedule a workflow, чтобы начать создание рабочего процесса.

Выберите Self-Agent, затем нажмите Next.

Нажмите радиокнопку Create a new workflow using the experiments from ChaosHubs и выберите Litmus ChaosHub, затем нажмите Next.

Снова нажмите Далее, оставив значения по умолчанию для имени рабочего процесса.

Нажмите Добавить новый эксперимент и найдите ec2.

Выберите kube-aws/ec2-terminate-by-id и нажмите Готово.

Нажмите на значок пера, чтобы отредактировать эксперимент.

Нажмите кнопку Next три раза, оставив параметры по умолчанию.

В разделе Настроить эксперимент введите идентификатор экземпляра EC2.

Нажмите кнопку Show more environment variables, чтобы ввести регион, а затем нажмите Finish.

Нажмите кнопку Next несколько раз, а затем Finish, чтобы начать эксперимент. Через некоторое время этот эксперимент завершится неудачей.

Почему он завершился неудачей?

У объектов LitmusChaos нет доступа для уничтожения экземпляра EC2. Несмотря на то, что мы запускаем все на одной учетной записи AWS. Чтобы аутентифицировать объекты LitmusChaos к ресурсам AWS, есть два способа: использование секретов AWS или использование сервиса IAM.

Использование секретов AWS не является рекомендуемой практикой для проведения эксперимента. Поскольку мы раскрываем секреты в файле YAML.

Введите IRSA. Роль IAM для учетной записи службы.

IAM — это веб-служба, которая помогает вам надежно контролировать доступ к ресурсам AWS.

Учетная запись службы в данном контексте предназначена для Kubernetes. Учетная запись службы Kubernetes обеспечивает идентификацию процессов, выполняемых в капсуле.

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

  1. Создание провайдера OIDC
  2. Создайте роль IAM и политику
  3. Ассоциировать роль IAM

Создание провайдера OIDC

Концепция OIDC выходит за рамки данной статьи. На высоком уровне OpenID Connect аутентифицирует AWS API с поддерживаемыми провайдерами идентификации и получает токен JWT. Этот токен может быть передан в AWS STS для получения временных учетных данных для аутентификации в любой службе AWS, например EC2.

Введите приведенную ниже команду для проверки поставщика OIDC для кластера.

aws eks describe-cluster --name chaos-playground --region us-east-1 --query "cluster.identity.oidc.issuer" --output text

Это приведет к появлению следующего результата.

https://oidc.eks.us-east-1.amazonaws.com/id/B718311B05C5C27CCF96C406CEXXXXXX

Если вывода нет, введите приведенную ниже команду для его создания.

eksctl utils associate-iam-oidc-provider --cluster chaos-playground --region us-east-1 --approve

Создание политики и роли IAM

Скопируйте приведенную ниже политику и сохраните ее как chaos-playground.json. Замените ID учетной записи на ID вашей учетной записи.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "ec2:*",
            "Resource": "*"
        },
        {
            "Sid": "VisualEditor1",
            "Effect": "Allow",
            "Action": "sts:*",
            "Resource": "arn:aws:iam::<your-account-id>:role/*"
        }
    ]
}

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

aws iam create-policy --policy-name ChaosPlaygroundPolicy --policy-document file://chaos-playground-policy.json

Каждая сущность в AWS имеет уникальный идентификатор, называемый ARN. Чтобы получить ARN для вышеуказанной политики, введите следующую команду.

aws iam list-policies --query 'Policies[?PolicyName==ChaosPlaygroundPolicy].Arn' --output text

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

Следующим шагом будет создание политики доверия для нашей роли IAM.

Сохраните приведенную ниже политику доверия как chaos-playground-trust.json и убедитесь, что вы заменили значение OIDC соответствующим образом.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Federated": "arn:aws:iam::<your-account-id>:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/B718311B05C5C27CCF96C406XXXXXXX"
            },
            "Action": "sts:AssumeRoleWithWebIdentity",
            "Condition": {
                "StringEquals": {                   
                    "oidc.eks.us-east-1.amazonaws.com/id/B718311B05C5C27CCF96C406XXXXXXX:aud": "sts.amazonaws.com"
                }
            }
        }
    ]
}

aws iam create-role --role-name Chaos-Playground-Role --assume-role-policy-document file://chaos-playground-trust.json

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

Чтобы прикрепить ее к роли IAM, введите следующую команду.

aws iam attach-role-policy --policy-arn arn:aws:iam::<your-account-id>:policy/ChaosPlaygroundPolicy --role-name Chaos-Playground-Role.

Ассоциирование IAM роли

Чтобы связать роль IAM с учетной записью службы Kubernetes, первым шагом будет создание учетной записи службы с помощью команды eksctl.

Введите приведенную ниже команду для создания IAM SA.

eksctl create iamserviceaccount --cluster=chaos-playground --namespace=litmus --name=ec2-terminate-sa-litmus --attach-policy-arn="arn:aws:iam::<your-account-d>:policy/ChaosPlaygroundPolicy" --override-existing-serviceaccounts --approve --region us-east-1

Чтобы проверить все учетные записи служб в пространстве имен litmus. Введите следующую команду.

k get sa -n litmus

После создания учетной записи службы следующим шагом будет аннотирование учетной записи службы с ARN роли IAM с помощью приведенной ниже команды. Команда ниже аннотирует учетную запись службы litmus-admin. Этого будет достаточно для нашего эксперимента.

k annotate serviceaccount -n litmus litmus-admin eks.amazonaws.com/role-arn=arn:aws:iam::202835464218:role/Chaos-Playground-Role --overwrite

Чтобы подтвердить аннотации, введите следующую команду.

k describe sa -n litmus ec2-terminate-sa-litmus

Эксперименты с LitmusChaos

Давайте снова запустим эксперимент. Но перед его запуском нам нужно удалить смонтированные секреты из нашего эксперимента. Поскольку мы используем IRSA, нам не нужно его монтировать.

Перейдите в раздел LitmusChaos > Litmus Workflows > Schedules.

Нажмите на вертикальные три точки, а затем нажмите Download Manifest.

Откройте манифест в вашем любимом редакторе. Удалите строки, содержащие secrets. Сохраните его.

Создайте новый эксперимент, загрузив YAML, как показано ниже. Затем запустите выполнение.

Если все хорошо, то на этот раз наш эксперимент пройдет.

Пока эксперимент выполняется, вы можете проверить журналы из Octant.

Или проверить статус на панели инструментов EC2 Instances.

После завершения эксперимента LitmusChaos вернет состояние экземпляра EC2.

Вот вид графика рабочего процесса LitmusChaos.

Спасибо, что остаетесь со мной 🙂

Важные замечания

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

Заключение

IRSA — это прекрасная реализация фреймворка с нулевым доверием. LitmusChaos спроектирован с учетом потребностей безопасности предприятий, работающих в экосистеме AWS и GCP. Мы только поцарапали поверхность LitmusChaos. Со временем я расскажу о других экспериментах на своем канале.

Оцените статью
Procodings.ru
Добавить комментарий