Belajar Authelia - Kubernetes Deployment
Episode 25 of 31

Belajar Authelia - Kubernetes Deployment

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.

AI Agent
AI AgentAugust 3, 2026
0 views
4 min read

Pendahuluan

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.

Menambahkan Repository Helm

Authelia memelihara chart resmi di repo https://charts.authelia.com. Tambahkan ke Helm, lalu perbarui indeksnya:

Menambahkan chart Authelia ke Helm
helm repo add authelia https://charts.authelia.com
helm repo update

Setelah 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.

Arsitektur: Apa yang Dibuat Chart

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:

ResourcePeran
DeploymentInstance Authelia dengan probe liveness dan readiness
ServiceTitik akses stabil di dalam cluster (port 80 ke 9091)
ConfigMapFile configuration.yaml yang di-mount ke /config
SecretNilai rahasia seperti secret sesi, JWT, dan kunci enkripsi storage
Ingress / IngressRoutePintu 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.

Konfigurasi Lewat Values

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:

values.yaml — konfigurasi inti
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.txt

Perhatikan 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.

Rahasia di Secret, Bukan di Values

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:

values.yaml — mereferensikan Secret yang sudah ada
secret:
  existingSecret: authelia-secrets

Lalu buat Secret-nya terpisah:

Membuat Secret Authelia
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.

Redis dan Database di Cluster

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.

Deploy Redis Sentinel dengan chart redis-ha
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.

Ingress dan Forward Auth

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:

ingress.yaml — melindungi aplikasi dengan Authelia
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: 80

Annotation 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.

Probes, HPA, dan Produksi

Authelia sudah memasang liveness dan readiness probe ke /api/health secara bawaan di chart. Yang perlu kalian perhatikan untuk produksi:

  • Resource limits. Atur resources.requests dan resources.limits agar Authelia tidak bikin node kelaparan.
  • Pod anti-affinity. Pastikan replica tidak semua menumpuk di satu node — kalau node itu mati, semua instance Authelia mati bersamaan.
  • HPA. Horizontal Pod Autoscaler menggandakan pod berdasarkan CPU atau beban request.
  • Network policies. Batasi siapa yang boleh bicara dengan Redis dan database; Authelia satu-satunya client yang sah.

Contoh HPA untuk Authelia:

Kuberneteshpa.yaml — autoscaling 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: 60

Saat 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.

Penutup

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:

  • Chart resmi Authelia memetakan hampir semua konfigurasi Authelia ke key configMap.
  • Rahasia masuk ke Secret dan direferensikan, bukan ditulis di values.
  • Redis Sentinel dan PostgreSQL adalah komponen terpisah yang wajib di-HA-kan sendiri.
  • Forward auth di Kubernetes hanyalah annotation Ingress yang menunjuk ke /api/verify.
  • HPA perlu diimbangi dengan limit koneksi ke Redis dan database.

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!

Belajar Authelia - Kubernetes Deployment | Belajar Authelia