1326 May 30, 2026, 2:42 p.m.

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

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

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

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


Установка Traefik

В встроенном Traefik чтобы произвести настройки требуется положить файл /var/lib/rancher/k3s/server/manifests/traefik-config.yaml. В данном примере реализуется, режим работы DaemonSet, подключение своих собственных сертификатов из секретов, настройка мониторинга, настройка правил CRD/Ingress,реализация proxyProtocol, правила affinity (опционально).

---
# /var/lib/rancher/k3s/server/manifests/traefik-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: traefik
  namespace: kube-system
spec:
  valuesContent: |-
    # image:
    #   repository: traefik
    #   tag: v3.0

    deployment:
      kind: DaemonSet
      additionalVolumes:
        - name: fullchain-secret-volume
          secret:
            secretName: fullchain.pem-secret
            items:
              - key: prod
                path: fullchain.pem
        - name: privkey-secret-volume
          secret:
            secretName: privkey.pem-secret
            items:
              - key: prod
                path: privkey.pem

    global:
      # checkNewVersion: false
      sendAnonymousUsage: false

    metrics:
      prometheus:
        addEntryPointsLabels: true
        addServicesLabels: true
        entryPoint: metrics

    ping:
      entryPoint: traefik

    api:
      insecure: false
      dashboard: true

    providers:
      kubernetesCRD:
        enabled: true
      kubernetesIngress:
        enabled: true
      file:
        enabled: true
        content: |-
          tls:
            certificates:
              - certFile: /run/secrets/example.com.crt
                keyFile: /run/secrets/example.com.key

    additionalVolumeMounts:
      - name: fullchain-secret-volume
        mountPath: /run/secrets/example.com.crt
        subPath: fullchain.pem
        readOnly: true
      - name: privkey-secret-volume
        mountPath: /run/secrets/example.com.key
        subPath: privkey.pem
        readOnly: true

    # Требуется чтобы Traefik не "терял" настоящие IP клиентов
    service:
      spec:
        externalTrafficPolicy: Local

    ports:
      metrics:
        port: 8082
        expose:
          default: true

      # так как является параметром по умолчанию заполняется иммено так как в примере.
      websecure:
        proxyProtocol:
          trustedIPs:
            - 1.1.1.1/32 #Хост, с которого идет трафик на ноду, которому мы доверяем.

      <custom port>:
        port: 1234
        expose:
          default: true
        exposedPort: 1234
        protocol: TCP
        proxyProtocol:
          trustedIPs:
            - 1.1.1.1/32 #Хост, с которого идет трафик на ноду, которому мы доверяем.

    affinity:
      nodeAffinity:
        requiredDuringSchedulingIgnoredDuringExecution:
          nodeSelectorTerms:
            - matchExpressions:
                - key: cloud
                  operator: In
                  values:
                    - aws

Примеры манифестов для проброса трафика в контейнеры

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/"

Если потребуется удалить и заного установить Traefik

# Удаляем компоненты
kubectl delete helmchart traefik -n kube-system
kubectl delete helmchart traefik-crd -n kube-system

# Перзапуск k3s который вызовет повторную установку
sudo systemctl restart k3s