Instalando o Keycloak no Kubernetes e Nginx

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

helm install keycloak bitnami/keycloak –set proxyAddressForwarding=true –set auth.adminPassword=’ XyzaAbc’ –set externalDatabase.host=’my-key-db-db.postgres.database.azure.com’ –set externalDatabase.port=5432 –set externalDatabase.database=my-keydb –set externalDatabase.user=’mypostgreesqluser’ –set externalDatabase.password=’My@dbPasswWord!’ –set postgresql.persistence.enabled=false –set postgresql.enabled=false –set replicaCount=3 –set serviceDiscovery.enabled=true –set rbac.create=true

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