Kubernetes – Installation de Keycloak – part 1

By | 23 juin 2021

Dans cet article, nous allons voir comment procéder à l’installation d’un serveur Keycloak dans un cluster Kubernetes. Cet article fait partie d’une suite d’article sur l’utilisation de Keycloak sur K8s. Dans cette première partie, nous verrons comment installer keycloak grâce à l’image docker officielle.

Deployement

apiVersion: apps/v1
kind: Deployment
metadata:
  name: keycloak
  namespace: my-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: keycloak
  template:
    metadata:
      labels:
        app: keycloak
    spec:
      containers:
        - name: keycloak
          image: jboss/keycloak:11.0.2
          env:
            - name: KEYCLOAK_USER
              valueFrom:
                secretKeyRef:
                  name: keycloak-user-pass
                  key: username
            - name: KEYCLOAK_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: keycloak-user-pass
                  key: password
            - name: DB_VENDOR
              value: postgres
            - name: DB_ADDR
              value: postgresql
            - name: DB_PORT
              value: '5432'
            - name: DB_DATABASE
              value: keycloak
            - name: DB_USER
              value: keycloak
            - name: DB_PASSWORD
              valueFrom:
                secretKeyRef:
                  name: keycloak-db-pass
                  key: password
            - name: PROXY_ADDRESS_FORWARDING
              value: 'true'
          ports:
            - containerPort: 8080
              name: keycloak
          livenessProbe:
            httpGet:
              port: 8080
              path: /auth/realms/master
            initialDelaySeconds: 120
            periodSeconds: 5
          readinessProbe:
            httpGet:
              port: 8080
              path: /auth/realms/master
            initialDelaySeconds: 30
            periodSeconds: 1

Nous utilisons donc un Deployement afin de définir comment sera déployé notre instance de Keycloak. Grâce aux variables d’environnement, nous pouvons définir le premier utilisateur administrateur ainsi que la base de données de connexion. Une variable importante est PROXY_ADDRESS_FORWARDING. Cela permet de dire à Keycloak qu’il se trouve derrière un proxy et de générer les URLs en conséquence. Nous utilisons l’URL /auth/realms/master afin de faire les tests de liveness et readyness.

Par défaut, Keycloak démarrera sur une base de données embarquée H2. Les données seront perdues une fois le pod détruit. Cela peut être utile dans le cadre de test d’intégration par exemple. Dans notre cas, nous voulons une persistance des données. Nous définissons donc les paramètres de connexion à la base de données via les variables d’environnement suivantes :

  • DB_VENDOR : La moteur de base de données. Les valeurs supportées sont ( postgres, mariadb, mysql, oracle, mssql, h2)
  • DB_ADDR : L’adresse de la base de données. Cela peut être une adresse externe au cluster ou une adresse interne. Dans ce cas, si la base de données est dans le même namespace, il suffit d’indiquer le nom du pod. (ex : postgresql). Sinon, il faudra indiquer le chemin complet ( ex: postgresql.<namespace>.svc.cluster.local )
  • DB_PORT : Le port de la base de donnée.
  • DB_DATABASE : Le nom de la base de donnée créé par défaut.
  • DB_USER : L’utilisateur associé à la base de données nouvellement créé
  • DB_PASSWORD : Le mot de passe de l’utilisateur.

Maintenant, que nous avons notre déploiement, il nous faut rendre accessible Keycloak à l’extérieur du cluster. Si vous êtes sur GCE ou AWS, un service de type load balancer suffit. Si comme moi, vous être sur du baremetal, il faudra créer un service et un ingress comme ceci.

apiVersion: v1
kind: Service
metadata:
  name: keycloak
  labels:
    app: keycloak
  namespace: my-app
spec:
  type: ClusterIP
  ports:
    - port: 8080
      name: keycloak
  selector:
    app: keycloak
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: keycloak-ingress
  namespace: my-app
spec:
  ingressClassName: nginx
  rules:
    - host: auth.<DOMAIN_NAME>
      http:
        paths:
          - backend:
              service:
                name: keycloak
                port:
                  name: keycloak
            path: /
            pathType: Prefix

Rien de particulier ici. Une Ingress, redirige l’ensemble des flux arrivant sur auth.<DOMAIN_NAME> vers le service keycloak sur le port keycloak. Ce dernier redirige le flux sur notre container sur le port 8080.

Voilà qui conclut cet article sur une installation simple de Keycloak sur Kubernetes. Dans un prochain, article nous verrons comment utiliser l’Operator officiel de Keycloak afin de faciliter le déploiement, la mise à jour et le bakcup d’instance Keycloak.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.