Keycloak avec Kubernetes 35 min de lecture

Deploiement Helm et haute disponibilite

Deploiement avec Helm

Le chart Helm officiel Bitnami simplifie le deploiement de Keycloak sur Kubernetes avec support natif de la HA, des bases externes et de l'Ingress.

Installation du chart

# Ajouter le repo Bitnami
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update

# Installation basique
helm install keycloak bitnami/keycloak \
  --namespace keycloak \
  --create-namespace

values.yaml pour la production

replicaCount: 3

auth:
  adminUser: admin
  existingSecret: keycloak-admin-secret

postgresql:
  enabled: false

externalDatabase:
  host: postgres.database.svc.cluster.local
  port: 5432
  database: keycloak
  user: keycloak
  existingSecret: keycloak-db-secret
  existingSecretPasswordKey: password

ingress:
  enabled: true
  ingressClassName: nginx
  hostname: auth.mondomaine.com
  tls: true
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod

cache:
  stack: kubernetes

resources:
  requests:
    memory: 512Mi
    cpu: 250m
  limits:
    memory: 1Gi
    cpu: 1000m

autoscaling:
  enabled: true
  minReplicas: 2
  maxReplicas: 5
  targetCPU: 70

Haute disponibilite avec Infinispan

Keycloak utilise Infinispan pour le cache distribue entre les instances. Sur Kubernetes, la decouverte se fait via DNS ou KUBE_PING.

# Configuration du cache distribue
cache:
  stack: kubernetes

# Variables d'environnement pour KUBE_PING
extraEnvVars:
  - name: JAVA_OPTS_APPEND
    value: "-Djgroups.dns.query=keycloak-headless.keycloak.svc.cluster.local"
  - name: KC_CACHE_CONFIG_FILE
    value: "cache-ispn.xml"

Base de donnees externe PostgreSQL

# Deployer PostgreSQL HA avec le chart Bitnami
helm install postgres bitnami/postgresql-ha \
  --namespace keycloak \
  --set postgresql.replicaCount=3 \
  --set postgresql.password=secret123

# Ou utiliser un service manage (RDS, Cloud SQL)
externalDatabase:
  host: keycloak-db.xxxx.rds.amazonaws.com
  port: 5432
  database: keycloak

Ingress TLS avec cert-manager

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: keycloak-ingress
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/proxy-buffer-size: "128k"
spec:
  ingressClassName: nginx
  tls:
  - hosts:
    - auth.mondomaine.com
    secretName: keycloak-tls
  rules:
  - host: auth.mondomaine.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: keycloak
            port:
              number: 80
Important : En production, utilisez toujours une base de donnees externe avec des sauvegardes automatiques. La base embarquee H2 ne supporte pas le clustering.