오늘의 인기 글
최근 글
최근 댓글
Today
Total
05-20 11:35
관리 메뉴

우노

[Terraform] Google Service Account와 GKE Kubernetes Service Account 매핑 본문

DevOps/Terraform

[Terraform] Google Service Account와 GKE Kubernetes Service Account 매핑

운호(Noah) 2023. 4. 2. 17:40

들어가기 앞서,

  • Google Kubernetes Engine(이하 GKE)에서 동작하는 애플리케이션들이 다양한 Google Cloud 서비스에 접근하기 위해선,
  • GKE가 Google Cloud 서비스 접근 권한을 가지고 있어야합니다.
  • 따라서 일반적으로는, Google Cloud 서비스 접근에 필요한 Role이 할당되어 있는 Google Service Account를 생성한 뒤,
  • 쿠버네티스 RBAC(Role-based Access Control)를 위한 Kubernetes Service Account에 Google Service Account를 매핑해서 사용되고 있습니다.
  • 따라서 해당 포스트에선, Terraform을 사용해 Google Service Account를 생성하고,
  • Google Service Account와 GKE Kubernetes Service Account를 매핑하는 방법에 대해서 다뤄보겠습니다.

Google Service Account 생성

  • 먼저, 특정 Google Cloud 서비스 접근 권한을 가진 Service Account를 생성합니다.

      resource "google_service_account" "apps_service_account" {
        account_id = "apps"
        display_name = ""
        description = ""
      }
    
      resource "google_project_iam_member" "apps_service_account_attached_roles" {
        project = ""
        role = ""
        member = "serviceAccount:${google_service_account.apps_service_account.email}"
      }

Google Service Account와 Kubernetes Service Account를 매핑

# Google Service Account에 부여된 권한을 이용할 수 있는 Kubernetes Service Account 생성
resource "kubernetes_service_account" "gke_ksa" {
  metadata {
    name = "gke-ksa"
    namespace = "test"
    annotations = {
      "iam.gke.io/gcp-service-account" = google_service_account.apps_service_account.email
      # ex) "iam.gke.io/gcp-service-account" = "???@???.???.???"
    }
  }
}

# Google Service Account와 Kubernetes Service Account를 매핑
resource "google_service_account_iam_member" "gke_ksa_mapping" {
  member             = "serviceAccount:${var.project_id}.svc.id.goog[${kubernetes_service_account.gke_ksa.metadata[0].namespace}/${kubernetes_service_account.gke_ksa.metadata[0].name}]"
  # ex) member             = "serviceAccount:${GCP 프로젝트 ID}.svc.id.goog[${생성할 KSA의 네임스페이스}/${생성할 KSA 이름}]"

  role               = "roles/iam.workloadIdentityUser"

  service_account_id = google_service_account.apps_service_account.id
  # ex) service_account_id = projects/${GCP 프로젝트 ID}/serviceAccounts/${GCP Service Account 이메일}
}

K8S Deployment 생성 시 Kubernetes Service Account 할당

resource "kubernetes_deployment" "k8s_deploy" {
    metadata {
      name =
      namespace =
      labels = {
        app =
      }
    }
    spec {
      replicas =
      selector {
        match_labels = {
          app =
        }
      }
      template {
        metadata {
          labels = {
            app =
          }
        }
        spec {
          service_account_name = kubernetes_service_account.gke_ksa.metadata[0].name

          container {
            name =
            image =

            port {
              container_port =
              protocol =
            }
          }
        }
      }
    }
  }

참고

Comments