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로 인증 기반 라우팅을 위한 다중 레이어 라우팅 구성하기