Istio Service Mesh 를 클러스터에 배포하기

이 포스트에서는 쿠버네티스 환경에서 Istio Service Mesh 를 클러스터에 배포하는 간단한 방법을 안내합니다.

Istio Service Mesh란:

Istio Service Mesh는 마이크로서비스 아키텍처에서 발생하는 복잡한 서비스 간 통신 문제를 해결하기 위한 Open Source Service Mesh 솔루션입니다. Istio Service Mesh는 각 서비스에 프록시 “SideCar”를 추가하여 애플리케이션 인식 트래픽 관리, 관찰성, 보안 기능을 제공합니다. 이를 통해 개발자는 서비스 코드를 변경하지 않고도 서비스 간 통신을 쉽게 할 수 있습니다.

주요 기능:

  • 트래픽 관리 – 로드 밸런싱, 라우팅, 장애 주입 등을 통해 서비스 간 트래픽을 제어할 수 있습니다.
  • 관찰성 – 분산 추적, 메트릭 수집, 로깅 등을 통해 서비스 상태를 모니터링할 수 있습니다.
  • 보안 – mTLS, 인증, 권한 부여 등의 기능으로 서비스 간 통신을 보호할 수 있습니다.
  • 정책 적용 – 속도 제한, 할당량, 액세스 제어 등의 정책을 서비스에 적용할 수 있습니다.

목차

1. Istio 배포 전 준비
2. Istio Profile List
3. Istio 설치
4. Namespace에 Auto Sidecar Injection

1. Istio Service Mesh 배포 전 준비

Istio Service Mesh 를 배포하기 전 Istio의 CLI 도구인 istioctl을 설치합니다(이 포스트에서는 Istio-1.21.2):

$ curl -L https://istio.io/downloadIstio | sh -

  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   101  100   101    0     0    271      0 --:--:-- --:--:-- --:--:--   271
100  4899  100  4899    0     0   5979      0 --:--:-- --:--:-- --:--:--  5979

Downloading istio-1.21.2 from https://github.com/istio/istio/releases/download/1.21.2/istio-1.21.2-linux-amd64.tar.gz ...

Istio 1.21.2 Download Complete!

Istio has been successfully downloaded into the istio-1.21.2 folder on your system.

Next Steps:
See https://istio.io/latest/docs/setup/install/ to add Istio to your Kubernetes cluster.

To configure the istioctl client tool for your workstation,
add the /root/istio-1.21.2/bin directory to your environment path variable with:
         export PATH="$PATH:/root/istio-1.21.2/bin"

Begin the Istio pre-installation check by running:
         istioctl x precheck 

Need more information? Visit https://istio.io/latest/docs/setup/install/ 

Istio 패키지 디렉토리로 이동합니다:

$ cd istio-1.21.2

istioctl 명령을 사용하기 위해 경로를 추가한 뒤 istioctl 명령어를 확인합니다.

$ export PATH=$PWD/bin:$PATH

$ istioctl version
no ready Istio pods in "istio-system"
1.21.2

2. Istio Service Mesh Profile List

Istio를 설치하기 전 profile list를 확인하여 알맞는 profile을 선택합니다:

$ istioctl profile list
Istio configuration profiles:
    ambient
    default
    demo
    empty
    minimal
    preview
    remote

각 profile은 다음과 같습니다:

  • ambient – 주변 메시를 시작하는 데 도움이 되도록 설계되었습니다.
  • default – IstioOperator API의 기본 설정에 따라 구성 요소를 활성화합니다. 이 profile은 프로덕션 배포와 멀티 클러스터 메시의 기본 클러스터에 권장됩니다.
  • demo – 적절한 리소스 요구사항으로 Istio 기능을 선보이도록 설계된 구성입니다. Bookinfo 애플리케이션 및 관련 작업을 실행하는 데 적합합니다.
  • empty – 아무것도 배포하지 않습니다. 이는 사용자 정의 구성을 위한 기본 profile로 유용할 수 있습니다.
  • minimal – default profile과 동일하지만 control plane 구성 요소만 설치됩니다. 이를 통해 별도의 profile을 사용하여 control plane 및 data plane요소(예: Gateway)를 구성할 수 있습니다.
  • preview – preview profile에는 실험적인 기능이 포함되어 있습니다. 이는 Istio에 재공되는 새로운 기능을 탐색하기 위한 것입니다. 안정성, 보안 및 성능은 보장되지 않습니다. 사용에 따른 책임은 사용자 본인에게 있습니다.
  • remote – 외부 control plane 또는 multicluster mesh의 기본 클러스터에 있는 control plane에서 관리되는 원격 클러스터를 구성하는 데 사용됩니다.

각 profile 별 구성 요소는 다음과 같습니다:

ambientdefaultdemoemptyminimalpreviewremote
Core components
istio-egressgateway✅
istio-ingressgateway✅✅✅
istiod✅✅✅✅✅
CNI✅
Ztunnel✅

Istio를 추가로 사용자 정의하기 위해 여러 애드온 구성요소를 설치할 수도 있습니다. 자세한 내용은 통합을 참조하세요.

3. Istio 설치

위의 profile list에서 설치할 profile을 지정했다면 다음과 같이 설치할 수 있습니다:

# istioctl install --set profile={profile 명} -y
$ istioctl install --set profile=minimal -y

✔ Istio core installed                                                                                                                    
✔ Istiod installed                                                                                                                        
✔ Installation complete                                                                                                                   Made this installation the default for injection and validation.

4. Namespace에 Auto Sidecar Injection

Istio를 사용하여 서비스 간 통신을 관리하려면, 각 서비스의 파트에 Istio Service Mesh 의 사이드카 프록시(Envoy)가 주입되어야 합니다. 이 과정을 자동화하려면 사이드카 주입을 활성화하고자 하는 namespace에 istio-injection=enabled label을 추가합니다. 여기서는 NGINX Ingress Controller의 namespace인 nginx-ingress에 주입합니다:

$ kubectl label namespace nginx-ingress istio-injection=enabled

namespace/nginx-ingress labeled

다음과 같이 nginx-ingress라는 namespace에 Label이 추가되었는지 확인합니다.

$ kubectl describe namespace nginx-ingress

Name:         nginx-ingress
Labels:       istio-injection=enabled
              kubernetes.io/metadata.name=nginx-ingress
Annotations:  <none>
Status:       Active

No resource quota.

No LimitRange resource.

위처럼 Labels에 istio-injection=enabled가 추가되었다면 nginx-ingress라는 namespace로 배포되는 모든 파드에 사이드카가 주입되어 배포됩니다.

Istio Sidecar를 주입한 뒤, 파드를 생성해보면 다음과 같이 READY의 상태가 2/2가 되는 것을 확인할 수 있습니다.

$ kubectl get pods -n nginx-ingress

NAME                             READY   STATUS    RESTARTS      AGE
nginx-ingress-8446cbf644-fmqsk   2/2     Running   2 (33s ago)   57s

Describe를 사용하여 파드의 내용을 확인합니다.

$ kubectl describe pods nginx-ingress-8446cbf644-fmqsk -n nginx-ingress

...
Conatiners:
...
  istio-proxy:
    Container ID:  containerd://8da70f28afb0e386ad89202b66a2b977cb72d49b3dd092bbd708f64934272390
    Image:         docker.io/istio/proxyv2:1.21.2
    Image ID:      docker.io/istio/proxyv2@sha256:15f2457e7cf6a88d99f9de38ef714304699478d645b8aab9cdad906402938f54
    Port:          15090/TCP
    Host Port:     0/TCP
    Args:
      proxy
      sidecar
      --domain
      $(POD_NAMESPACE).svc.cluster.local
      --proxyLogLevel=warning
      --proxyComponentLogLevel=misc:error
      --log_output_level=default:info
    State:          Running
...

위와 같이 Istio Service Mesh 가 istio-proxy라는 컨테이너가 추가된 상태로 배포된 것을 확인할 수 있습니다.

NGINX Plus를 직접 사용해 보시려면 30일 무료 평가판을 신청하거나 NGINX STORE에 연락하여 논의하십시오.

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required