Як автоматизувати Terraform завдяки GitOps?

Дебати на тему «IaC проти GitOps» можна залишити в минулому. Ми знаємо, що поєднає ці два світи та допоможе вам користуватися перевагами GitOps для Terraform. Заінтригували? Тоді спойлер: контролер Terraform.

Як керувати ресурсами Terraform за допомогою GitOps? А головне, навіщо?

Вйо розбиратися 👇

Передісторія: чому не CI/CD чи Terraform Cloud?

Найпоширенішим підходом до автоматизації Terraform є конвеєри CI/CD або Terraform Cloud. Використання конвеєрів тут працює добре, але зазвичай призводить до необхідності копіювати визначення конвеєрів. Знову і знову. 

Так, тут є свої рішення, і ви можете написати їх у коментарях. А зараз в гру вступає контролер Terraform.

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

У Terraform Cloud є багато функцій, які збігаються з використанням робочого процесу GitOps, тому TF контролер не виключає його. Ви можете використовувати Terraform Cloud як серверну частину для свого розгортання, лише автоматизуючи запуски через TF контролер.

Terraform контролер: що це та як працює? 

Контролер Terraform — це контролер Flux, який може керувати вашими ресурсами Terraform. 

Він має кілька функцій, включаючи можливість затвердження планів Terraform (вручну або автоматично). Вихідні дані Terraform можна встановити як секрет Kubernetes. TF контролер також інтегрований з Terraform Cloud та Terraform Enterprise.

Перевага TF контролера у тому, що ви можете скористатися GitOps для наявних ресурсів Terraform. Його можна використовувати як сполучник для ресурсів Terraform і робочих навантажень Kubernetes.

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

  • Модель автоматизації GitOps: тут ви використовуєте GitOps для своїх ресурсів Terraform. Від етапів надання до етапів примусового виконання, наприклад, цілого кластера EKS.
  • Гібридна модель автоматизації GitOps: тут ви використовуєте GitOps для наявних інфраструктурних ресурсів. Наприклад, у вас є кластер EKS. Ви можете вибрати для GitOps лише його групу вузлів або групу безпеки.

Якщо у вас є TFSTATE файл, ви можете використовувати GitOps, щоб:

  • Примусово застосувати стан (без додаткових змін).
  • Виявити дрейф (щоб вирішити, що робити пізніше, коли він станеться).

І це ще не все: планування, затвердження вручну та інші функції знайдете на дорожній карті.

Тепер перейдімо до практичної інтеграції 👇

Робимо GitOps вашому Terraform у 3 кроки

Крок 1.

Очевидно, вам знадобиться кластер Kubernetes і встановлений Flux. Terraform Controller потребує принаймні Flux 0.32. Він вимагає принаймні Kubernetes версії 1.20.6. Використовуйте flux install або flux bootstrap, як описано в  документації Flux.

Крок 2.

Тепер вам потрібно встановити Terraform Controller. Є багато способів зробити це, ознайомтеся з документацією встановлення, щоб отримати більше інфи. 

Один дуже простий спосіб зробити це — додати HelmRelease до вашого початкового репозиторію.

Крок 3.

Об’єднуємо ваші ресурси Terraform.

І тут проявляється вся краса контролера Terraform — він виконує всю важку роботу за вас. Все, що вам потрібно зробити:

  • Визначити джерело ваших ресурсів Terraform
  • Увімкнути автоматизацію GitOps
Крок. 3.1

Визначаємо джерело. Ви можете вибрати будь-який із GitRepository, Bucket, OCIRepository. 

Запис GitRepository може виглядати так:

apiVersion: source.toolkit.fluxcd.io/v1beta1
kind: GitRepository
metadata:
  name: helloworld
  namespace: flux-system
spec:
  interval: 30s
  url: https://github.com/tf-controller/helloworld
  ref:
    branch: main
Крок. 3.2

Режим автоматизації GitOps. Його можна ввімкнути, встановивши .spec.approvePlan=auto. У цьому режимі ресурси Terraform будуть заплановані та автоматично застосовуватися. Ось простий приклад, який можна просто скопіювати та вставити:

apiVersion: infra.contrib.fluxcd.io/v1alpha1
kind: Terraform
metadata:
  name: helloworld
  namespace: flux-system
spec:
  interval: 1m
  approvePlan: "auto"
  path: ./
  sourceRef:
    kind: GitRepository
    name: helloworld
    namespace: flux-system

Примітка. Якщо у вас є файл kustomization.yaml, переконайтеся, що ви додали файли (в яких знаходяться зазначені вище частини маніфесту) до списку ресурсів.

Щойно ви зафіксуєте це в Git, побачите, як Terraform Controller швидко все підхопить. Ось один зі способів підтвердження:

kubectl -n flux-system get terraforms.infra.contrib.fluxcd.io

NAME READY STATUS AGE

helloworld True No drift:
main/d9c5cc348e555526ea563fb82fc901e37de4d732 1m

Це все. Просто, чи не так?

Післяслово

Команда Terraform Controller забезпечила підтримку розповсюджених випадків використання. Вище ми розглянули лише режим автоматизації, але це ж не межа. 

Деяким командам може знадобитися більше контролю, тому також є режим «планування та застосування вручну». Ви також можете налаштувати його, щоб виконувати лише «виявлення дрейфу».

Щобільше, ви можете вимкнути виявлення дрейфу в TF контролері, використовувати його з AWS EKS IRSA, взаємодіяти з Terraform, налаштовувати перевірки працездатності та багато іншого. 

Шанувальникам OCI будуть раді почути, що TF контролер також підтримує артефакти OCI як джерело.

Контролер також інтегрований із Terraform Cloud і Terraform Enterprise .

Зараз Terraform Controller має широкі можливості масштабування, щоб одночасно узгоджувати та надавати велику кількість модулів Terraform. До слова, команда вже випробувала контролер із 1 500 модулями Terraform.

І найцікавіше ще попереду.

Хочете більше автоматизації, моніторингу, оркестрування…? В ITEDU є курси, що допоможуть стати справжнім гуру DevOps 😏

Зауваження, побажання та пропозиції лишайте в коментарях. 

Нехай прибуде з вами сила автоматизації ✌️

Залишити відповідь

Дякуємо, що поділились