Episode 24 membangun HA dengan docker-compose manual; sekarang saatnya orkestrasi. Episode ini men-deploy Authelia ke Kubernetes memakai Helm chart resmi, ConfigMap dan Secret, Redis dan PostgreSQL, Ingress dengan forward auth, hingga HPA dan network policy.

Di episode 24 kalian membangun high availability dengan docker-compose: dua instance, Redis, PostgreSQL, dan load balancer. Pola itu bekerja, tapi begitu cluster tumbuh, mengelola setiap container dengan tangan menjadi pekerjaan yang melelahkan dan rawan inkonsistensi. Episode 25 membawa pola yang sama ke Kubernetes: Helm chart resmi Authelia.
Di Kubernetes, satu file values.yaml menggantikan sepuluh file docker-compose. Rolling update, restart otomatis, scaling, dan self-healing ditangani platform. Authelia menjadi satu Deployment yang bisa digandakan sesuka hati selama Redis dan database tetap menjadi komponen bersama — prinsip yang persis sama dengan episode 24.
Authelia memelihara chart resmi di repo https://charts.authelia.com. Tambahkan ke Helm, lalu perbarui indeksnya:
helm repo add authelia https://charts.authelia.com
helm repo updateSetelah itu, chart bisa dipasang dengan helm install authelia authelia/authelia -f values.yaml. Untuk melihat seluruh opsi nilai yang didukung, helm show values authelia/authelia menampilkan values.yaml bawaan chart yang sangat panjang — mulai dari image, configMap, secret, service, hingga ingress.
Sekumpulan resource yang dibuat chart bisa dilihat dengan helm template authelia authelia/authelia -f values.yaml atau ditelusuri lewat kubectl get all -n authelia. Intinya chart menghasilkan:
| Resource | Peran |
|---|---|
| Deployment | Instance Authelia dengan probe liveness dan readiness |
| Service | Titik akses stabil di dalam cluster (port 80 ke 9091) |
| ConfigMap | File configuration.yaml yang di-mount ke /config |
| Secret | Nilai rahasia seperti secret sesi, JWT, dan kunci enkripsi storage |
| Ingress / IngressRoute | Pintu masuk dari luar cluster, bisa memakai annotation forward auth |
Konfigurasi Authelia dibagi dua: bagian yang boleh publik (ConfigMap) dan bagian yang rahasia (Secret). Inilah implementasi separation of concerns yang sama seperti pembahasan rahasia di episode 4 dan episode 23.
Chart resmi meniru struktur konfigurasi Authelia di bawah key configMap. Kalian tidak menulis file configuration.yml terpisah — seluruhnya dirangkai lewat values.yaml. Contoh minimal untuk deployment produksi dengan file backend, PostgreSQL, dan Redis:
replicaCount: 2
configMap:
key: configuration.yaml
log:
level: info
format: json
server:
address: 'tcp://0.0.0.0:9091'
authentication_backend:
file:
enabled: true
path: /config/users_database.yml
access_control:
default_policy: deny
rules:
- domain: app.example.com
policy: two_factor
storage:
postgres:
address: tcp://authelia-postgres:5432
database: authelia
username: authelia
password: ''
session:
redis:
host: authelia-redis-master
port: 6379
database_index: 0
notifier:
filesystem:
enabled: true
filename: /config/notification.txtPerhatikan password: '' pada storage dan session secret yang belum diisi — nilai rahasia seperti ini jangan pernah ditulis langsung di values.yaml jika file itu masuk version control. Letakkan di Secret.
Chart memisahkan rahasia ke bagian secret sendiri. Dua cara yang umum dipakai: mengisi lewat nilai chart, atau mereferensikan Secret yang sudah ada (existingSecret). Cara kedua lebih disarankan karena nilai tidak pernah menyentuh values.yaml:
secret:
existingSecret: authelia-secretsLalu buat Secret-nya terpisah:
kubectl create secret generic authelia-secrets \
--namespace authelia \
--from-literal=sessionSecret='<64-karakter-acak>' \
--from-literal=jwtSecret='<64-karakter-acak>' \
--from-literal=storageEncryptionKey='<20-karakter-acak>'Kunci rahasia yang disimpan di Secret adalah: sessionSecret untuk mengenkripsi sesi, jwtSecret untuk menandatangani token identity validation, dan storageEncryptionKey untuk mengenkripsi data MFA di database. Generate semuanya dengan openssl rand -base64 64 | head -c 64.
Tip
Untuk produksi yang lebih serius, jangan menaruh rahasia mentah di Secret biasa. Pakai Sealed Secrets, External Secrets Operator, atau Vault — prinsip yang sudah kalian pelajari di series secret management. Secret biasa hanya obfuscation base64, bukan enkripsi.
Chart Authelia tidak mengelola Redis dan PostgreSQL — keduanya komponen terpisah. Untuk sesi yang HA, deploy Redis dengan Sentinel. Chart populer: bitnami/redis dengan architecture: replication atau chart redis-ha yang memang dirancang khusus untuk skenario seperti ini.
helm repo add dandydev https://dandydev.github.io/helm-charts
helm install authelia-redis dandydev/redis-ha \
--namespace authelia \
--set sentinel.enabled=true \
--set auth.password='<redis-password>'PostgreSQL bisa memakai chart bitnami/postgresql dengan replikasi, atau — yang lebih sederhana dan umum di produksi — database terkelola di luar cluster. Catatan penting untuk Redis: sentinel_name di konfigurasi sesi Authelia harus persis sama dengan nama master yang digunakan chart Redis.
Akses dari luar masuk lewat Ingress. Ada dua pola integrasi: proxy luar (NGINX, Traefik, Caddy) di cluster dengan forward auth, atau Authelia itu sendiri sebagai backend aplikasi. Untuk NGINX Ingress Controller, pasang annotation external-auth pada Ingress aplikasi yang ingin dilindungi:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
annotations:
nginx.ingress.kubernetes.io/auth-url: "https://auth.example.com/api/verify?rd=https%3A%2F%2Fauth.example.com%2F"
nginx.ingress.kubernetes.io/auth-signin: "https://auth.example.com/?rd=$request_uri"
nginx.ingress.kubernetes.io/auth-response-headers: "Remote-User,Remote-Groups,Remote-Name,Remote-Email"
spec:
ingressClassName: nginx
tls:
- hosts: [app.example.com]
secretName: app-tls
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app
port:
number: 80Annotation auth-url menunjuk ke endpoint /api/verify Authelia — persis pola forward auth yang kalian pelajari di episode 13 hingga 16, hanya kali ini diimplementasikan sebagai annotation Kubernetes. Sertifikat TLS bisa diatur dengan cert-manager; untuk Traefik, gunakan CRD Middleware dengan forwardAuth dan IngressRoute.
Authelia sudah memasang liveness dan readiness probe ke /api/health secara bawaan di chart. Yang perlu kalian perhatikan untuk produksi:
resources.requests dan resources.limits agar Authelia tidak bikin node kelaparan.Contoh HPA untuk Authelia:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: authelia
namespace: authelia
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: authelia
minReplicas: 2
maxReplicas: 6
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60Saat pod bertambah, ingat batas atas koneksi di Redis dan database. maximum_active_connections pada konfigurasi sesi dan storage membatasi berapa banyak koneksi yang boleh dibuka satu instance — sesuaikan dengan jumlah replica agar pool database tidak habis.
Episode 25 ini membawa Authelia ke Kubernetes: menambahkan Helm chart resmi, memahami resource yang dihasilkan, merangkai konfigurasi lewat configMap, memisahkan rahasia ke Secret atau Sealed Secrets, men-deploy Redis dan PostgreSQL, mengintegrasikan Ingress dengan annotation forward auth, serta menyiapkan probes, HPA, dan network policy untuk produksi.
Poin kunci:
configMap./api/verify.Orkestrasi selesai, tapi bagaimana tahu semua berjalan sehat? Di episode 26 kita bedah Monitoring & Logging: log terstruktur JSON, endpoint metrics Prometheus, dashboard Grafana, alerting, dan agregasi log dengan Loki. Sampai jumpa di episode 26!