융무의 기술블로그
article thumbnail

테라폼을 활용해서 gke 클러스터를 생성하고 airflow helm차트를 배포해보려고 합니다.

코드는 아래서 확인 가능 합니다.

https://github.com/mjs1995/muse-data-engineer/blob/main/blog/gcp/gke_airflow.md


서비스 계정 생성 및 역할 부여

Service account 란 사용자를 대신하여 작업을 수행하는, 프로젝트에 연결된 Google 계정이며 이러한 Service account 에는 사용자와 동일한 방식으로 역할과 권한을 할당 할 수 있습니다.

  • 테라폼 명령을 실행하기 전에 아래 역할(Role)을 가지고 있는 Service account를 생성합니다.

terraform 코드 구조

cloudshell에서 github 저장소의 코드를 clone 합니다.

$ git clone https://github.com/mjs1995/gcp-de-pipeline.git

프로젝트의 구조는 다음과 같습니다.

terraform-airflow-gke/
│
├── main.tf
├── airflow.tf
├── variables.tf
└── terraform.tfvars
  • main.tf
    • 주요 Terraform 구성을 포함하며, GKE 클러스터 및 필요한 Google Cloud 리소스를 정의합니다.
    • Providers : Google Cloud, Helm, Kubernetes의 세 가지 provider가 정의되어 있습니다. 각각의 provider는 특정 서비스나 플랫폼과 Terraform 간의 연동을 담당합니다.
    • Resources : 여러 리소스들이 정의되어 있습니다. GKE 클러스터, 서비스 어카운트, GKE 노드 풀, Kubernetes 네임스페이스 및 Helm 차트 등이 포함됩니다.
  • airflow.tf
    • Airflow에 필요한 Kubernetes 및 Helm 리소스를 정의합니다. 예를 들어, Airflow의 Kubernetes 네임스페이스, Helm 차트 등이 포함됩니다.
  • variables.tf
    • 이 파일에는 여러 변수들이 정의되어 있습니다. 이 변수들은 사용자에게 입력을 받거나 기본값을 가질 수 있습니다. 예를 들어, 프로젝트 ID, 클러스터 이름, 노드 풀 설정 등에 사용됩니다.
  • terraform.tfvars
    • variables.tf에서 정의한 변수의 실제 값들을 이 파일에서 설정합니다. 예를 들어, 프로젝트 ID나 노드 풀의 크기 등을 지정할 수 있습니다.

terraform 코드 실행

이제 terraform plan을 실행하여 예상되는 변경사항을 확인하는 것입니다. 변경사항이 예상대로라면, terraform apply를 실행하여 인프라를 실제로 생성하거나 변경합니다.

테라폼 명령어에 관해서는 아래 포스팅을 참고하시면 좋을거 같습니다.

  • terraform plan: 이 명령은 Terraform이 실제로 어떤 작업을 할지를 보여줍니다. 이는 적용 전에 어떤 리소스가 생성, 수정, 삭제될 것인지 확인하기 위한 미리보기와 같습니다. 명령을 실행하면, Terraform은 계획한 변경사항을 출력합니다.
  • terraform apply: 이 명령은 실제로 인프라 변경을 수행합니다. 실행 시 변경사항을 확인하고 승인해야 합니다. 변경사항을 승인하면 Terraform은 리소스를 생성, 수정, 삭제하기 시작합니다.
  • terraform destroy: 테스트나 실습 후에 인프라 리소스를 모두 삭제하고 싶을 때 사용합니다. 이 명령을 실행하면 terraform apply로 생성한 모든 리소스를 삭제합니다.

Terraform 코드는 Terraform이 Kubernetes 리소스를 관리하기 위한 설정을 제공하며, 이와 별개로 kubectl이 올바른 kubeconfig 정보를 가지고 있어야 클러스터와 통신할 수 있습니다.

$ gcloud container clusters get-credentials my-gke-cluster --region=asia-northeast3

Airflow가 airflow 네임스페이스에 베포되었고 아래의 명령어로 파드의 상태를 확인합니다.

$ kubectl get pods -n airflow
NAME                                     READY   STATUS    RESTARTS   AGE
airflow-db-migrations-7c7976b4fb-hxqfb   1/1     Running   0          11m
airflow-flower-dd9c57f94-vsbrg           1/1     Running   0          11m
airflow-pgbouncer-7467bc948b-sbllf       1/1     Running   0          11m
airflow-postgresql-0                     1/1     Running   0          11m
airflow-redis-master-0                   1/1     Running   0          11m
airflow-scheduler-974b4d64f-z7sx2        2/2     Running   0          11m
airflow-sync-users-64b6585f95-qrlds      1/1     Running   0          11m
airflow-triggerer-5dbc7495fb-rlbhb       1/1     Running   0          11m
airflow-web-6d6759b8cf-5bcf7             1/1     Running   0          11m
airflow-worker-0                         2/2     Running   0          11m

이제 airflow-web 서비스를 통해 Airflow Web UI에 접근합니다.

$ kubectl port-forward svc/airflow-web -n airflow 8080:8080

패키지 검색

  • Airflow 웹 서버나 스케줄러의 파드에서 apache-airflow-providers-google 라이브러리가 설치되었는지 확인하려면 파드에 직접 접속해서 Python 패키지 목록에서 apache-airflow-providers-google를 검색합니다.
$ kubectl exec -it airflow-web-6d6759b8cf-5bcf7 -n airflow -- /bin/bash
Defaulted container "airflow-web" out of: airflow-web, check-db (init), wait-for-db-migrations (init)
airflow@airflow-web-6d6759b8cf-6h8rd:/opt/airflow$ pip list | grep apache-airflow-providers-google
apache-airflow-providers-google          10.2.0

[notice] A new release of pip is available: 23.1.2 -> 23.3
[notice] To update, run: python -m pip install --upgrade pip

helm 활용

  • helm list 명령을 사용하여 현재 클러스터에 설치된 모든 Helm release를 나열할 수 있습니다.
$ helm list -n airflow
NAME    NAMESPACE       REVISION        UPDATED                                STATUS   CHART           APP VERSION
airflow airflow         1               2023-10-18 15:02:06.51287727 +0000 UTC failed   airflow-8.8.0   2.6.3

특정 Helm release의 값을 확인할 수 있습니다.

$ kubectl get configmap -n airflow
NAME                   DATA   AGE
airflow-redis          3      43m
airflow-redis-health   6      43m
kube-root-ca.crt       1      4h39m

클러스터 삭제 시

gke 클러스터를 삭제할 때 현재 Terraform 상태 파일(terraform.tfstate)에 저장된 리소스의 목록을 표시합니다.

$ terraform state list
data.google_client_config.default
google_container_cluster.primary
helm_release.airflow
kubernetes_namespace.airflow


$ terraform state rm data.google_client_config.default
Removed data.google_client_config.default
Successfully removed 1 resource instance(s).

이 명령어는 현재 Terraform 상태 파일(terraform.tfstate)에 저장된 리소스의 목록을 표시합니다.

$ terraform state list

terraform state rm 명령어는 Terraform의 상태 파일에서 특정 리소스를 제거하는데 사용됩니다. 여기서는 data.google_client_config.default 리소스를 상태 파일에서 제거하고 있습니다.

$ terraform state rm data.google_client_config.default

현재 Terraform 코드와 실제 클라우드 환경의 리소스 상태를 비교하여 상태 파일을 최신 상태로 업데이트하려고 합니다.

terraform refresh
profile

융무의 기술블로그

@융무

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!