k8s

k8s환경에 Terraform을 사용하여 Istio와 Kiali 설치

자바바라 2025. 2. 16. 23:39

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를 설정해야 합니다.

  1. kubeconfig 파일 생성: Kind 클러스터의 kubeconfig 파일을 현재 디렉토리에 생성합니다.
    kubectl config view --raw > kubeconfig.yaml
  2. Terraform 설정 파일 (main.tf) 생성: 텍스트 편집기 (nano, vim 등)를 사용하여 main.tf 파일을 생성하고 다음 내용을 입력합니다.
    • kubeconfig.yaml 파일 경로를 정확하게 지정해야 합니다.
    • kuberneteshelm provider 버전을 최신 버전으로 확인하여 설정하는 것이 좋습니다. Terraform RegistryTerraform 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가 정상적으로 설치되었는지 확인합니다.

  1. Istio Pod 확인: istio-system 네임스페이스의 Pod들이 Running 상태인지 확인합니다.istiod 및 기타 Istio 컴포넌트 Pod들이 Running 상태여야 합니다.
    kubectl get pods -n istio-system
  2. Kiali Pod 확인: kiali-system 네임스페이스의 Pod들이 Running 상태인지 확인합니다.kiali-server Pod가 Running 상태여야 합니다.
    kubectl get pods -n kiali-system
  3. 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
        <Ingress Controller IP 또는 localhost 또는 WSL 호스트 IP> 부분에 위에서 확인한 IP 주소 또는 127.0.0.1 (localhost) 또는 WSL 호스트 IP를 입력합니다.
      • 관리자 권한으로 메모장 등을 실행하여 C:\Windows\System32\drivers\etc\hosts 파일을 열고 다음 줄을 추가합니다.
    • Kiali UI 접근: 웹 브라우저에서 http://kiali.local 로 접속합니다. Kiali UI가 나타나면 성공입니다.
  4. Port-forwarding (Ingress 미활성화 시 또는 hosts 파일 수정 없이 접근):
    kubectl port-forward service/kiali -n kiali-system 20001:20001
    새로운 터미널 창을 열고 위 명령어를 실행합니다. 그 다음 웹 브라우저에서 http://localhost:20001/kiali 로 접속합니다.
  5. 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를 성공적으로 구성하시기를 바랍니다.