Бессерверные конвейеры Tekton на AWS EKS Fargate

Бессерверные конвейеры Tekton на AWS EKS Fargate

1 марта 2022 г.

Непрерывная доставка — это тяжелый бизнес! Особенно, если вы имеете дело с микросервисами. Хотя Jenkins довольно хорошо работает в масштабе, создавая своего рода общие библиотеки для обычных сборок, через некоторое время, когда вы запускаете SaaS на микросервисах, как мы в [Digité] (https://www.digite.com/) , управление сборками и инфраструктура CI/CD могут стать громоздкими. Мы рассматривали возможность перехода на [Tekton] (https://tekton.dev/) как для оптимизации использования Cloud Infra, так и для возможности легко писать и поддерживать конвейеры компакт-дисков.


Сказав это, блокируя две очень большие ВМ из-за того, что «что, если слишком много заданий выполняется параллельно?» не кажется мне естественным; поэтому я решил заставить Tekton работать в Fargate. Причиной использования Fargate является простота безсерверного решения, что позволяет нам сконцентрироваться на управлении нашими конвейерами CI/CD без необходимости управлять для этого инфраструктурой. Поэтому в этом посте я поделюсь своим опытом о том, как быстро настроить и запустить безсерверную инфраструктуру CI/CD для Tekton с помощью Terraform.


Настраивать


Начнем с создания модуля Terraform для установки Tekton на Fargate, вы можете обратиться к этой статье для создания базовой настройки кластера EKS Fargate. Предполагая, что у вас это есть, следующие шаги будут следующими.


Профили Fargate


Сначала мы создадим профиль Fargate для запуска Tekton, Tekton Dashboard и Tekton Triggers в пространстве имен tekton-pipelines.


``ямл


ресурс "aws_eks_fargate_profile" "tekton-dashboard-profile" {


имя_кластера = module.eks.id_кластера


fargate_profile_name = "tekton-dashboard-profile"


pod_execution_role_arn = модуль.eks.fargate_iam_role_arn


subnet_ids = module.vpc.private_subnets


селектор {


пространство имен = "тектон-трубопроводы"


метки = {


"app.kubernetes.io/part-of" = "tekton-dashboard",


"app.kubernetes.io/part-of" = "tekton-triggers"


depend_on = [module.eks]


теги = {


Среда = "${var.environment}"


Стоимость = "${var.cost_tag}"


Настройка EFS


EFS — рекомендуемый подход AWS, когда речь идет о подключении PV для узлов Fargate; следовательно, мы добавим конфигурацию EFS на следующих шагах.


Рекомендуется ограничить доступ EFS к VPC, на котором работает кластер EKS, и к вашей внутренней сети, чтобы пользователи, контролируемые IAM, могли получить к нему доступ через интерфейс командной строки AWS. Объявите группу безопасности с правилами Ingress для каждой подсети CIDR VPC, на которой работает EKS Fargate, чтобы ограничить доступ.


``ямл


модуль "efs-access-security-group" {


source = "terraform-aws-modules/security-group/aws"


версия = "4.3.0"


создать = правда


name = "efs-${var.cluster_title}-${var.environment}-группа безопасности"


description = "Группа безопасности для конвейера tekton EFS, созданная с помощью terraform"


vpc_id = модуль.vpc.vpc_id


ingress_with_cidr_blocks = [{ cidr_blocks = "172.18.1.0/24"


из_порта = 0


to_port = 2049


протокол = "TCP"


я = правда


cidr_blocks = "172.18.3.0/24"


из_порта = 0


to_port = 2049


протокол = "TCP"


я = правда


// Все CIDR подсети...


ingress_with_self = [{


из_порта = 0


to_port = 0


протокол = -1


я = правда


description = "Вход с собой"


выход_с_cidr_blocks = [{


cidr_blocks = "0.0.0.0/0"


из_порта = 0


to_port = 0


протокол = -1


Хотя Fargate автоматически устанавливает [драйвер EFS CSI] (https://docs.aws.amazon.com/eks/latest/userguide/efs-csi.html), нам все равно нужно объявить политику IAM для доступа к EFS кластера. . Вот как это сделать в нашем модуле Terraform


``ямл


ресурс "aws_iam_policy" "efs-csi-driver-policy" {


имя = "TektonEFSCSIDriverPolicy"


description = "Политика драйвера EFS CSI"


политика = jsonencode({


"Версия": "2012-10-17",


"Заявление" : [


«Эффект»: «Разрешить»,


"Действие" : [


"эластичная файловая система: Описать точки доступа",


«эластичная файловая система: Описать файловые системы»


"Ресурс": "*"


«Эффект»: «Разрешить»,


"Действие" : [


"эластичная файловая система: CreateAccessPoint"


"Ресурс": "*",


"Условие" : {


"StringLike": {


"aws:RequestTag/efs.csi.aws.com/cluster": "true"


«Эффект»: «Разрешить»,


«Действие»: «elasticfilesystem:DeleteAccessPoint»,


"Ресурс": "*",


"Условие" : {


"StringEquals": {


"aws:ResourceTag/efs.csi.aws.com/cluster": "true"


После этого мы определим IAM кластера для доступа к EFS. Сначала документ политики, в котором подробно описывается доступ к заявлениям политики для роли.


``ямл


данные "aws_iam_policy_document" "efs-iam-assume-role-policy" {


утверждение {


действия = ["sts:AssumeRoleWithWebIdentity"]


эффект = "Разрешить"


условие {


тест = "StringEquals"


переменная = "${replace(aws_iam_openid_connect_provider.tekton-main.url, "https://", "")}:sub"


значения = ["система:serviceaccount:tekton-pipelines:tekton-efs-serviceaccount"]


принципы {


идентификаторы = [aws_iam_openid_connect_provider.tekton-main.arn]


тип = "Федеративный"


зависит_от = [


aws_iam_policy.efs-csi-драйвер-политика


затем мы добавляем роль


``ямл


ресурс "aws_iam_role" "efs-service-account-iam-role" {


accept_role_policy = data.aws_iam_policy_document.efs-iam-assume-role-policy.json


name = "tekton-efs-service-account-role"


ресурс "aws_iam_role_policy_attachment" "efs-csi-driver-policy-attachment" {


роль = aws_iam_role.efs-service-account-iam-role.name


policy_arn = aws_iam_policy.efs-csi-driver-policy.arn


И затем мы сопоставляем его с учетной записью службы


``ямл


ресурс "kubernetes_service_account" "efs-service-account" {


метаданные {


имя = "tekton-efs-serviceaccount"


пространство имен = "тектон-трубопроводы"


метки = {


"app.kubernetes.io/name" = "tekton-efs-serviceaccount"


аннотации = {


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


"eks.amazonaws.com/role-arn" = aws_iam_role.efs-service-account-iam-role.arn


зависит_от = [


aws_iam_role_policy_attachment.efs-csi-driver-policy-attachment


ресурс "kubernetes_role" "efs-kube-role" {


метаданные {


имя = "efs-кубе-роль"


метки = {


"имя" = "efs-кубе-роль"


правило {


API_группы = [""]


ресурсы = ["persistentvolumeclaims", "persistentvolumes"]


глаголы = ["создать", "получить", "список", "обновить", "смотреть", "исправить"]


правило {


api_groups = ["", "хранилище"]


ресурсы = ["узлы", "модули", "события", "csidrivers", "csinodes", "csistoragecapacities", "storageclasses"]


глаголы = ["получить", "список", "смотреть"]


depend_on = [aws_iam_role_policy_attachment.alb-ingress-policy-attachment]


ресурс "kubernetes_role_binding" "efs-role-binding" {


зависит_от = [


kubernetes_service_account.efs-service-account


метаданные {


name = "tekton-efs-role-binding"


метки = {


"app.kubernetes.io/name" = "tekton-efs-role-binding"


role_ref {


api_group = "rbac.authorization.k8s.io"


вид = "Роль"


имя = "efs-кубе-роль"


тема {


вид = "Учетная запись службы"


имя = "tekton-efs-serviceaccount"


пространство имен = "тектон-трубопроводы"


Имея связанную учетную запись службы IAM, мы определим файловую систему EFS.


``ямл


ресурс "aws_efs_file_system" "eks-efs" {


create_token = "тектон-экс-эфс"


зашифровано = верно


теги = {


Имя = "тектон-экс-эфс"


Стоимость = var.cost_tag


зависит_от = [


kubernetes_role_binding.efs-привязка ролей


И его цели монтирования и класс хранения


``ямл


ресурс "aws_efs_mount_target" "eks-efs-private-subnet-mnt-target" {


количество = длина (module.vpc.private_subnets)


file_system_id = aws_efs_file_system.eks-efs.id


subnet_id = module.vpc.private_subnets[count.index]


security_groups = [module.efs-access-security-group.security_group_id]


ресурс "aws_efs_access_point" "eks-efs-tekton-точка доступа" {


file_system_id = aws_efs_file_system.eks-efs.id


корневая директория {


путь = "/ рабочая область"


создание_информация {


владелец_гид = 1000


владелец_uid = 1000


разрешения = 755


posix_user {


Гид = ​​1000


ИД = 1000


теги = {


Имя = "eks-efs-tekton-точка доступа"


Стоимость = var.cost_tag


Среда = "${var.environment}"


ресурс "kubernetes_storage_class" "eks-efs-storage-class" {


метаданные {


name = "eks-efs-storage-class"


storage_provisioner = "efs.csi.aws.com"


reclaim_policy = "Сохранить"


Обратите внимание на идентификаторы EFS и точек доступа в выходных данных terrafrom. При применении этих изменений они будут использоваться в определениях PV и PVC. Мои скрипты дали вывод


фс-8a7eXXXX::fsap-0f60de28766XXXXXX


Установка Тектона


С этого момента все довольно просто; следующая команда устанавливает Tekton


``` ударить


kubectl применить --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml


затем панель инструментов Tekton (установка только для чтения)


``` ударить


curl -sL https://raw.githubusercontent.com/tektoncd/dashboard/main/scripts/release-installer | \


bash -s -- установить последнюю -- только для чтения


или


``` ударить


kubectl применить --filename tekton-dashboard-readonly.yaml


После загрузки YAML только для чтения из [этой ссылки GitHub] (https://github.com/tektoncd/dashboard/releases).


Затем мы настраиваем постоянный том, ссылаемся на сгенерированные идентификаторы EFS из Terraform, запускаемые в вашем определении PV, вот пример для PV и PVC, которые будут использоваться задачей maven для запуска конвейера tekton.


``ямл


апиВерсия: v1


вид: персистентволуме


метаданные:


имя: поросенок-источник-pv


этикетки:


тип: поросенок-источник-pv


спецификация:


емкость:


хранилище: 1Gi


режимы доступа:


  • ЧитатьЗаписатьМного

персистентволумереклаймполици: сохранить


storageClassName: eks-efs-storage-class


Си Си:


драйвер: efs.csi.aws.com


дескриптор тома: fs-8a7e9a3d::fsap-0f60de28766b0e390


апиВерсия: v1


вид: Персистентволумеклаим


метаданные:


имя: поросенок-источник-пвх


спецификация:


селектор:


метки соответствия:


тип: поросенок-источник-pv


storageClassName: eks-efs-storage-class


режимы доступа:


  • ЧитатьЗаписатьМного

Ресурсы:


Запросы:


хранилище: 1Gi


Заключение


Хотя сама установка Tekton не меняется (вы, как всегда, используете команду kubectl apply), мы должны знать, как профили Fargate применяются для любых рабочих нагрузок, запускаемых на EKS Fargate, и тем самым подготавливать профиль Fargate с использованием существующего Tekton. аннотации в качестве селекторов, чтобы наши задачи могли выполняться на Fargate. Помимо этого, нам необходимо подготовить и настроить PV и PVC через EFS, чтобы задачи могли использовать их во время выполнения.


С их помощью у нас есть работающая установка Tekton поверх EKS Fargate с действительно способом запуска сборок по запросу и конвейерами CI/CD.


Также опубликовано [Здесь] (https://www.anadimisra.com/post/on-demand-ci-cd-with-serverless-tekton)



Оригинал
PREVIOUS ARTICLE
NEXT ARTICLE