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