티스토리 뷰

카테고리 없음

Istio + Kiali by Terraform

자바바라 2025. 2. 16. 22:31

Kind 클러스터 (Native Kubernetes) 환경에서 Terraform을 사용하여 Istio와 Kiali를 구성하는 단계별 명령어 가이드입니다.

전제 조건:

  • Kind 클러스터가 이미 생성되어 실행 중이어야 합니다. (이전 답변의 Kind 설치 및 클러스터 생성 방법 참고)
  • kubectl이 Kind 클러스터에 연결되어 있어야 합니다. (kubectl config current-context로 확인)
  • Terraform이 설치되어 있어야 합니다. (Terraform 공식 사이트에서 다운로드 및 설치: https://developer.hashicorp.com/terraform/downloads)
  • git 설치가 되어 있어야 합니다.

1단계: Istio 설치를 위한 Terraform Provider 및 리소스 정의

  • 프로젝트 디렉토리 생성:
    mkdir istio-kiali-terraform
    cd istio-kiali-terraform
  • main.tf 파일 생성: (Terraform 구성 파일)
    • 설명:
      • required_providers: Terraform에서 사용할 Kubernetes 및 Helm provider를 정의합니다.
      • provider "kubernetes": Kubernetes 클러스터에 연결하기 위한 설정을 합니다. config_pathkubectl이 사용하는 kubeconfig 파일을 가리킵니다 (Kind 클러스터 생성 시 자동으로 설정됨).
      • provider "helm": Helm을 사용하여 Istio를 설치하기 위한 설정을 합니다.
      • resource "kubernetes_namespace" "istio_system": Istio 구성 요소를 설치할 istio-system 네임스페이스를 생성합니다.
      • resource "helm_release" "istio_base": Istio의 기본 CRD(Custom Resource Definitions)를 설치합니다.
      • resource "helm_release" "istiod": Istio의 핵심 구성 요소인 istiod (Istio control plane)를 설치합니다.
        • depends_on: istiodistio_base 설치 후에 설치되도록 의존성을 설정합니다.
        • global.hub, global.tag: Istio 이미지의 Docker Hub와 태그를 지정합니다 (필요에 따라 변경 가능).
          terraform {
            required_providers {
              kubernetes = {
                source  = "hashicorp/kubernetes"
                version = ">= 2.0.0"
              }
              helm = {
                source = "hashicorp/helm"
                version = ">= 2.0.0"
              }
            }
          }
          
          provider "kubernetes" {
            config_path = "~/.kube/config" # kubectl config 파일 경로 (Kind 클러스터에 맞게 자동 설정됨)
          }
          
          provider "helm" {
            kubernetes {
              config_path = "~/.kube/config"
            }
          }
          
          # Istio namespace 생성
          resource "kubernetes_namespace" "istio_system" {
            metadata {
              name = "istio-system"
            }
          }
          # Istio base 설치 (Helm chart 사용)
          resource "helm_release" "istio_base" {
            name       = "istio-base"
            repository = "https://istio-release.storage.googleapis.com/charts"
            chart      = "base"
            namespace  = kubernetes_namespace.istio_system.metadata[0].name
            version = "1.20.0"  # 사용할 Istio 버전 지정. 필요시 변경
          }
          
          # Istiod 설치 (Helm chart 사용)
          resource "helm_release" "istiod" {
            name       = "istiod"
            repository = "https://istio-release.storage.googleapis.com/charts"
            chart      = "istiod"
            namespace  = kubernetes_namespace.istio_system.metadata[0].name
            version = "1.20.0"  # 사용할 Istio 버전. istio-base와 동일하게.
             wait = true # istio-base 설치가 완료될 때 까지 기다림.
          
            set {
              name  = "global.hub"
              value = "docker.io/istio"  # 필요에 따라 Docker Hub 변경
            }
            set {
              name = "global.tag"
              value = "1.20.0"   # Istio 이미지 태그
            }
              depends_on = [helm_release.istio_base]
          
          }
  • Terraform 초기화 및 적용:
    • -auto-approve: 확인 프롬프트 없이 변경 사항을 자동으로 적용합니다.
      terraform init
      terraform apply -auto-approve

2단계: Istio 설치 확인

kubectl get pods -n istio-system
kubectl get svc -n istio-system

istiod 파드와 서비스가 Running 상태인지 확인합니다.

 

3단계: Kiali 설치 (Helm 사용)

  • kiali.tf 파일 생성 (또는 main.tf에 추가)
    • 설명:
      • resource "helm_release" "kiali": Kiali Helm 차트를 사용하여 Kiali를 설치합니다.
      • repository: Kiali Helm 차트 저장소 URL입니다.
      • version : Kiali version 지정.
      • deployment.ingress.enabled: Kiali Ingress를 활성화합니다.
      • deployment.ingress.override_yaml: Istio Ingress를 사용하여 Kiali에 접근할 수 있도록 Ingress 리소스를 정의합니다. kubernetes.io/ingress.class: "istio"는 Istio Ingress 컨트롤러를 사용하도록 지정합니다. /kiali 경로를 통해 Kiali에 접근할 수 있습니다.
      • depends_on: Kiali가 Istio 설치 후에 설치되도록 의존성을 설정합니다.
        # Kiali 설치 (Helm chart 사용)
        resource "helm_release" "kiali" {
          name       = "kiali"
          repository = "https://kiali.org/helm-charts"
          chart      = "kiali-server"
          namespace  = kubernetes_namespace.istio_system.metadata[0].name
          version    = "v1.78.0"  # Kiali 버전. Istio 버전에 호환되는 버전 사용 권장.
          wait = true
          set {
            name  = "deployment.ingress.enabled"
            value = "true"
          }
          set {
            name  = "deployment.ingress.override_yaml"
            value = <<YAML
        apiVersion: networking.k8s.io/v1
        kind: Ingress
        metadata:
          name: kiali
          annotations:
            kubernetes.io/ingress.class: "istio" # istio ingress 사용
        spec:
          rules:
          - http:
              paths:
              - path: /kiali
                pathType: Prefix
                backend:
                  service:
                    name: kiali
                    port:
                      number: 20001
        YAML
          }
        
           depends_on = [helm_release.istiod]
        }
  • Terraform 적용:
    terraform apply -auto-approve

4단계: Kiali 설치 확인 및 접속

  • 설치 확인:
    kubectl get pods -n istio-system -l app=kiali
    kubectl get svc -n istio-system -l app=kiali
    Use code with caution.Bash
  • 포트 포워딩 (임시): (Ingress를 통하지 않고 직접 접근하는 방법)
    • 이제 웹 브라우저에서 http://localhost:20001로 접속하여 Kiali 대시보드를 확인할 수 있습니다.
      kubectl port-forward -n istio-system svc/kiali 20001:20001 &
  • Istio Ingress를 통한 접근 (권장):
    1. Istio Ingress Gateway 확인:istio-ingressgateway 서비스의 EXTERNAL-IP 또는 NodePort를 확인합니다. Kind 클러스터에서는 보통 localhost와 NodePort를 사용합니다.
      kubectl get svc -n istio-system istio-ingressgateway
    2. 브라우저에서 접속:
      • NodePort 사용 시: http://localhost:<NODE_PORT>/kiali ( <NODE_PORT>istio-ingressgateway 서비스의 NodePort)
      • EXTERNAL-IP 사용 시: http://<EXTERNAL-IP>/kiali

5단계: (선택 사항) Bookinfo 예제 애플리케이션 배포

Istio와 Kiali를 테스트하기 위해 Bookinfo 예제 애플리케이션을 배포할 수 있습니다.

kubectl apply -f <(istioctl kube-inject -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/platform/kube/bookinfo.yaml) # 1.20 버전에 맞게
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.20/samples/bookinfo/networking/bookinfo-gateway.yaml # 1.20 버전에 맞게
 
  • istioctl kube-inject: Bookinfo 애플리케이션의 파드에 Istio 사이드카 프록시 (Envoy)를 주입합니다.
  • bookinfo-gateway.yaml은 외부에서 애플리케이션에 접근할 수 있도록 Istio Gateway와 VirtualService를 정의합니다.

Bookinfo 애플리케이션에 접근하려면, 위에서 Kiali에 접근했던 것과 같은 방식으로 istio-ingressgateway의 EXTERNAL-IP 또는 NodePort를 사용하고, 경로를 /productpage로 지정합니다. (예: http://localhost:<NODE_PORT>/productpage)

Kiali 대시보드에서 Bookinfo 애플리케이션의 서비스 그래프와 트래픽 흐름을 확인할 수 있습니다.

6단계: 정리 (선택 사항)

  • Terraform 리소스 삭제:
    terraform destroy -auto-approve
  • Kind 클러스터 삭제:
    kind delete cluster

주의사항:

  • Istio와 Kiali 버전은 서로 호환되는 버전을 사용하는 것이 좋습니다. Istio 공식 문서의 호환성 정보를 확인하세요.
  • Istio와 Kiali 설치에는 다소 시간이 걸릴 수 있습니다. terraform apply 명령어가 완료될 때까지 기다리세요.
  • Kind 클러스터는 리소스가 제한적일 수 있으므로, 복잡한 애플리케이션이나 많은 트래픽을 처리하는 데는 적합하지 않을 수 있습니다. 프로덕션 환경에서는 클라우드 기반 Kubernetes 서비스 (GKE, EKS, AKS 등)나 온프레미스 Kubernetes 클러스터를 사용하는 것이 좋습니다.

이 가이드가 Kind 클러스터에서 Terraform, Istio, Kiali를 설정하고 사용하는 데 도움이 되었기를 바랍니다. Istio와 Kiali는 매우 다양한 기능을 제공하므로, 공식 문서를 참고하여 더 자세히 알아보는 것을 권장합니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함