traefik 커뮤니티 에디션의 쿠버네티스 커스텀 리소스 정의(CRD)인 IngressRoute (그러니까 traefik.io/IngressRoute) 는 Kubernetes 내장 리소스인 Ingress와는 달리 미들웨어 지정 같은 좀 더 다양한 일을 할 수 있습니다. 그렇지만... cert-manager가 읽질 못합니다.
traefik 엔터프라이즈를 쓰는 거도 방법이겠지만... 홈 클러스터에 그거까진 필요없잖아요? 저기에 적혀있는 대로, cert-manager의 CRD인 Certificate (맞워요 cert-manager.io/Certificate에요) 를 수동으로 만들고, 그러면 자동으로 생성되는 인증서가 들어있는 Secret을 참조하면 그 이후로부터는 손 댈 필요가 없게 됩니다.
이 짓을 두 번째 하고 있어서 샘플을 정리해봅니다. 문서는 찾아보기 번거로워서 따로 링크 안 해둘게요. 나중에 필요하면 하겠죠 ㅋㅋ
이번에 했던 짓은 traefik dashboard 앞에 authentik의 proxy (forward) 인증을 붙인 주소를 웹에 노출하는 것입니다. 미들웨어 부분은 적당히 꾸미시면 되겠죠.
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: traefik-dashboard-tls # 임의
namespace: traefik-system # Service가 있는 네임스페이스 지정
spec:
dnsNames:
- traefik.내.도메인
issuerRef:
# 아시죠? ^_^
kind: ClusterIssuer
name: letsencrypt-prod
secretName: traefik-dashboard-tls # 이 이름으로 시크릿이 생성됩니다.
cert-manager가 잘 설정되어 있다면 traefik-dashboard-tls 시크릿이 생성될 것입니다.
apiVersion: v1
kind: Secret
metadata:
name: traefik-dashboard-tls
namespace: traefik-system
data:
tls.crt: >-
뭔가_긴_텍스트
tls.key: >-
뭔가_긴_텍스트
type: kubernetes.io/tls
apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
name: traefik-dashboard-authentik
namespace: traefik-system
spec:
entryPoints:
- web # 80 포트
- websecure # 443 포트. CRD이니만큼 traefik 스타일을 따릅니다.
routes:
- kind: Rule
# 저는 어차피 로그인 화면 뒤에 있어서 굳이 path를 보호할 필요가 없어요.
match: Host(`traefik.내.도메인`)
# 미들웨어는 여기에서 중요한 게 아니므로 나중에 따로 언급합니다.
middlewares:
- name: https-redirect
namespace: traefik-middleware
- name: ak-outpost-auth-system
namespace: authentik
services:
- kind: TraefikService
name: api@internal
tls:
secretName: traefik-dashboard-tls
Traefik 자체 미들웨어 기능을 사용하면 여러가지 일을 할 수 있는데, 그 중에서도 이번에는 두 가지를 쓰고 있습니다. (ChatGPT 고마워요!)
마찬가지로 k3s에 돌리고 있으므로 Kubernetes CRD 형식이죠.
네임스페이스는 임의로 만들었습니다.
아 참, traefik helm 차트에 다른 네임스페이스를 참조할 수 있게 옵션을 줘야 합니다.
저는 이런 유연성을 위해 k3s 설치 시 traefik을 제외하고 설치한 뒤, 수동으로 traefik을 설치했습니다.
values.yml에 아래 부분을 추가하세요.
providers:
kubernetesCRD:
allowCrossNamespace: true
enabled: true
traefik.io/Middleware - https-redirectapiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
name: https-redirect
namespace: traefik-middleware
spec:
redirectScheme:
permanent: true
scheme: https
traefik.io/Middleware - ak-outpost-auth-system이건 authentik이 k8s integration으로 자동으로 만든 것을 그대로 사용한 것입니다. 그래서 제가 넣은 outpost 이름인 auth-system? 이었나? 도 같이 붙어있죠. UI에서 생성한 것이므로 굳이 적지 않겠습니다.