– EKS 클러스터 내부 리소스까지 코드로 관리하는 법
Terraform으로 AWS 인프라를 구축할 때, EKS 클러스터는 aws provider를 통해 생성할 수 있습니다. 하지만 EKS 내부의 Kubernetes 리소스들(Namespace, ConfigMap, DaemonSet 등)은 kubernetes provider를 통해 따로 관리해야 합니다.
이번 포스팅에서는 Terraform의 kubernetes provider가 무엇인지, 왜 필요한지, 그리고 실무에서 어떻게 사용하는지를 정리합니다.
Kubernetes Provider란?
kubernetes provider는 Terraform이 기존 Kubernetes 클러스터 내부의 리소스를 코드로 선언하고 관리할 수 있게 해주는 플러그인입니다.
예를 들어
- aws_eks_cluster → EKS 클러스터 자체를 생성
- kubernetes_namespace → 그 클러스터 안에 네임스페이스 생성
- kubernetes_config_map, kubernetes_deployment → 클러스터 내부 워크로드 생성
기본 구성 예시
provider "kubernetes" {
host = "<Kubernetes API Endpoint>"
cluster_ca_certificate = base64decode("<CA 인증서>")
token = "<접근 토큰>"
}
이 구성은 kubectl이 클러스터에 접근하는 원리와 같습니다.
EKS에서 안전하게 사용하는 방식
EKS는 IAM 기반 인증을 사용하므로, Terraform에서는 aws_eks_cluster_auth 데이터를 활용해 임시 토큰을 가져와야 합니다.
# EKS 클러스터 정보 불러오기 (remote state)
data "terraform_remote_state" "eks" {
backend = "local" # 또는 "s3"
config = {
path = "../02.AWS_EKS/terraform.tfstate"
}
}
# 클러스터 인증 토큰 생성
data "aws_eks_cluster_auth" "main" {
name = data.terraform_remote_state.eks.outputs.cluster_name
}
# Kubernetes Provider 설정
provider "kubernetes" {
host = data.terraform_remote_state.eks.outputs.cluster_endpoint
cluster_ca_certificate = base64decode(data.terraform_remote_state.eks.outputs.cluster_certificate_authority_data)
token = data.aws_eks_cluster_auth.main.token
}
주요 리소스 예시
resource "kubernetes_namespace" "logging" {
metadata {
name = "logging"
}
}
resource "kubernetes_config_map" "fluentbit_config" {
metadata {
name = "fluent-bit-config"
namespace = kubernetes_namespace.logging.metadata[0].name
}
data = {
"fluent-bit.conf" = <<EOF
@INCLUDE inputs.conf
@INCLUDE filters.conf
@INCLUDE outputs.conf
EOF
}
}
⚠️ 주의할 점
| 항목 | 설명 |
| 인증 실패 | Provider 설정이 없으면 localhost:80에 연결 시도하며 실패 (No connection could be made...) |
| helm provider와 다름 | Helm chart 설치용 helm provider와 Kubernetes 리소스용 kubernetes provider는 별도로 설정 필요 |
| 여러 클러스터 지원 | provider "kubernetes" { alias = "prod" }처럼 별도 alias로 멀티 클러스터 관리 가능 |
정리
Terraform의 kubernetes provider는 EKS 등 클라우드에 구성된 Kubernetes 클러스터 안의 리소스를 선언적으로 관리하는 데 꼭 필요한 구성 요소입니다. 특히 실무에서는 terraform_remote_state와 함께 연동하여 EKS 외부에서 내부 리소스를 안전하게 배포하는 방식이 많이 쓰입니다.
EKS를 구성하고 Fluent Bit, Prometheus, ArgoCD 등의 Helm chart를 설치하거나 K8s 리소스를 선언하고 싶다면, 반드시 kubernetes provider를 명시적으로 설정해 주세요.
댓글