쿠버네티스와 서비스 메시

쿠버네티스와 서비스 메시

- Istio, Linkerd 등을 이용한 서비스 메시 구성
- 키워드: 쿠버네티스 서비스 메시, Kubernetes Istio


서론


마이크로서비스 아키텍처는 애플리케이션을 작은 단위로 분리하여 개발, 배포, 운영을 용이하게 합니다. 그러나 이러한 분산된 환경에서는 서비스 간의 통신이 복잡해지며, 관리와 모니터링이 어려워집니다. 이를 해결하기 위해 서비스 메시(Service Mesh)가 등장했습니다. 서비스 메시는 서비스 간의 통신을 관리하고, 보안, 관찰성, 트래픽 관리를 제공하는 인프라 계층입니다. 이번 포스팅에서는 쿠버네티스에서 Istio와 Linkerd를 이용하여 서비스 메쉬를 구성하는 방법을 초보자도 이해할 수 있도록 자세히 설명합니다.


본론


서비스 메시 개념


서비스 메시란?


서비스 메시는 마이크로서비스 간의 네트워크 통신을 제어하는 계층입니다. 서비스 메시의 주요 기능은 다음과 같습니다.


  • 트래픽 관리: 로드 밸런싱, A/B 테스트, 카나리 배포, 서킷 브레이커 등을 통해 트래픽을 제어합니다.
  • 보안: 서비스 간의 통신을 암호화하고, 인증 및 권한 부여를 관리합니다.
  • 관찰성: 서비스의 상태와 성능을 모니터링하고, 로깅, 트레이싱, 메트릭스를 수집합니다.
  • 정책 관리: 서비스 간의 정책을 중앙에서 관리하고, 일관성 있는 정책을 적용합니다.

Istio와 Linkerd


  • Istio: Istio는 가장 널리 사용되는 서비스 메쉬 중 하나로, 강력한 트래픽 관리, 보안, 관찰성 기능을 제공합니다.
  • Linkerd: Linkerd는 경량의 서비스 메쉬로, 설치와 구성이 간편하며, 성능이 뛰어납니다. 특히 관찰성과 보안 기능에 중점을 두고 있습니다.

Istio를 이용한 서비스 메시 구성


Istio 설치


  1. Istio 다운로드 및 설치

Istio를 설치하려면 먼저 Istio CLI를 다운로드하고 설치합니다.


curl -L https://istio.io/downloadIstio | sh -
cd istio-1.9.0
export PATH=$PWD/bin:$PATH

  1. Istio 설치

다음 명령어를 사용하여 Istio를 쿠버네티스 클러스터에 설치합니다.


istioctl install --set profile=demo

  1. 네임스페이스 레이블 설정

Istio가 서비스 메쉬를 제어할 수 있도록 네임스페이스에 레이블을 설정합니다.


kubectl label namespace default istio-injection=enabled

샘플 애플리케이션 배포


Istio에서 제공하는 샘플 애플리케이션을 배포하여 Istio의 기능을 테스트합니다.


kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

트래픽 관리


  1. 가상 서비스(Virtual Service) 설정

가상 서비스는 트래픽을 어떻게 라우팅할지 정의합니다. 다음은 가상 서비스를 설정하는 예제입니다.


apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookinfo
spec:
  hosts:
  - "*"
  gateways:
  - bookinfo-gateway
  http:
  - match:
    - uri:
        prefix: "/productpage"
    route:
    - destination:
        host: productpage
        port:
          number: 9080

  1. 게이트웨이(Gateway) 설정

게이트웨이는 클러스터 외부의 트래픽을 내부 서비스로 라우팅합니다.


apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: bookinfo-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

보안 설정


  1. mTLS 설정

Istio는 서비스 간의 통신을 암호화하기 위해 mTLS(mutual TLS)를 지원합니다. 다음 명령어를 사용하여 mTLS를 설정합니다.


apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: default
  namespace: istio-system
spec:
  mtls:
    mode: STRICT

  1. 인증 정책 설정

인증 정책을 설정하여 서비스에 대한 접근을 제어합니다.


apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: productpage-viewer
  namespace: default
spec:
  selector:
    matchLabels:
      app: productpage
  rules:
  - from:
    - source:
        principals: ["cluster.local/ns/default/sa/bookinfo-productpage"]

관찰성 설정


  1. 메트릭 수집

Istio는 Prometheus와 Grafana를 사용하여 메트릭을 수집하고 시각화합니다. 다음 명령어를 사용하여 Prometheus와 Grafana를 설치합니다.


kubectl apply -f samples/addons

  1. 트레이싱 설정

Istio는 Jaeger를 사용하여 트레이싱 데이터를 수집합니다. 다음 명령어를 사용하여 Jaeger를 설치합니다.


kubectl apply -f samples/addons/jaeger.yaml

Linkerd를 이용한 서비스 메시 구성


Linkerd 설치


  1. Linkerd CLI 설치

Linkerd CLI를 다운로드하고 설치합니다.


curl -sL https://run.linkerd.io/install | sh
export PATH=$PATH:$HOME/.linkerd2/bin

  1. Linkerd 설치

다음 명령어를 사용하여 Linkerd를 쿠버네티스 클러스터에 설치합니다.


linkerd install | kubectl apply -f -
linkerd check

샘플 애플리케이션 배포


Linkerd에서 제공하는 샘플 애플리케이션을 배포하여 Linkerd의 기능을 테스트합니다.


kubectl apply -f https://run.linkerd.io/emojivoto.yml

트래픽 관리


Linkerd는 자동으로 트래픽을 관리하며, 별도의 가상 서비스와 게이트웨이 설정이 필요 없습니다.


보안 설정


Linkerd는 자동으로 mTLS를 설정하여 서비스 간의 통신을 암호화합니다.


linkerd inject emojivoto.yml | kubectl apply -f -

관찰성 설정


  1. 메트릭 수집

Linkerd는 Prometheus와 Grafana를 사용하여 메트릭을 수집하고 시각화합니다. 다음 명령어를 사용하여 Prometheus와 Grafana를 설치합니다.


linkerd viz install | kubectl apply -f -

  1. 트레이싱 설정

Linkerd는 트레이싱 데이터를 수집하기 위해 OpenTelemetry를 사용합니다.


kubectl apply -f https://github.com/open-telemetry/opentelemetry-collector-releases/releases/download/v0.21.0/opentelemetry-collector.yaml

Istio와 Linkerd 비교


성능


  • Istio: 풍부한 기능을 제공하지만, 설치와 구성이 복잡하고 리소스 사용량이 높을 수 있습니다.
  • Linkerd: 설치와 구성이 간편하며, 경량의 서비스 메쉬로 성능이 뛰어납니다.

기능


  • Istio: 트래픽 관리, 보안, 관찰성 등 다양한 기능을 제공합니다.
  • Linkerd: 기본적인 트래픽 관리와 보안 기능을 제공하며, 간단한 설정으로 충분한 기능을 제공합니다.

사용 사례


  • Istio: 복잡한 트래픽 관리와 세밀한 정책 설정이 필요한 대규모 애플리케이션에 적합합니다.
  • Linkerd: 설치와 구성이 간편하고, 성능이 중요한 소규모 애플리케이션에 적합합니다.

결론


서비스 메시는 마이크로서비스 아키텍처에서 서비스 간의 통신을 관리하고 보안, 관찰성, 트래픽 관리를 제공하는 필수적인 인프라 계층입니다. 이번 포스팅에서는 Istio와 Linkerd를 사용하여 쿠버네티스 클러스터에 서비스 메쉬를 구성하는 방법을 자세히 설명했습니다. 이를 통해 서비스 메쉬의 기능을 활용하여 마이크로서비스 환경을 효율적으로 관리할 수 있기를 바랍니다.

다음 이전