티스토리 뷰
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_path는 kubectl이 사용하는 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: istiod가 istio_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
- -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 &
- 이제 웹 브라우저에서 http://localhost:20001로 접속하여 Kiali 대시보드를 확인할 수 있습니다.
- Istio Ingress를 통한 접근 (권장):
- Istio Ingress Gateway 확인:istio-ingressgateway 서비스의 EXTERNAL-IP 또는 NodePort를 확인합니다. Kind 클러스터에서는 보통 localhost와 NodePort를 사용합니다.
kubectl get svc -n istio-system istio-ingressgateway
- 브라우저에서 접속:
- NodePort 사용 시: http://localhost:<NODE_PORT>/kiali ( <NODE_PORT>는 istio-ingressgateway 서비스의 NodePort)
- EXTERNAL-IP 사용 시: http://<EXTERNAL-IP>/kiali
- Istio Ingress Gateway 확인:istio-ingressgateway 서비스의 EXTERNAL-IP 또는 NodePort를 확인합니다. Kind 클러스터에서는 보통 localhost와 NodePort를 사용합니다.
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는 매우 다양한 기능을 제공하므로, 공식 문서를 참고하여 더 자세히 알아보는 것을 권장합니다.
댓글