Instalando o Keycloak no Kubernetes e Nginx

25 de abril de 2021 Por Ramon Durães

O Keycloak é uma plataforma Open Source para gerenciamento de segurança nas aplicações com suporte aos protocolos padrões OpenID Connect, OAuth 2.0, SAML 2.0. Para comparar com ferramentas similares você pode consultar o Auth0, Amazon Cognito, Azure Active Directory e muitas outras soluções que cuidam da segurança das suas aplicações, API’s e Microservices.

No meu cenário estou utilizando um cluster de Kubernetes criado no Azure Kubernetes Service (AKS). Portanto é necessário que já o cluster criado e as ferramentas Kubectl e Helm instaladas em seu ambiente.

Para publicar o Keycloak nós utilizaremos o pacote Helm montado pela Bitnami. Você pode utilizar outro pacote e/ou seguir os passos na documentação oficial do produto. Para realizar o deployment padrão basta seguir os passos abaixo:

1) Adicione uma referência no helm
helm repo add bitnami https://charts.bitnami.com/bitnami
2) Execute o update do helm
helm repo update
3) Execute a instalação do pacote
helm install keycloak bitnami/keycloak


Após executar já pode acompanhar o resultado listando os pods e visualizar o Keycloak e o PostgreSQL
com o comando abaixo:
kubectl get pods

Durante a utilização do Helm é possível passar parâmetros ao Keycloak para definir por exemplo um banco de dados externo e outras configurações como o parâmetro para suporte ao nginx.

No exemplo abaixo nós estamos adicionando uma segunda replica
helm upgrade keycloak bitnami/keycloak --replicaCount=2 --set auth.adminPassword='XyzaAbc'

Nesse exemplo publicaremos o keycloak e definindo uma senha admin além o proxyAddressForwarding, pois utilizarei o ingress do nginx como meio de acesso ao meu cluster e o keycloak precisar dessa configuração para
funcionar corretamente.

Exemplo adicionando o proxyAddressForwarding, serviceDiscovery, rbac
helm install keycloak bitnami/keycloak --set proxyAddressForwarding=true --set auth.adminPassword='XyzaAbc' --set replicaCount=3 --set serviceDiscovery.enabled=true --set rbac.create=true

Exemplo keycloack utilizando um banco de dados postgree externo. Você pode utilizar essa abordagem para recuperar o keycloack de um backup. Confirme a versão do PostgreSQL.

helm install keycloak azure-marketplace/keycloak --set proxyAddressForwarding=true --set auth.adminPassword="Xyz#(*na" --set externalDatabase.host="mydb.myhost.com" --set externalDatabase.port=5432 --set externalDatabase.database="keycloak" --set externalDatabase.user="mydbuser" --set externalDatabase.password="myDb@passWoind" --set postgresql.persistence.enabled=false --set postgresql.enabled=false --set serviceDiscovery.enabled=true --set rbac.create=true --set replicaCount=2

Exemplo keycloack utilizando os parâmetros para compatibilidade
A atualização do Keycloak modificou comportamentos e temos os parâmetros “spi-login-protocol-openid-connect-legacy-logout-redirect-uri=true e spi-login-protocol-openid-connect-suppress-logout-confirmation-screen” aplicados no helm 15.1.1 keycloak – 21.1.1

helm install keycloak bitnami/keycloak --set proxyAddressForwarding=true --set auth.adminPassword="@YouPassword" --set externalDatabase.host="db-postgresql-11.postgres.database.azure.com" --set externalDatabase.port=5432 --set externalDatabase.database="keycloak" --set externalDatabase.user="dbadmin" --set externalDatabase.password="@you-DB-Password" --set postgresql.persistence.enabled=false --set postgresql.enabled=false --set serviceDiscovery.enabled=true --set rbac.create=true --set replicaCount=3 --set autoscaling.enabled=true --set autoscaling.minReplicas=3 --set autoscaling.maxReplicas=10 --set extraStartupArgs="--spi-login-protocol-openid-connect-legacy-logout-redirect-uri=true --spi-login-protocol-openid-connect-suppress-logout-confirmation-screen=true" --version 15.1.1



A configuração padrão do helm keycloak da bitnami cria um service no kubernetes e vincula a um ip externo conforme é possível acompanhar no comando abaixo.

Obtendo a lista de serviços
kubectl get svc

Obtendo a lista de volumes pois o keycloak utiliza o PersistentVolumeClaim (PVC) / PostgreSQL
kubectl get pvc

Para verficar o Role-based access control (RBAC) criado
kubectl get roles

Para verificar o StatefulSets
kubectl get statefulsets

Para acessar o portal
Faça um mapeamento utilizando port forward e acesse http://localhost:80 utilizando o usuário “user” e a senha
informada na instalação.
kubectl port-forward service/keycloak 80:80

No exemplo abaixo segue uma implementação de exemplo para configuração do ingress

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ingress-keycloak-v1
  annotations:
    cert-manager.io/cluster-issuer: letsencrypt-prod
    nginx.ingress.kubernetes.io/rewrite-target: /
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/proxy-buffer-size: "128k"    
spec:
  tls:
  - hosts:
      - myid.devprime.tech 
    secretName: secret-ssl-keycloak
  rules:
  - host: "myid.devprime.tech"
    http:
      paths:
      - pathType: Prefix
        path: "/"
        backend:
          service:
            name: keycloak
            port:
              number: 80

Informações importantes:

1) Para utilizar o keycloak com o ingress do nginx utilize “proxyAddressForwarding, serviceDiscovery, rbac”
2) Se vai reinstalar o keycloak e não tem a senha delete o pvc
3) A minha recomendação é utilizar um banco de dados externos gerenciado pelo Cloud
4) Adicione caso utilize nginx o proxy-buffer-size na configuração do ingress, pois ele recebe o redirect grande
5) Para excluir o pacote helm delete keycloak e apage também o PersistentVolumeClaim (PVC) relacionado
caso faça o teste padrão.

Para saber mais:
Keycloak
A deep dive into Keycloak
502 Error from Ingress in Keycloak response
Module ngx_http_proxy_module
Advanced Configuration with Annotations
– Agradecimento ao Felipe Oliveira pela contribuição.

Gostaria de ajuda na estratégia de software e modernização de aplicações? Faça contato e conheça o nosso produto DevPrime.


[],
Ramon Durães