208 June 17, 2024, 10:54 a.m.

Конфигурация Traefik в K3s

Задача: запустить Traefik в среде kubernetes.

Опущу подробности о создании ConfigMaps Secrets и других методов проброса внешних данных.

Предположим, есть проекты, с домент example.com, которые должны работать по SSL сертификату. К примеру возьмём nextcloud.


Установка Traefik

Соберем базовые манифесты для запуска проекта:

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: traefik-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: traefik-pod
  template:
    metadata:
      labels:
        app: traefik-pod
    spec:
      serviceAccountName: traefik-ingress-controller
      containers:
# ========== IMAGE =============
        - name: traefik
          image: traefik:v3.0
# ========== POTS =============
          ports:
            - name: websecure
              containerPort: 443
              protocol: TCP
            - name: dashboard
              containerPort: 8080
              protocol: TCP
# ====== VOLUME MOUNTS =======
          volumeMounts:
            - name: traefik-config
              mountPath: /etc/traefik/traefik.yml
              subPath: traefik.yml
              readOnly: true
            - name: fullchain-secret
              mountPath: /run/secrets/example.com.crt
              subPath: fullchain.pem
              readOnly: true
            - name: privkey-secret
              mountPath: /run/secrets/example.com.key
              subPath: privkey.pem
              readOnly: true
# ======== VOLUMES ==========
      volumes:
        - name: traefik-config
          secret:
            secretName: traefik.yml-secret
            items:
            - key: prod
              path: traefik.yml
        - name: fullchain-secret
          secret:
            secretName: fullchain.pem-secret
            items:
            - key: prod
              path: fullchain.pem
        - name: privkey-secret
          secret:
            secretName: privkey.pem-secret
            items:
            - key: prod
              path: privkey.pem

Service

apiVersion: v1
kind: Service
metadata:
  name: traefik-svc
spec:
  selector:
    app: traefik-pod
  type: LoadBalancer
  ports:
    - name: websecure
      port: 443
    - name: dashboard
      port: 8080

Другие манифесты

# Install Traefik Resource Definitions:
kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v3.0/docs/content/reference/dynamic-configuration/kubernetes-crd-definition-v1.yml

# Install RBAC for Traefik:
kubectl apply -f https://raw.githubusercontent.com/traefik/traefik/v3.0/docs/content/reference/dynamic-configuration/kubernetes-crd-rbac.yml

Конфигурационный файл

По-умолчанию Traefik ожадает конфигурацию по адресу /etc/traefik/traefik.yml. Пример файла конфигурации может быть следующим:

# Базовые значения
global:
  checkNewVersion: false
  sendAnonymousUsage: false

# Настройка передачи метрик для prometheus. Метрики будут доступны по 8082 порту.
metrics:
  prometheus:
    addEntryPointsLabels: true
    addServicesLabels: true
    entryPoint: metrics

# Настройка портов, так как в моей конфигурации нет HTTP подключий, блок с 80 портом отключен.
entrypoints:
  # web:
  #   address: ":80"
  #   proxyProtocol:
  #     trustedIPs:
  #       - "0.0.0.0/0"
  #   forwardedHeaders:
  #     trustedIPs:
  #       - "0.0.0.0/0"
  #   http:
  #     redirections:
  #       entrypoint:
  #         to: websecure
  #         scheme: https
  #         permanent: true
  metrics:
    address: ":8082"

  websecure:
    address: ":443"
    proxyProtocol:
      trustedIPs:
        - "0.0.0.0/0"
    forwardedHeaders:
      trustedIPs:
        - "0.0.0.0/0"
  # # uVNC service
  # uvnc-repeater:
  #   address: ":5500"
  # uvnc-viever:
  #   address: ":5901"

# Обязательный блок, в котором указывается откуда брать конфигурации,
# если не указать kubernetesIngress: {}  kubernetesCRD: {} манифесты
# для Traefik работать не будут.
providers:
  kubernetesIngress: {} 
  kubernetesCRD: {}
  file:
    fileName: /etc/traefik/traefik.yml

# Параметры работы WebUI Traefik. Для отладочных целей оставляем так.
api:
  insecure: true
  dashboard: true

# Подключение сертификатов. Предварительно они должны быть примонтированы
tls:
  certificates:
    - certFile: /run/secrets/example.com.crt
      keyFile: /run/secrets/example.com.key

Проверка

После всех действий, при условии что открыт порт 8080, должн будет появляться WebUI. Для проверки работосмособности манифестов для Traefik можно добавить следующие манифесты для Nextcloud.

Deployment

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nextcloud
  labels:
    app: nextcloud
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nextcloud-pod
  template:
    metadata:
      labels:
        app: nextcloud-pod
    spec:
      containers:
# ========== IMAGE =============
      - name: nextcloud
        image: nextcloud:28.0.3
# ========== ENVS =============
        env:
          - name: PARAM
            value: "SUPER-PARAM"
# ========== POTS =============
        ports:
          - name: http
            containerPort: 80
            protocol: TCP

Service

apiVersion: v1
kind: Service
metadata:
  name: nextcloud-svc
spec:
  selector:
    app: nextcloud-pod
  ports:
    - name: http
      port: 80

IngressRoute

apiVersion: traefik.io/v1alpha1
kind: IngressRoute
metadata:
  name: nextcloud-80-ingress
spec:
  entryPoints:
    - websecure
  routes:
  - match: Host(`cloud.example.com`)
    kind: Rule
    services:
    - name: nextcloud-svc
      port: 80
    middlewares:
    - name: nextcloud-1-mw
  tls: {}

Middleware

apiVersion: traefik.io/v1alpha1
kind: Middleware
metadata:
  name: nextcloud-1-mw
spec:
  replacePathRegex:
    regex: "^/.well-known/ca(l|rd)dav"
    replacement: "/remote.php/dav/"

После проделанных действий в WebUI Traefik мы должны увидеть новый сервис с подключенными к нему Middleware.


Helm Chart

Чтобы не писать данные манифесты вручную, предлагаю использовать готовое решение, которое находися на моём GitHub. Чтобы им воспользоваться нужно:

  • пробросить конфигурационный файл;
  • пробросить секреты с SSL.

Актуальную версию развертывания Traefik рекомендую смотреть тут. Репозиторий с HELM