Hello everyone! I hope you are all well!
I’m trying to use Keycloak version 26.1.0 in cluster mode.
My scenario:
I have an internal load balancer that points to an Azure Scale-Set. In this scale-set, I have two VMs. In each one, I have a docker-compose that configures Keycloak for me.
When I run my containers, Keycloak starts cluster mode successfully, but it uses the internal IP of the Docker network. This causes me to have several timeouts when it tries to communicate with the other instance, since the instances are in different VMs, with different internal networks.
I effectively have communication between the VMs, through the VM IP and with the appropriate ports (7800).
My Docker - VM01
keycloak01:
image: keycloak:26.1.0
container_name: keycloak01
command:
- start
- --truststore-paths=/opt/keycloak/certs/DigiCertGlobalRootCA.crt,/opt/keycloak/certs/DigiCertGlobalRootG2.crt.pem,/opt/keycloak/certs/MicrosoftRsaRootCertificateAuthority2017.cert
environment:
KC_BOOTSTRAP_ADMIN_USERNAME: sreadmin
KC_BOOTSTRAP_ADMIN_PASSWORD: “admin”
KC_DB: postgres
KC_DB_URL: “jdbc:postgresql://domain.postgres.database.azure.com:5432/keycloak?sslmode=verify-full&sslrootcert=/opt/keycloak/certs/DigiCertGlobalRootCA.crt”
KC_DB_SCHEMA: public
KC_LOG_LEVEL: INFO
DB_DATABASE: keycloak
KC_DB_USERNAME: manager
KC_DB_PASSWORD: “pass”
KC_PROXY: edge
KC_HOSTNAME: keycloak01
KC_HTTP_ENABLED: “true”
KC_HOSTNAME_STRICT: true
KC_CACHE: ispn
KC_CACHE_STACK: jdbc-ping #
KC_JGROUPS_DISCOVERY_PROTOCOL: JDBC_PING
JGROUPS_DISCOVERY_EXTERNAL_IP: 10.6.6.5
JGROUPS_BIND_ADDR: 10.6.6.5
ports:
- “80:8080” # Porta HTTP
- “7800:7800”
volumes:
- ./certs:/opt/keycloak/certs:ro
restart: always
networks:
- app-network
My Docker - VM02
keycloak02:
image: keycloak:26.1.0
container_name: keycloak02
command:
- start
- --truststore-paths=/opt/keycloak/certs/DigiCertGlobalRootCA.crt,/opt/keycloak/certs/DigiCertGlobalRootG2.crt.pem,/opt/keycloak/certs/MicrosoftRsaRootCertificateAuthority2017.cert
environment:
KC_BOOTSTRAP_ADMIN_USERNAME: sreadmin
KC_BOOTSTRAP_ADMIN_PASSWORD: “admin”
KC_DB: postgres
KC_DB_URL: “jdbc:postgresql://domain.database.azure.com:5432/keycloak?sslmode=verify-full&sslrootcert=/opt/keycloak/certs/DigiCertGlobalRootCA.crt”
KC_DB_SCHEMA: public
KC_LOG_LEVEL: INFO
DB_DATABASE: keycloak
KC_DB_USERNAME: manager
KC_DB_PASSWORD: “pass”
KC_PROXY: edge
KC_HOSTNAME: keycloak02
KC_HTTP_ENABLED: “true”
KC_HOSTNAME_STRICT: true
KC_CACHE: ispn
KC_CACHE_STACK: jdbc-ping #
KC_JGROUPS_DISCOVERY_PROTOCOL: JDBC_PING
JGROUPS_DISCOVERY_EXTERNAL_IP: 10.6.6.6
JGROUPS_BIND_ADDR: 10.6.6.6
ports:
- “80:8080” # Porta HTTP
- “7800:7800”
volumes:
- ./certs:/opt/keycloak/certs:ro
restart: always
networks:
- app-network
Logs:
keycloak01 | 2025-02-07 11:46:33,240 INFO [org.infinispan.CLUSTER] (main) ISPN000078: Starting JGroups channel ISPN
with stack jdbc-ping
keycloak01 | 2025-02-07 11:46:33,242 INFO [org.jgroups.JChannel] (main) local_addr: a5d5d19a-1af4-46a3-8d4f-36f6f603b0c0, name: af13e6b70dd6-35000
keycloak01 | 2025-02-07 11:46:33,253 INFO [org.jgroups.protocols.FD_SOCK2] (main) server listening on *.57800
keycloak01 | 2025-02-07 11:46:33,269 INFO [org.jgroups.protocols.pbcast.GMS] (main) af13e6b70dd6-35000: no members discovered after 14 ms: creating cluster as coordinator
keycloak01 | 2025-02-07 11:46:33,293 INFO [org.infinispan.CLUSTER] (main) ISPN000094: Received new cluster view for channel ISPN: [af13e6b70dd6-35000|0] (1) [af13e6b70dd6-35000]
keycloak01 | 2025-02-07 11:46:33,393 INFO [org.infinispan.CLUSTER] (main) ISPN000079: Channel ISPN
local address is af13e6b70dd6-35000
, physical addresses are [172.28.0.2:7800]
keycloak01 | 2025-02-07 11:46:33,904 INFO [org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory] (main) Node name: af13e6b70dd6-35000, Site name: null
keycloak01 | 2025-02-07 11:46:33,910 INFO [org.keycloak.broker.provider.AbstractIdentityProviderMapper] (main) Registering class org.keycloak.broker.provider.mappersync.ConfigSyncEventListener
keycloak01 | 2025-02-07 11:46:35,637 WARN [io.agroal.pool] (main) Datasource ‘’: JDBC resources leaked: 3 ResultSet(s) and 0 Statement(s)
keycloak01 | 2025-02-07 11:46:35,837 INFO [io.quarkus] (main) Keycloak 26.1.0 on JVM (powered by Quarkus 3.15.2) started in 10.822s. Listening on: http://0.0.0.0:8080
keycloak01 | 2025-02-07 11:46:35,838 INFO [io.quarkus] (main) Profile prod activated.
keycloak01 | 2025-02-07 11:46:35,838 INFO [io.quarkus] (main) Installed features: [agroal, cdi, hibernate-orm, jdbc-postgresql, keycloak, narayana-jta, opentelemetry, reactive-routes, rest, rest-jackson, smallrye-context-propagation, vertx]
keycloak01 | 2025-02-07 11:46:36,227 WARN [org.jgroups.protocols.TCP] (TcpServer.Acceptor[7800]-1,af13e6b70dd6-35000) JGRP000006: 172.28.0.2:7800: failed accepting connection from peer Socket[addr=/168.63.129.16,port=58536,localport=7800]: java.net.SocketTimeoutException: Read timed out
keycloak01 | 2025-02-07 11:46:51,232 WARN [org.jgroups.protocols.TCP] (TcpServer.Acceptor[7800]-1,af13e6b70dd6-35000) JGRP000006: 172.28.0.2:7800: failed accepting connection from peer Socket[addr=/168.63.129.16,port=58785,localport=7800]: java.net.SocketTimeoutException: Read timed out
…
With the variables:
JGROUPS_DISCOVERY_EXTERNAL_IP: 10.6.6.6
JGROUPS_BIND_ADDR: 10.6.6.6
Shouldn’t jdbc use these IPs instead of the internal IPs? Could someone help me? Thanks