우노
[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 =
}
}
}
}
}
}
참고
'DevOps > Terraform' 카테고리의 다른 글
[Terraform] untaint란? (0) | 2023.05.22 |
---|---|
[Terraform] terraform import (0) | 2023.04.18 |
[Terraform] K8S Deployment Volume Mount (0) | 2023.03.30 |
[Terraform] Google Cloud Load Balancer(GCLB) 생성 (0) | 2023.03.18 |
[Terraform] provider "kubernetes” 선언 시 kubeconfig 파일 작성 방법 (0) | 2023.02.23 |
Comments