Конфигурация 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