traefik CRD IngressRoute + cert-manager

Ch. (sftblw)·2023년 10월 17일

traefik 커뮤니티 에디션의 쿠버네티스 커스텀 리소스 정의(CRD)인 IngressRoute (그러니까 traefik.io/IngressRoute) 는 Kubernetes 내장 리소스인 Ingress와는 달리 미들웨어 지정 같은 좀 더 다양한 일을 할 수 있습니다. 그렇지만... cert-manager가 읽질 못합니다.

traefik 엔터프라이즈를 쓰는 거도 방법이겠지만... 홈 클러스터에 그거까진 필요없잖아요? 저기에 적혀있는 대로, cert-manager의 CRD인 Certificate (맞워요 cert-manager.io/Certificate에요) 를 수동으로 만들고, 그러면 자동으로 생성되는 인증서가 들어있는 Secret을 참조하면 그 이후로부터는 손 댈 필요가 없게 됩니다.

이 짓을 두 번째 하고 있어서 샘플을 정리해봅니다. 문서는 찾아보기 번거로워서 따로 링크 안 해둘게요. 나중에 필요하면 하겠죠 ㅋㅋ

이번에 했던 짓은 traefik dashboard 앞에 authentikproxy (forward) 인증을 붙인 주소를 웹에 노출하는 것입니다. 미들웨어 부분은 적당히 꾸미시면 되겠죠.

CRD 생성: cert-manager.io/Certificate

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

CRD 생성: traefik.io/IngressRoute

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 설정 변경

아 참, traefik helm 차트에 다른 네임스페이스를 참조할 수 있게 옵션을 줘야 합니다.

저는 이런 유연성을 위해 k3s 설치 시 traefik을 제외하고 설치한 뒤, 수동으로 traefik을 설치했습니다.

values.yml에 아래 부분을 추가하세요.

providers:
  kubernetesCRD:
    allowCrossNamespace: true
    enabled: true

traefik.io/Middleware - https-redirect

apiVersion: 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에서 생성한 것이므로 굳이 적지 않겠습니다.

profile
sftblw의 임시 개발 블로그입니다.

0개의 댓글