Замінюючи ArgoCD ApplicationSets на ArgoCD Applications та Terraform

Як інженер платформи, досягнення більшого з меншими витратами є ключовим принципом моєї роботи. ArgoCD ApplicationSets є потужним інструментом для керування Kubernetes інструментами в кількох кластерах, особливо коли вони комбінуються з генераторами списків або генераторами кластерів. Однак керування ApplicationSets за допомогою Terraform створює виклики, які можуть ускладнити процес розгортання. Ця стаття досліджує, як замінити ArgoCD ApplicationSets на стандартні ArgoCD Applications, використовуючи динамічні можливості Terraform для підтримки узгодженості та масштабованості в керованих кластерах.

Чому замінювати ApplicationSets на Applications?

Виклики з ApplicationSets та Terraform

  1. Обмежена підтримка Terraform: Налаштування ApplicationSets через Terraform часто не має достатньої підтримки для таких складних функцій, як генератори списків або генератори кластерів.
  2. Зайва складність: ApplicationSets додають абстракційний рівень, який може бути непотрібним, коли Terraform може безпосередньо керувати динамічними конфігураціями.

Переваги використання Applications

  1. Простота: ArgoCD Applications простіші в налаштуванні та управлінні за допомогою Terraform.
  2. Динамічні конфігурації: for_each та динамічні блоки Terraform дозволяють гнучкість, знижуючи надмірність.
  3. Управління станом: Файл стану Terraform ефективно відстежує розгортання, забезпечуючи узгодженість між кластерами.

Приклад використання: Розгортання Promtail в кластерах EKS

Сценарій

Ви керуєте кількома кластерами EKS і хочете розгорнути агент Promtail з узгодженими конфігураціями. Замість використання ApplicationSet ви використовуєте динамічні можливості Terraform для створення ArgoCD Application для кожного кластера.

Крок 1: Оголошення змінних Terraform

variable "managed_clusters" {  
 type = list(string)  
 default = ["cluster-1-endpoint", "cluster-2-endpoint"]  
}

З мого досвіду, запитування файлів стану Terraform для проєктів, які створили кластери, є більш надійним підходом.
Це мінімізує ризик помилок введення та забезпечує точність конфігурацій.

locals {  
 managed-clusters = {  
 cluster-1 = {  
 state_bucket = "cluster-1-tfstate"  
 state_key = "terraform/tfstate/cluster-1-eks-infra.tfstate"  
 state_region = "af-south-1"  
 }  
 cluster-2 = {  
 state_bucket = "cluster-2-tfstate"  
 state_key = "terraform/tfstate/cluster-2-eks-infra.tfstate"  
 state_region = "af-south-1"  
 }  
 }  
 clusters = {  
 for cluster, details in local.managed-clusters : cluster => {  
 remote_state = {  
 bucket = details.state_bucket  
 key = details.state_key  
 region = details.state_region  
 }  
 }  
 }  
# Узагальнити деталі кластерів для кожного кластера  
 cluster_details = {  
 for cluster, state in data.terraform_remote_state.clusters : cluster => {  
 eks_cluster_id = state.outputs.eks_cluster_id  
 eks_cluster_name = state.outputs.eks_cluster_name  
 server = state.outputs.eks_cluster_endpoint  
 }  
 }  

 server_urls = [  
 for cluster_name, details in local.cluster_details : details.server  
 ]  

}

Крок 2: Створення файлу даних Terraform

data "template_file" "argocd_promtail" {  
 for_each = local.cluster_details  
 template = file("${path.module}/monitoring/Application-promtail.yml")  

 vars = {  
 cluster_identifier = each.key  
 cluster_id = each.value.eks_cluster_id  
 server = each.value.server  
 namespace = "monitoring"  
 revision = "6.16.3"  
 pushUrl = "https://loki-gateway.cloudystack.co/loki/api/v1/push"  
 }  
}
apiVersion: argoproj.io/v1alpha1  
kind: Application  
metadata:  
 name: 'promtail-${cluster_identifier}'  
 namespace: argocd  
spec:  
 project: monitoring  
 source:  
 repoURL: "https://grafana.github.io/helm-charts"  
 chart: "promtail"  
 targetRevision: ${revision}  
 helm:  
 parameters:  
 - name: "config.clients[0].url"  
 value: ${pushUrl}  
 - name: "config.clients[0].backoff_config.min_period"  
 value: "500ms"  
 - name: "config.clients[0].backoff_config.max_period"  
 value: "10m"  
 - name: "config.clients[0].backoff_config.max_retries"  
 value: "0"  
 - name: "extraArgs[0]"  
 value: "--client.external-labels=environment=${cluster_identifier},cluster=${cluster_id}"  
 destination:  
 server: ${server}  
 namespace: ${namespace}   
 syncPolicy:  
 syncOptions:  
 - "CreateNamespace=true"  
 automated:  
 prune: true  
 selfHeal: true

Application-promtail.yml

Крок 3: Налаштування проєкту ArgoCD через Terraform

resource "kubernetes_manifest" "argocd_project_monitoring" {  
 manifest = {  
 apiVersion = "argoproj.io/v1alpha1"  
 kind = "AppProject"  
 metadata: {  
 name = "monitoring"  
 namespace = "argocd"  
 finalizers = ["resources-finalizer.argocd.argoproj.io"]  
 }  
 spec = {  
 description = "Проєкт для моніторингу застосунків"  
 sourceRepos = ["https://grafana.github.io/helm-charts"]  
 destinations = [  
 for server in local.server_urls : {  
 server = server  
 namespace = "*"  
 }  
 ]  
 clusterResourceWhitelist = [  
 {  
 group = "*"  
 kind = "*"  
 }  
 ]  
 namespaceResourceBlacklist = [  
 {  
 group = "*"  
 kind = "Event"  
 }  
 ]  
 }  
 }  
}

Крок 4: Налаштування ArgoCD застосунків через Terraform

resource "kubernetes_manifest" "promtail_app" {  
 for_each = local.cluster_details  
 manifest = yamldecode(data.template_file.argocd_promtail[each.key].rendered)  

 depends_on = [kubernetes_manifest.argocd_project_monitoring]  
}

Крок 5: Застосування конфігурації

GitHub — це моя улюблена платформа для зберігання коду, тому я використовую GitHub Actions для автоматичного застосування конфігурацій.
Більше деталей про мій підхід до використання GitHub Actions можна знайти в моїй попередній статті: Enhancing Cloud Security and Best Practices with Infrastructure as Code.

Для локального тестування ви можете виконати наступні команди:

terraform init  
terraform plan  
terraform apply

Переваги цього підходу

  • Покращена гнучкість: Налаштування розгортання для кожного кластера стає легшим завдяки змінним Terraform та циклам.
  • Полегшене відлагодження: Terraform надає чіткі журнали та відстеження стану, спрощуючи налагодження.
  • Консистентність між кластерами: Використання Terraform гарантує, що всі кластери підтримують консистентні конфігурації.

Заміна ArgoCD ApplicationSets на ArgoCD Applications, керовані Terraform, пропонує спрощений, гнучкий і надійний підхід до розгортання інструментів, таких як Promtail, на кількох кластерах Kubernetes. Хоча ApplicationSets мають своє місце, використання динамічних можливостей Terraform забезпечує консистентність і зменшує складність у керуванні середовищами з кількома кластерами.

Перекладено з: Replacing ArgoCD ApplicationSets with ArgoCD Applications and Terraform

Leave a Reply

Your email address will not be published. Required fields are marked *