배경
- 서비스를 하나 추가할때마다 필요한 작업들
- 서비스 Domain Name에 해당하는 TLS 인증서 발급
- webserver or ingress에서 해당 서비스 프록시 추가
TLS 인증서 자체를 관리하는것도 번거롭고, 서비스별로 프록시를 추가하고 관리하는 것도 상당히 귀찮음
물론 wildcard 도메인으로 발급받아서 공통으로 쓰는것도 가능하지만, 프록시를 추가하거나, 인증서를 갱신하는 과정은 필요함
Cloudflare에서 TLS termination도 지원하니까, 아예 TLS 인증 자체를 cloudflare에 넘겨버리고, 도메인 → pod, service로 매핑만 할 수 있는 방법을 고민
Cloudflare Tunnel
Cloudflare Tunnel provides you with a secure way to connect your resources to Cloudflare without a publicly routable IP address. With Tunnel, you do not send traffic to an external IP — instead, a lightweight daemon in your infrastructure (
cloudflared
) creates outbound-only connections to Cloudflare’s global network.
공식적인 설명은 다음과 같음
k8s의 private network에 cloudflared를 띄워, cloudflare의 global network과 outbound tunnel을 맺는다.
이렇게 맺어진 터널은 외부에서 접근하는 트래픽이 cloudflare를 거쳐 cloudflared가 private 네트워크로 프록시하는데 쓰인다.
k8s에 cloudflared 띄우기
apiVersion: apps/v1
kind: Deployment
metadata:
name: cloudflared
namespace: edge
spec:
replicas: 1
selector:
matchLabels: { app: cloudflared }
template:
metadata:
labels: { app: cloudflared }
spec:
containers:
- name: cloudflared
image: cloudflare/cloudflared:latest
args: ["tunnel","--no-autoupdate","run"]
env:
- name: TUNNEL_TOKEN
valueFrom:
secretKeyRef:
name: cloudflared-token
key: token
resources:
requests: { cpu: "50m", memory: "64Mi" }
limits: { cpu: "500m", memory: "256Mi" }
securityContext:
runAsNonRoot: true
readOnlyRootFilesystem: true
restartPolicy: Always
cloudflare 대시보드에서 도메인 → 타겟 서비스 설정
바로 service로 연결해도 되는데, 중간에 traefik을 배치해서 IngressRoute를 통해서 관리
이미 배포된 deployment에 해당 내용
# edge 네임스페이스에 배포
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: n8n
namespace: edge
spec:
entryPoints: ["web"] # 터널 → Traefik(HTTP)
routes:
- match: Host(`n8n.cocopam.dev`)
kind: Rule
services:
- name: n8n
namespace: tools
port: 5678
트래픽 모니터링
cilium hubble을 통해서 트래픽이 흐르는 것을 확인해보면, 외부 Cloud network outbound tunnel이 맺어진 것을 확인할 수 있음
그리고 cloudflared로 들어온 트래픽을 traefik을 통해 타겟 서비스로 넘겨줌
실제 외부 트래픽이 ingress를 통해서 들어오는게 아니라 내부의 cloudflared로부터 들어오기때문에 Ingress traffic에 대한 모니터링이 안됌