본문 바로가기
WIKI 기술 지식 베이스

Kubernetes에서 Traefik으로 서비스 노출하기 - 기본편

원문 보기 위키 갱신

출처: Kubernetes에서 Traefik으로 서비스 노출하기 - 기본편 (Exposing Services with Traefik on Kubernetes - Basic)

본문

Kubernetes에서 Traefik으로 서비스 노출하기 - 기본편

이 가이드는 Kubernetes에서 Traefik 프록시로 서비스를 노출하는 일을 시작하게 도와줘요. HTTP 트래픽을 라우팅하는 기본기, 경로(Path) 기반 라우팅 구성, 그리고 TLS로 서비스를 안전하게 지키는 법까지 배우게 됩니다.

라우팅에 대해 이 가이드는 두 가지 옵션을 제공해요:

  • Gateway API

  • IngressRoute

여러분의 필요에 가장 잘 맞는 것을 골라 쓰면 돼요.

사전 준비물

  • Traefik Proxy가 설치된 Kubernetes 클러스터

  • 클러스터와 상호작용하도록 구성된 kubectl

  • Traefik Kubernetes 셋업 가이드를 따라 Traefik을 배포해 둔 상태

첫 HTTP 서비스 노출하기

whoami 애플리케이션을 써서 간단한 HTTP 서비스를 노출해 볼게요. 백엔드 서비스로 가는 기본 라우팅을 보여주는 예시입니다.

먼저 디플로이먼트와 서비스를 만드세요:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami
  namespace: default
spec:
  replicas: 2
  selector:
    matchLabels:
      app: whoami
  template:
    metadata:
      labels:
        app: whoami
    spec:
      containers:
      - name: whoami
        image: traefik/whoami
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: whoami
  namespace: default
spec:
  selector:
    app: whoami
  ports:
  - port: 80

이걸 whoami.yaml로 저장하고 적용하세요:

kubectl apply -f whoami.yaml

이제 Gateway API나 IngressRoute로 라우트를 만들어 볼게요.

Gateway API 사용하기

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: whoami
  namespace: default
spec:
  parentRefs:
  - name: traefik-gateway  # This Gateway is automatically created by Traefik
  hostnames:
  - "whoami.docker.localhost"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: whoami
      port: 80

이걸 whoami-route.yaml로 저장하고 적용하세요:

kubectl apply -f whoami-route.yaml

IngressRoute 사용하기

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: whoami
  namespace: default
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`whoami.docker.localhost`)
    kind: Rule
    services:
    - name: whoami
      port: 80

이걸 whoami-ingressroute.yaml로 저장하고 적용하세요:

kubectl apply -f whoami-ingressroute.yaml

서비스 확인하기

이제 서비스가 http://whoami.docker.localhost/ 에서 동작해요. 잘 되는지 테스트해 볼게요:

curl -H "Host: whoami.docker.localhost" http://localhost/

정보

Kubernetes 셋업 가이드를 따라 Traefik을 설치했다면 values.yaml 파일에서 ports.web.http.redirections 블록을 제거해야 해요. 그렇지 않으면 HTTPS 엔트리포인트로 리다이렉트될 거예요:

redirections:
  entryPoint:
    to: websecure

다음과 비슷한 출력이 보일 거예요:

Hostname: whoami-6d5d964cb-8pv4k
IP: 127.0.0.1
IP: ::1
IP: 10.42.0.18
IP: fe80::d4c0:3bff:fe20:b0a3
RemoteAddr: 10.42.0.17:39872
GET / HTTP/1.1
Host: whoami.docker.localhost
User-Agent: curl/7.68.0
Accept: */*
Accept-Encoding: gzip
X-Forwarded-For: 10.42.0.1
X-Forwarded-Host: whoami.docker.localhost
X-Forwarded-Port: 80
X-Forwarded-Proto: http
X-Forwarded-Server: traefik-76cbd5b89c-rx5xn
X-Real-Ip: 10.42.0.1

이 출력이 확인해 주는 건, Traefik이 요청을 여러분의 whoami 애플리케이션까지 제대로 라우팅했다는 뜻이에요.

라우팅 규칙 추가하기

이제 URL 경로에 따라 트래픽을 서로 다른 서비스로 보내도록 라우팅을 확장해 볼게요. API 버저닝, 프론트엔드/백엔드 분리, 마이크로서비스 정리에 유용하게 쓸 수 있죠.

먼저 API를 나타내는 두 번째 서비스를 배포하세요:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: whoami-api
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      app: whoami-api
  template:
    metadata:
      labels:
        app: whoami-api
    spec:
      containers:
      - name: whoami
        image: traefik/whoami
        env:
        - name: WHOAMI_NAME
          value: "API Service"
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: whoami-api
  namespace: default
spec:
  selector:
    app: whoami-api
  ports:
  - port: 80

이걸 whoami-api.yaml로 저장하고 적용하세요:

kubectl apply -f whoami-api.yaml

이제 경로 기반 라우팅을 설정해 볼게요:

경로 규칙이 있는 Gateway API

기존 HTTPRoute에 경로 기반 라우팅을 포함하도록 갱신하세요:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: whoami
  namespace: default
spec:
  parentRefs:
  - name: traefik-gateway
  hostnames:
  - "whoami.docker.localhost"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: whoami-api
      port: 80
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: whoami
      port: 80

whoami-route.yaml 파일을 갱신하고 적용하세요:

kubectl apply -f whoami-route.yaml

경로 규칙이 있는 IngressRoute

기존 IngressRoute에 경로 기반 라우팅을 포함하도록 갱신하세요:

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: whoami
  namespace: default
spec:
  entryPoints:
    - web
  routes:
  - match: Host(`whoami.docker.localhost`) && Path(`/api`)
    kind: Rule
    services:
    - name: whoami-api
      port: 80
  - match: Host(`whoami.docker.localhost`)
    kind: Rule
    services:
    - name: whoami
      port: 80

이걸 whoami-ingressroute.yaml로 저장하고 적용하세요:

kubectl apply -f whoami-ingressroute.yaml

경로 기반 라우팅 테스트하기

서로 다른 경로가 서로 다른 서비스로 가는지 확인해 볼게요:

# Root path should go to the main whoami service
curl -H "Host: whoami.docker.localhost" http://localhost/

# /api path should go to the whoami-api service
curl -H "Host: whoami.docker.localhost" http://localhost/api

/api 요청에서는 응답의 환경 변수 부분에 "API Service"가 보일 거예요. 이것이 경로 기반 라우팅이 제대로 동작한다는 증거입니다:

{"hostname":"whoami-api-67d97b4868-dvvll","ip":["127.0.0.1","::1","10.42.0.9","fe80::10aa:37ff:fe74:31f2"],"headers":{"Accept":["*/*"],"Accept-Encoding":["gzip"],"User-Agent":["curl/8.7.1"],"X-Forwarded-For":["10.42.0.1"],"X-Forwarded-Host":["whoami.docker.localhost"],"X-Forwarded-Port":["80"],"X-Forwarded-Proto":["http"],"X-Forwarded-Server":["traefik-669c479df8-vkj22"],"X-Real-Ip":["10.42.0.1"]},"url":"/api","host":"whoami.docker.localhost","method":"GET","name":"API Service","remoteAddr":"10.42.0.13:36592"}

TLS 활성화하기

TLS를 추가해서 서비스를 HTTPS로 지켜볼게요. 먼저 로컬 개발용 자체 서명(self-signed) 인증서부터 시작합니다.

자체 서명 인증서 만들기

자체 서명 인증서를 생성하세요:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout tls.key -out tls.crt \
  -subj "/CN=whoami.docker.localhost"

Kubernetes에 TLS 시크릿을 만드세요:

kubectl create secret tls whoami-tls --cert=tls.crt --key=tls.key

TLS가 있는 Gateway API의 사전 준비물

Gateway API를 TLS와 함께 쓰기 전에 Traefik 설치에 websecure 리스너를 정의해야 해요. 이는 보통 Helm values에서 수행합니다.

values.yaml의 설정 예시:

ports:
  web:
    port: 80
  websecure:
    port: 443
gateway:
  listeners:
    web:
      port: 80
      protocol: HTTP
      namespacePolicy:
        from: All
    websecure:
      port: 443
      protocol: HTTPS
      namespacePolicy:
        from: All
      mode: Terminate
      certificateRefs:
        - kind: Secret
          name: whoami-tls
          group: ""

전체 설치 세부 사항은 Traefik Kubernetes 셋업 가이드를 참고하세요.

TLS가 있는 Gateway API

보안된 게이트웨이 리스너를 쓰도록 기존 HTTPRoute를 갱신하세요:

apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: whoami
  namespace: default
spec:
  parentRefs:
  - name: traefik-gateway
    sectionName: websecure  # The HTTPS listener
  hostnames:
  - "whoami.docker.localhost"
  rules:
  - matches:
    - path:
        type: PathPrefix
        value: /api
    backendRefs:
    - name: whoami-api
      port: 80
  - matches:
    - path:
        type: PathPrefix
        value: /
    backendRefs:
    - name: whoami
      port: 80

whoami-route.yaml 파일을 갱신하고 적용하세요:

kubectl apply -f whoami-route.yaml

TLS가 있는 IngressRoute

TLS를 쓰도록 기존 IngressRoute를 갱신하세요:

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: whoami
  namespace: default
spec:
  entryPoints:
    - websecure  # Changed from 'web' to 'websecure'
  routes:
  - match: Host(`whoami.docker.localhost`) && Path(`/api`)
    kind: Rule
    services:
    - name: whoami-api
      port: 80
  - match: Host(`whoami.docker.localhost`)
    kind: Rule
    services:
    - name: whoami
      port: 80
  tls:
    secretName: whoami-tls  # Added TLS configuration

whoami-ingressroute.yaml 파일을 갱신하고 적용하세요:

kubectl apply -f whoami-ingressroute.yaml

HTTPS 접근 확인하기

이제 안전하게 서비스에 접근할 수 있어요. 자체 서명 인증서를 쓰고 있으니 인증서 검증을 건너뛰어야 합니다:

curl -k -H "Host: whoami.docker.localhost" https://localhost/

브라우저에서도 https://whoami.docker.localhost/ 에 접근할 수 있어요 (자체 서명 인증서라 보안 경고를 수락해야 합니다).

다음 단계

이제 Kubernetes에서 Traefik으로 서비스 노출의 기본기를 익혔으니, 미들웨어, Let's Encrypt 인증서, 스티키 세션, 다중 레이어 라우팅 같은 고급 기능을 살펴볼 준비가 됐어요.

고급 가이드로 이어서 다음을 배워 보세요:

  • 보안과 접근 제어를 위한 미들웨어 추가하기

  • Let's Encrypt(IngressRoute) 또는 cert-manager(Gateway API)로 인증서 생성하기

  • 상태 유지 애플리케이션을 위한 스티키 세션 구성하기

  • IngressRoute로 인증 기반 라우팅을 위한 다중 레이어 라우팅 구성하기

더 알아보기 (Learn more)