Tools/K8S

K8S Ingress & Egress Gateway

칼쵸쵸 2024. 3. 25. 14:59

 

Isto Gateway

 

Istio는 쿠버네티스와 같은 컨테이너 오케스트레이션 시스템 위에서 동작하는 오픈 소스 서비스 메시(service mesh) 솔루션입니다.

서비스 메시는 마이크로서비스 간의 통신을 관리하고, 제어하며, 보안을 강화하는 데 사용되는 인프라 계층입니다. Istio는 마이크로서비스 아키텍처 내에서 서비스 간의 통신을 쉽게 만들어주고, 트래픽 관리, 서비스 간의 인증과 인가 처리, 서비스 간의 데이터 모니터링과 같은 기능을 제공합니다.

 

기본 구성 요소

Istio는 다음과 같은 주요 구성 요소로 이루어져 있습니다:

  • Envoy Proxy: 모든 서비스 인스턴스 옆에 배치되는 경량의 사이드카 프록시. Envoy는 Istio의 데이터 플레인을 구성하며, 모든 진입 및 진출 트래픽을 중재하고, 고급 라우팅, 로드 밸런싱, 보안 기능 등을 제공합니다.
  • Control Plane: 서비스 메시를 관리하고, 구성하는 데 사용되는 Istio의 구성 요소들의 집합입니다. Pilot, Citadel, Galley 등이 포함되며, 이러한 구성 요소들은 서비스 발견, 트래픽 관리 규칙의 배포, 인증서 관리 등의 역할을 합니다.

Istio 공식 CLI (istioctl)을 사용한 설치

1. istioctl 다운로드

curl -L https://istio.io/downloadIstio | sh -
cd istio-*/ # `istio-*`는 다운로드한 Istio의 버전에 따라 다릅니다.
export PATH=$PWD/bin:$PATH

 

Istio의 공식 웹사이트(Istio.io)에서 istioctl의 최신 버전을 다운로드합니다. 다운로드 후, 바이너리를 실행 가능한 상태로 만들고 PATH에 추가합니다.

 

2. Istio 설치

istioctl을 사용하여 Istio를 설치합니다. 다음 명령은 기본 구성으로 Istio를 설치합니다.

istioctl install --set profile=default -y

이 명령은 Istio의 "default" 프로파일을 사용하여 설치합니다. 다른 프로파일을 사용하고 싶다면, --set profile=<profile_name> 옵션을 변경하세요. 예를 들어, 최소한의 Istio 설치를 위해서는 minimal 프로파일을 사용할 수 있습니다.

 

3. Namespace에 자동 Sidecar 주입 활성화

Istio의 Sidecar 주입을 원하는 Namespace에 자동으로 활성화합니다. 이를 통해 해당 Namespace에 생성되는 모든 새 Pod에 자동으로 Istio의 Sidecar가 주입됩니다.

kubectl label namespace <your-namespace> istio-injection=enabled

여기서 <your-namespace>는 Istio Sidecar를 자동으로 주입하고자 하는 Namespace 이름입니다.

 

Helm을 사용한 설치

Istio는 Helm 차트를 통해서도 설치할 수 있습니다. 이 방법은 Istio의 구성을 더 세밀하게 제어하고자 할 때 유용합니다.

1. Helm 추가

helm repo add istio https://istio-release.storage.googleapis.com/charts
helm repo update

 

2. Istio 네임스페이스 생성

Istio를 설치할 네임스페이스를 생성합니다. 대부분의 경우, istio-system 네임스페이스에 설치합니다.

kubectl create namespace istio-system

 

3. Istio 설치

Helm을 사용하여 Istio의 Base 컴포넌트와 Istiod를 설치합니다.

helm install istio-ingress istio/gateway -n istio-system --wait

Ingress Gateway

 

  • 목적: Ingress Gateway는 외부 트래픽이 쿠버네티스 클러스터 내의 서비스로 들어오는 데 사용됩니다. 즉, 외부에서 클러스터 내부로 트래픽을 라우팅하는 역할을 합니다.
  • 사용 예: 웹 애플리케이션에 대한 사용자 요청을 처리하거나, API 서버로의 외부 요청을 받는 경우 Ingress Gateway를 사용하여 클러스터 내의 적절한 서비스로 트래픽을 전달합니다.
  • 기능: 보안(예: TLS 종료), 인증, 인가, 트래픽 라우팅 규칙 설정 등 클러스터로 들어오는 트래픽을 관리합니다.

Istio Ingress Gateway 예제

Istio Ingress Gateway를 사용하여, 외부에서 Kubernetes 클러스터 내의 특정 서비스(예: 웹 애플리케이션)로 HTTP 트래픽을 라우팅하는 방법을 설명합니다.

Ingress Gateway 설정

먼저, 클러스터에 Ingress Gateway를 설정합니다. Istio 설치 시 기본적으로 Ingress Gateway가 설정되어 있습니다. 특정 서비스로의 트래픽을 라우팅하려면, Gateway와 VirtualService를 정의해야 합니다.

 

Gateway 설정 예제:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: example-gateway
spec:
  selector:
    istio: ingressgateway # Istio Ingress Gateway를 사용
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "www.example.com"

 

VirtualService 설정 예제:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: example-virtualservice
spec:
  hosts:
  - "www.example.com"
  gateways:
  - example-gateway
  http:
  - route:
    - destination:
        host: example-service # Kubernetes 내의 대상 서비스 이름
        port:
          number: 8080 # 대상 서비스의 포트

 

이 설정은 www.example.com 도메인으로 들어오는 모든 HTTP 트래픽을 example-service 서비스의 8080 포트로 라우팅합니다.

Egress Gateway

  • 목적: Egress Gateway는 쿠버네티스 클러스터 내부의 서비스가 외부 시스템이나 서비스와 통신할 때 사용됩니다. 즉, 클러스터 내부에서 발생한 트래픽이 외부로 나가는 데 사용됩니다.
  • 사용 예: 내부 서비스가 외부 API를 호출하거나, 외부 데이터베이스에 접근해야 할 때 Egress Gateway를 통해 트래픽을 안전하게 라우팅하고 관리합니다.
  • 기능: 외부로 나가는 트래픽에 대한 보안 정책 적용, 트래픽 모니터링, 트래픽 제어 등을 담당합니다.

Egress Gateway 설정

Egress Gateway를 통해 특정 외부 서비스로의 트래픽을 안전하게 관리하려면, ServiceEntry, Gateway, 그리고 VirtualService를 정의해야 합니다.

 

ServiceEntry 설정 예제 (외부 서비스를 Istio 서비스 메시에 등록)

apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
  name: external-service-entry
spec:
  hosts:
  - "api.external.com"
  ports:
  - number: 80
    name: http
    protocol: HTTP
  location: MESH_EXTERNAL
  resolution: DNS

 

Egress Gateway 설정 예제

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: istio-egressgateway
spec:
  selector:
    istio: egressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "api.external.com"

 

VirtualService 설정 예제

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: direct-traffic-through-egress-gateway
spec:
  hosts:
  - "api.external.com"
  gateways:
  - istio-egressgateway
  - mesh
  http:
  - match:
    - gateways:
      - mesh
    route:
    - destination:
        host: istio-egressgateway.istio-system.svc.cluster.local
      weight: 100
      route:
        destination:
        host: "api.external.com"
        port:
        number: 80

 

Istio의 Ingress Gateway와 Egress Gateway는 클러스터 내외부로의 트래픽 흐름을 관리하는 강력한 도구입니다. Ingress Gateway를 사용하면, 외부에서 클러스터 내의 서비스로 들어오는 트래픽을 효과적으로 관리할 수 있습니다. 반면, Egress Gateway를 사용하면, 클러스터 내부에서 시작된 트래픽이 외부로 나갈 때 보안과 모니터링을 강화할 수 있습니다.

'Tools > K8S' 카테고리의 다른 글

Kubernetes PV & PVC  (0) 2023.08.12
Kubernetes Secret  (0) 2023.07.21
Kubernetes Deployment  (0) 2023.07.01
Kubernetes ReplicaSet  (0) 2023.07.01
Kubernetes Config  (1) 2023.06.17