Бессерверные конвейеры 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)
Оригинал