Instalando o Keycloak no Kubernetes e Nginx
25 de abril de 2021O 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.1helm 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