k8s환경에 Terraform을 사용하여 Istio와 Kiali 설치
Kind Cluster Native K8s 환경에 Terraform, Istio, Kiali 구성 (단계별 명령어)
Kind 클러스터로 생성한 Kubernetes 환경에 Terraform을 사용하여 Istio와 Kiali를 설치하는 방법을 단계별로 설명합니다.
전제 조건:
- Windows 11 WSL Ubuntu 환경: 이미 구성되어 있어야 합니다 (이전 답변 참조).
- Kind: 설치되어 있어야 합니다 (이전 답변 참조).
- kubectl: 설치되어 있어야 합니다 (일반적으로 Kind 설치 시 자동 설치).
- curl, unzip: Ubuntu 환경에 설치되어 있어야 합니다 (sudo apt install curl unzip).
단계 1: Kind 클러스터 생성 (이미 있는 경우 생략 가능)
Kind 클러스터가 아직 없다면 다음 명령어로 생성합니다.
kind create cluster
클러스터 이름 확인:
kind get clusters
생성된 클러스터가 kind 라는 이름으로 존재하는지 확인합니다.
단계 2: Terraform 설치
Terraform을 Ubuntu 환경에 설치합니다.
# Terraform Download URL (최신 버전 확인: https://www.terraform.io/downloads)
TERRAFORM_VERSION="1.6.6" # 예시 버전, 최신 버전으로 변경 가능
TERRAFORM_URL="https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip"
# 다운로드 및 압축 해제
curl -LO $TERRAFORM_URL
unzip terraform_${TERRAFORM_VERSION}_linux_amd64.zip
# 실행 파일 이동 및 권한 설정
sudo mv terraform /usr/local/bin/
chmod +x /usr/local/bin/terraform
# 설치 확인
terraform -v
단계 3: Terraform Kubernetes Provider 설정
Terraform이 Kubernetes 클러스터와 통신하기 위해 Kubernetes Provider를 설정해야 합니다.
- kubeconfig 파일 생성: Kind 클러스터의 kubeconfig 파일을 현재 디렉토리에 생성합니다.
kubectl config view --raw > kubeconfig.yaml
- Terraform 설정 파일 (main.tf) 생성: 텍스트 편집기 (nano, vim 등)를 사용하여 main.tf 파일을 생성하고 다음 내용을 입력합니다.
- kubeconfig.yaml 파일 경로를 정확하게 지정해야 합니다.
- kubernetes 및 helm provider 버전을 최신 버전으로 확인하여 설정하는 것이 좋습니다. Terraform Registry 및 Terraform Registry Helm Provider 에서 최신 버전을 확인할 수 있습니다.
terraform { required_providers { kubernetes = { source = "hashicorp/kubernetes" version = "~> 2.0" # Kubernetes Provider 버전 (최신 버전 권장) } helm = { source = "hashicorp/helm" version = "~> 2.0" # Helm Provider 버전 (최신 버전 권장) } } } provider "kubernetes" { config_path = "kubeconfig.yaml" # kubeconfig 파일 경로 } provider "helm" { kubernetes { config_path = "kubeconfig.yaml" # Helm Provider도 동일한 kubeconfig 사용 } }
단계 4: Istio 설치를 위한 Terraform 설정 추가 (main.tf 수정)
main.tf 파일에 Istio 설치를 위한 Helm Chart 리소스를 추가합니다.
terraform {
# ... (이전 provider 설정 유지)
}
provider "kubernetes" {
# ... (이전 provider 설정 유지)
}
provider "helm" {
# ... (이전 provider 설정 유지)
}
resource "helm_release" "istio" {
name = "istio"
namespace = "istio-system"
create_namespace = true # istio-system 네임스페이스 자동 생성
repository = "https://istio-release.storage.googleapis.com/charts"
chart = "istiod"
version = "1.20.0" # Istio 버전 (최신 버전 또는 원하는 버전으로 변경)
values = [ # <-- Replaced set_values with values
yamlencode({ # <-- Using yamlencode to format values
profile = "default"
})
]
}
- name: Helm Release 이름 (Terraform에서 관리할 이름)
- namespace: Istio를 설치할 네임스페이스 (istio-system 권장)
- create_namespace = true: istio-system 네임스페이스가 없으면 자동으로 생성합니다.
- repository: Istio Helm Chart 저장소 URL
- chart: 설치할 Helm Chart 이름 (istiod - Istio control plane)
- version: Istio 버전 (최신 버전 또는 원하는 버전 지정). Istio Releases 에서 최신 버전을 확인할 수 있습니다.
- set_values: Helm Chart 값 설정. profile = "default"는 기본적인 Istio 기능을 활성화하는 프로필입니다. 다른 프로필 (minimal, demo 등) 또는 사용자 정의 설정을 사용할 수 있습니다. Istio Profiles 참고.
단계 5: Kiali 설치를 위한 Terraform 설정 추가 (main.tf 수정)
main.tf 파일에 Kiali 설치를 위한 Helm Chart 리소스를 추가합니다.
terraform {
# ... (이전 provider 설정 유지)
}
provider "kubernetes" {
# ... (이전 provider 설정 유지)
}
provider "helm" {
# ... (이전 provider 설정 유지)
}
resource "helm_release" "istio" {
# ... (이전 Istio 설정 유지)
}
resource "helm_release" "kiali" {
name = "kiali"
namespace = "kiali-system"
create_namespace = true # kiali-system 네임스페이스 자동 생성
repository = "https://kiali.org/helm-charts"
chart = "kiali-server"
version = "2.0.0" # Kiali 버전 (최신 버전 또는 원하는 버전으로 변경)
values = [ # <-- set_values 대신 values 사용, 리스트 형태로 값 전달
yamlencode({ # <-- yamlencode 함수를 사용하여 YAML 형태로 값 전달
ingress = {
enabled = true
hosts = ["kiali.local"]
}
})
]
}
- name: Helm Release 이름 (Terraform에서 관리할 이름)
- namespace: Kiali를 설치할 네임스페이스 (kiali-system 권장)
- create_namespace = true: kiali-system 네임스페이스가 없으면 자동으로 생성합니다.
- repository: Kiali Helm Chart 저장소 URL
- chart: 설치할 Helm Chart 이름 (kiali-server)
- version: Kiali 버전 (최신 버전 또는 원하는 버전 지정). Kiali Releases 에서 최신 버전을 확인할 수 있습니다.
- set_values: Helm Chart 값 설정.
- ingress.enabled = true: Kiali UI 접근을 위한 Ingress를 활성화합니다.
- ingress.hosts = ["kiali.local"]: Ingress Host를 kiali.local 로 설정합니다. 이 Host로 Kiali UI에 접근할 수 있습니다. 필요에 따라 변경 가능하며, 로컬 환경에서는 hosts 파일 설정이 필요할 수 있습니다 (다음 단계에서 설명).
단계 6: Terraform 초기화 및 적용
Terraform 설정을 초기화하고 적용하여 Istio와 Kiali를 설치합니다.
terraform init # Terraform 초기화 (Provider 다운로드 등)
terraform plan # Terraform 실행 계획 확인 (실제 변경 사항 미리보기)
terraform apply -auto-approve # Terraform 적용 (자동 승인)
- terraform init: Terraform 설정 파일 (main.tf)을 분석하고 필요한 Provider (kubernetes, helm)를 다운로드합니다.
- terraform plan: Terraform이 실제로 클러스터에 적용할 변경 사항을 미리 보여줍니다. 계획을 검토하고 예상대로 작동하는지 확인하는 것이 좋습니다.
- terraform apply -auto-approve: Terraform 계획을 실제로 클러스터에 적용합니다. -auto-approve 옵션은 적용 전에 사용자 승인을 묻지 않고 자동으로 적용합니다. 프로덕션 환경에서는 -auto-approve 없이 terraform apply 명령어를 사용하는 것을 권장합니다.
단계 7: Istio 및 Kiali 설치 확인
Istio와 Kiali가 정상적으로 설치되었는지 확인합니다.
- Istio Pod 확인: istio-system 네임스페이스의 Pod들이 Running 상태인지 확인합니다.istiod 및 기타 Istio 컴포넌트 Pod들이 Running 상태여야 합니다.
kubectl get pods -n istio-system
- Kiali Pod 확인: kiali-system 네임스페이스의 Pod들이 Running 상태인지 확인합니다.kiali-server Pod가 Running 상태여야 합니다.
kubectl get pods -n kiali-system
- Kiali Ingress 확인 및 접근 (Ingress 활성화 시):
- Ingress 상태 확인:Ingress가 생성되었는지 확인합니다. HOSTS 컬럼에 kiali.local (또는 설정한 Host)이 나타나야 합니다.
kubectl get ingress kiali -n kiali-system
- hosts 파일 수정 (로컬 환경): kiali.local Host를 로컬 머신에서 Kind 클러스터 Ingress Controller IP 주소로 연결해야 합니다.
- Ingress Controller IP 확인:(Ingress Controller가 ingress-nginx 네임스페이스에 설치되어 있다고 가정합니다. 다른 Ingress Controller를 사용하는 경우 해당 네임스페이스 및 서비스 이름으로 변경)
- 만약 ingress-nginx-controller 서비스에 외부 IP가 할당되지 않았다면, Kind 클러스터 환경에서는 일반적으로 localhost 또는 WSL 호스트 IP (Windows IP)를 사용해야 할 수 있습니다. kubectl get nodes -o wide 명령어로 노드 IP를 확인하거나, WSL 호스트 IP를 사용하는 것을 시도해 볼 수 있습니다.
kubectl get service ingress-nginx-controller -n ingress-nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}'
- hosts 파일 수정 (Windows):
<Ingress Controller IP 또는 localhost 또는 WSL 호스트 IP> kiali.local
- 관리자 권한으로 메모장 등을 실행하여 C:\Windows\System32\drivers\etc\hosts 파일을 열고 다음 줄을 추가합니다.
- Kiali UI 접근: 웹 브라우저에서 http://kiali.local 로 접속합니다. Kiali UI가 나타나면 성공입니다.
- Ingress 상태 확인:Ingress가 생성되었는지 확인합니다. HOSTS 컬럼에 kiali.local (또는 설정한 Host)이 나타나야 합니다.
- Port-forwarding (Ingress 미활성화 시 또는 hosts 파일 수정 없이 접근):
kubectl port-forward service/kiali -n kiali-system 20001:20001
- Ingress를 활성화하지 않았거나 hosts 파일 수정 없이 Kiali UI에 접근하려면 kubectl port-forward 명령어를 사용할 수 있습니다.
단계 8: (선택 사항) Terraform으로 삭제
Terraform으로 설치한 Istio와 Kiali를 삭제하려면 다음 명령어를 실행합니다.
terraform destroy -auto-approve
삭제 후에는 kind delete cluster 명령어로 Kind 클러스터를 삭제할 수 있습니다 (필요한 경우).
주의 사항:
- 버전 관리: Istio, Kiali, Terraform Provider 버전은 예시이며, 최신 버전 또는 원하는 버전으로 변경할 수 있습니다. 버전 호환성을 고려하여 선택해야 합니다.
- Ingress 설정: Kiali Ingress 설정은 기본적인 예시입니다. 실제 환경에서는 도메인, TLS/SSL 인증서, Ingress Controller 설정 등을 적절하게 구성해야 합니다.
- 리소스 요구 사항: Istio와 Kiali는 리소스를 많이 사용하는 서비스입니다. Kind 클러스터에 충분한 리소스 (CPU, 메모리)가 할당되어 있는지 확인해야 합니다.
- 오류 처리: Terraform 실행 중 오류가 발생하면 오류 메시지를 확인하고, 설정 파일 (main.tf) 및 환경 설정을 다시 확인해야 합니다. Terraform Plan 결과를 자세히 살펴보는 것도 도움이 됩니다.
이 가이드에 따라 Kind 클러스터에 Terraform, Istio, Kiali를 성공적으로 구성하시기를 바랍니다.