TL;DR: Π±ΡΠ΄Π΅Ρ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Keycloak, ΡΠΈΡΡΠ΅ΠΌΡ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π΄ΠΎΡΡΡΠΏΠ° Ρ ΠΎΡΠΊΡΡΡΡΠΌ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, ΡΠ°Π·Π±ΠΎΡ Π²Π½ΡΡΡΠ΅Π½Π½Π΅Π³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, Π΄Π΅ΡΠ°Π»ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ.
ΠΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΈΠ΄Π΅ΠΈ
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΡΠ΅ ΠΈΠ΄Π΅ΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΏΠΎΠΌΠ½ΠΈΡΡ ΠΏΡΠΈ ΡΠ°Π·Π²ΠΎΡΠ°ΡΠΈΠ²Π°Π½ΠΈΠΈ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Keycloak ΠΏΠΎΠ²Π΅ΡΡ Kubernetes.
ΠΡΠ»ΠΈ ΠΆΠ΅Π»Π°Π΅ΡΠ΅ Π·Π½Π°ΡΡ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ ΠΎ Keycloak β ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ ΡΡΡΠ»ΠΊΠ°ΠΌ Π² ΠΊΠΎΠ½ΡΠ΅ ΡΡΠ°ΡΡΠΈ. ΠΠ»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠΈΠ»ΡΠ½Π΅Π΅ ΠΏΠΎΠ³ΡΡΠ·ΠΈΡΡΡΡ Π² ΠΏΡΠ°ΠΊΡΠΈΠΊΡ β ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΠ·ΡΡΠΈΡΡ
Keycloak β ΡΡΠΎ ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡΠ½Π°Ρ ΡΠΈΡΡΠ΅ΠΌΠ°, Π½Π°ΠΏΠΈΡΠ°Π½Π½Π°Ρ Π½Π° Java ΠΈ ΠΏΠΎΡΡΡΠΎΠ΅Π½Π½Π°Ρ ΠΏΠΎΠ²Π΅ΡΡ
ΡΠ΅ΡΠ²Π΅ΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ
ΠΡΠΈΠ³Π»Π°ΡΠ°Π΅ΠΌ ΠΏΠΎΡΠΈΡΠ°ΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΡΠΉ
ΠΠ°ΠΏΡΡΠΊ Keycloak
ΠΠ»Ρ Keycloak Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π²Π° ΠΏΠΎΡΡΠΎΡΠ½Π½ΠΎ Ρ ΡΠ°Π½ΠΈΠΌΡΡ ΠΈΡΡΠΎΡΠ½ΠΈΠΊΠ° Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ Π·Π°ΠΏΡΡΠΊΠ°:
- ΠΠ°Π·Π° Π΄Π°Π½Π½ΡΡ , ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΠ°Ρ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΡΡΠΎΡΠ²ΡΠΈΡ ΡΡ Π΄Π°Π½Π½ΡΡ , Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡ
- Datagrid cache, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΈΠ· Π±Π°Π·Ρ, Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΠΊΠΎΡΠΎΡΠΊΠΎΠΆΠΈΠ²ΡΡΠΈΡ
ΠΈ ΡΠ°ΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌΡΡ
ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ
ΡΠ΅ΡΡΠΈΠΉ. Π Π΅Π»ΠΈΠ·ΡΠ΅ΡΡΡ
Infinispan , ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΡΠ½ΠΎ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΡΡΡΡΠ΅Π΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ . ΠΠΎ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌΡΠ΅ Π² Infinispan Π΄Π°Π½Π½ΡΠ΅ ΡΡΠ΅ΠΌΠ΅ΡΠ½Ρ β ΠΈ ΠΈΡ Π½Π΅ Π½Π°Π΄ΠΎ ΠΊΡΠ΄Π°-Π»ΠΈΠ±ΠΎ ΡΠΎΡ ΡΠ°Π½ΡΡΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°.
Keycloak ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΡΠ΅ΡΡΡΠ΅Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΡΠ΅ΠΆΠΈΠΌΠ°Ρ :
- ΠΠ±ΡΡΠ½ΡΠΉ β ΠΎΠ΄ΠΈΠ½ ΠΈ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΡΠΎΡΠ΅ΡΡ, Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ ΡΠ΅ΡΠ΅Π· ΡΠ°ΠΉΠ» standalone.xml
- ΠΠ±ΡΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡΠ΅Ρ (Π²ΡΡΠΎΠΊΠΎΠ΄ΠΎΡΡΡΠΏΠ½ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ) β Π²ΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ Π½Π°Π΄ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²ΡΡΡΠ½ΡΡ. ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ Ρ ΡΠ°Π½ΡΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ standalone-ha.xml, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π°Π΄ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΠΎΠ±ΡΠΈΠΉ Π΄ΠΎΡΡΡΠΏ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ ΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊ Π½Π°Π³ΡΡΠ·ΠΊΠΈ.
- ΠΠΎΠΌΠ΅Π½Π½ΡΠΉ ΠΊΠ»Π°ΡΡΠ΅Ρ β Π·Π°ΠΏΡΡΠΊ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Π² ΠΎΠ±ΡΡΠ½ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Π±ΡΡΡΡΠΎ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΡΡΠΈΠ½Π½ΡΠΌ ΠΈ ΡΠΊΡΡΠ½ΡΠΌ Π·Π°Π½ΡΡΠΈΠ΅ΠΌ ΠΏΡΠΈ ΡΠΎΡΡΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π½Π°Π΄ΠΎ Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²Π½Π΅ΡΡΠΈ Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΡΠ·Π»Π΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°. ΠΠΎΠΌΠ΅Π½Π½ΡΠΉ ΡΠ΅ΠΆΠΈΠΌ ΡΠ°Π±ΠΎΡΡ ΡΠ΅ΡΠ°Π΅Ρ ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ ΠΏΡΡΠ΅ΠΌ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅Π³ΠΎ ΠΌΠ΅ΡΡΠ° Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΈ ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ. ΠΡΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Ρ ΡΠ°Π½ΡΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ domain.xml
- Π Π΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°ΠΌΠΈ β Π² ΡΠ»ΡΡΠ°Π΅, Π΅ΡΠ»ΠΈ Ρ ΠΎΡΠΈΡΠ΅ Π·Π°ΠΏΡΡΡΠΈΡΡ Keycloak Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠΎΠ², ΡΠ°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ Π² ΡΠ°Π·Π½ΡΡ ΠΌΠ΅ΡΡΠ°Ρ Π³Π΅ΠΎΠ³ΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ. Π ΡΡΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΡΠ°Π±ΠΎΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡ Π±ΡΠ΄Π΅Ρ ΠΈΠΌΠ΅ΡΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΊΠ»Π°ΡΡΠ΅Ρ Keycloak ΡΠ΅ΡΠ²Π΅ΡΠΎΠ².
Π ΡΡΠΎΠΉ ΡΡΠ°ΡΡΠ΅ ΠΌΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²ΡΠΎΡΠΎΠΉ Π²Π°ΡΠΈΠ°Π½Ρ, ΡΠΎ Π΅ΡΡΡ ΠΎΠ±ΡΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡΠ΅Ρ, Π° ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°ΡΡΠΎΠ½Π΅ΠΌ ΡΠ΅ΠΌΡ Π½Π°ΡΡΠ΅Ρ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°ΠΌΠΈ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΈ Π΄Π²Π° Π²Π°ΡΠΈΠ°Π½ΡΠ° ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ» Π·Π°ΠΏΡΡΠΊΠ°ΡΡ Π² Kubernetes. Π ΡΡΠ°ΡΡΡΡ Π² Kubernetes Π½Π΅ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠ΅ΠΉ Π½Π°ΡΡΡΠΎΠ΅ΠΊ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠΎΠ΄ΠΎΠ² (ΡΠ·Π»ΠΎΠ² Keycloak), ΡΠ°ΠΊ ΡΡΠΎ Π΄ΠΎΠΌΠ΅Π½Π½ΡΠΉ ΠΊΠ»Π°ΡΡΠ΅Ρ Π±ΡΠ΄Π΅Ρ Π½Π΅ ΠΎΡΠΎΠ±ΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ.
Π’Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΆΠ°Π»ΡΠΉΡΡΠ° ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΠ»ΠΎΠ²ΠΎ ΠΊΠ»Π°ΡΡΠ΅Ρ Π΄ΠΎ ΠΊΠΎΠ½ΡΠ° ΡΡΠ°ΡΡΠΈ Π±ΡΠ΄Π΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π°ΡΡΠ΅Ρ Π³ΡΡΠΏΠΏΡ ΡΠ·Π»ΠΎΠ² Keycloak, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΡ Π²ΠΌΠ΅ΡΡΠ΅, Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΡΡΠ»Π°ΡΡΡΡ Π½Π° ΠΊΠ»Π°ΡΡΠ΅Ρ Kubernetes.
ΠΠ±ΡΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡΠ΅Ρ Keycloak
ΠΠ»Ρ Π·Π°ΠΏΡΡΠΊΠ° Keycloak Π² ΡΡΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅ Π½ΡΠΆΠ½ΠΎ:
- Π½Π°ΡΡΡΠΎΠΈΡΡ Π²Π½Π΅ΡΠ½ΡΡ ΠΎΠ±ΡΡΡ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
- ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊ Π½Π°Π³ΡΡΠ·ΠΊΠΈ
- ΠΈΠΌΠ΅ΡΡ Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΡΠ΅ΡΡ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ip multicast
ΠΠ°ΡΡΡΠΎΠΉΠΊΡ Π²Π½Π΅ΡΠ½Π΅ΠΉ Π±Π°Π·Ρ ΠΌΡ ΡΠ°Π·Π±ΠΈΡΠ°ΡΡ Π½Π΅ Π±ΡΠ΄Π΅ΠΌ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΠ½Π° Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π»ΡΡ Π΄Π°Π½Π½ΠΎΠΉ ΡΡΠ°ΡΡΠΈ. ΠΠ°Π²Π°ΠΉΡΠ΅ Π±ΡΠ΄Π΅ΠΌ ΡΡΠΈΡΠ°ΡΡ, ΡΡΠΎ Π³Π΄Π΅-ΡΠΎ Π΅ΡΡΡ ΡΠ°Π±ΠΎΡΠ°ΡΡΠ°Ρ Π±Π°Π·Π° Π΄Π°Π½Π½ΡΡ β ΠΈ Ρ Π½Π°Ρ ΠΊ Π½Π΅ΠΉ Π΅ΡΡΡ ΡΠΎΡΠΊΠ° ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ. ΠΡ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ.
ΠΠ»Ρ Π»ΡΡΡΠ΅Π³ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Keycloak ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π² ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΠΌ (HA) ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅, Π²Π°ΠΆΠ½ΠΎ Π·Π½Π°ΡΡ, ΠΊΠ°ΠΊ ΡΠΈΠ»ΡΠ½ΠΎ ΡΡΠΎ Π²ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΠ΅ΠΉ Wildfly ΠΊ ΠΊΠ»Π°ΡΡΠ΅ΡΠΈΠ·Π°ΡΠΈΠΈ.
Wildfly ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ° Π½Π°Π³ΡΡΠ·ΠΊΠΈ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ β Π΄Π»Ρ ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΠΈ. ΠΠ°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊ Π½Π°Π³ΡΡΠ·ΠΊΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΈ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠ΅ ΡΠ·Π»Π° ΠΊΠ»Π°ΡΡΠ΅ΡΠ°, Π° ΠΎΡΠΊΠ°Π·ΠΎΡΡΡΠΎΠΉΡΠΈΠ²ΠΎΡΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π°ΠΆΠ΅ Π² ΡΠ»ΡΡΠ°Π΅ ΠΎΡΠΊΠ°Π·Π° ΡΠ°ΡΡΠΈ ΡΠ·Π»ΠΎΠ² ΠΊΠ»Π°ΡΡΠ΅ΡΠ°. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΡΡΠΈΡ ΠΏΠΎΠ΄ΡΠΈΡΡΠ΅ΠΌ:
-
mod_cluster
: ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ Apache Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ° HTTP, Π·Π°Π²ΠΈΡΠΈΡ ΠΎΡ TCP multicast Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ·Π»ΠΎΠ² ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ. ΠΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π·Π°ΠΌΠ΅Π½Π΅Π½ Π²Π½Π΅ΡΠ½ΠΈΠΌ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊΠΎΠΌ. -
infinispan
: ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΊΡΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΠΉ ΠΊΠ°Π½Π°Π»Ρ JGroups Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΡΠ°Π½ΡΠΏΠΎΡΡΠ½ΠΎΠ³ΠΎ ΡΡΠΎΠ²Π½Ρ. ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» HotRod Π΄Π»Ρ ΡΠ²ΡΠ·ΠΈ Ρ Π²Π½Π΅ΡΠ½ΠΈΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠΌ Infinispan Π΄Π»Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΠΊΡΡΠ°. -
jgroups
: ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΡΠ²ΡΠ·ΠΈ Π³ΡΡΠΏΠΏ Π΄Π»Ρ Π²ΡΡΠΎΠΊΠΎΠ΄ΠΎΡΡΡΠΏΠ½ΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ² Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΊΠ°Π½Π°Π»ΠΎΠ² JGroups. ΠΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡΠ΅ ΠΊΠ°Π½Π°Π»Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½ΡΡΡΡΡ Π² Π³ΡΡΠΏΠΏΡ ΡΠ°ΠΊ, ΡΡΠΎ ΡΠ²ΡΠ·Ρ ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ ΡΠ°ΠΊΠΈΠΌΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌΠΈ, ΠΊΠ°ΠΊ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΡ, ΡΠΏΠΎΡΡΠ΄ΠΎΡΠ΅Π½Π½ΠΎΡΡΡ, ΡΡΠ²ΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΊ ΡΠ±ΠΎΡΠΌ.
ΠΠ°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊ Π½Π°Π³ΡΡΠ·ΠΊΠΈ
ΠΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ΅ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ingress ΠΊΠΎΠ½ΡΡΠΎΠ»Π»Π΅ΡΠ° Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Kubernetes Π²Π°ΠΆΠ½ΠΎ ΠΈΠΌΠ΅ΡΡ Π² Π²ΠΈΠ΄Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²Π΅ΡΠΈ:
Π Π°Π±ΠΎΡΠ° Keycloak ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ, ΡΡΠΎ ΡΠ΄Π°Π»Π΅Π½Π½ΡΠΉ Π°Π΄ΡΠ΅Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΏΠΎ HTTP ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π°Π»ΡΠ½ΡΠΌ ip-Π°Π΄ΡΠ΅ΡΠΎΠΌ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ°. ΠΠ°ΡΡΡΠΎΠΉΠΊΠΈ Π±Π°Π»Π°Π½ΡΠΈΡΠΎΠ²ΡΠΈΠΊΠ° ΠΈ ingress Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΈ HTTP X-Forwarded-For
ΠΈ X-Forwarded-Proto
, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠΎΡ
ΡΠ°Π½ΡΡΡ ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΡΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ HOST
. ΠΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ ingress-nginx
(> 0.22.0)
ΠΠΊΡΠΈΠ²Π°ΡΠΈΡ ΡΠ»Π°Π³Π° proxy-address-forwarding
ΠΏΡΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ PROXY_ADDRESS_FORWARDING
Π² true
Π΄Π°Π΅Ρ Keycloak ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΎΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π·Π° proxy.
Π’Π°ΠΊΠΆΠ΅ Π½Π°Π΄ΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ sticky sessions Π² ingress. Keycloak ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅Ρ ΡΠ°ΡΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΉ ΠΊΡΡ Infinispan Π΄Π»Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ , ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ΅ΡΡΠΈΠ΅ΠΉ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΎΠΉ ΡΠ΅ΡΡΠΈΠ΅ΠΉ. ΠΡΡΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΎΠ΄Π½ΠΈΠΌ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅ΠΌ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ ΡΡΠ° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°Ρ ΡΠ΅ΡΡΠΈΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π½Π° Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΠ·Π»Π΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ°, Π° Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ·Π»Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ Π΅Π΅ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎ, Π΅ΡΠ»ΠΈ ΠΈΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΡΠΎΠΉ ΡΠ΅ΡΡΠΈΠΈ.
ΠΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎ Ρ Π½Π°Ρ Π²ΠΎΠΏΡΠ΅ΠΊΠΈ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π½Π΅ ΡΡΠ°Π±ΠΎΡΠ°Π»ΠΎ ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΡΠΈΠΈ Ρ ΠΈΠΌΠ΅Π½Π΅ΠΌ cookie
AUTH_SESSION_ID
. Keycloak Π·Π°ΡΠΈΠΊΠ»ΠΈΠ» ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΠΌ Π²ΡΠ±ΡΠ°ΡΡ Π΄ΡΡΠ³ΠΎΠ΅ ΠΈΠΌΡ cookie Π΄Π»Ρ sticky session.
Π’Π°ΠΊΠΆΠ΅ Keycloak ΠΏΡΠΈΠΊΡΠ΅ΠΏΠ»ΡΠ΅Ρ ΠΈΠΌΡ ΡΠ·Π»Π°, ΠΎΡΠ²Π΅ΡΠΈΠ²ΡΠ΅Π³ΠΎ ΠΏΠ΅ΡΠ²ΡΠΌ, ΠΊ AUTH_SESSION_ID
, Π° ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ·Π΅Π» Π² Π²ΡΡΠΎΠΊΠΎΠ΄ΠΎΡΡΡΠΏΠ½ΠΎΠΌ Π²Π°ΡΠΈΠ°Π½ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
, ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· Π½ΠΈΡ
JAVA_OPTS
ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ jboss.node.name
ΠΈ jboss.tx.node.id
ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΌΠΈ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ·Π»Π° β ΠΌΠΎΠΆΠ½ΠΎ ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΡΠ°Π²ΠΈΡΡ ΠΈΠΌΡ ΠΏΠΎΠ΄Π°. ΠΡΠ»ΠΈ Π±ΡΠ΄Π΅ΡΠ΅ ΡΡΠ°Π²ΠΈΡΡ ΠΈΠΌΡ ΠΏΠΎΠ΄Π° β Π½Π΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅ ΠΏΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π² 23 ΡΠΈΠΌΠ²ΠΎΠ»Π° Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
jboss, ΡΠ°ΠΊ ΡΡΠΎ Π»ΡΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ StatefulSet, Π° Π½Π΅ Deployment.
ΠΡΠ΅ ΠΎΠ΄Π½ΠΈ Π³ΡΠ°Π±Π»ΠΈ β Π΅ΡΠ»ΠΈ ΠΏΠΎΠ΄ ΡΠ΄Π°Π»ΡΠ΅ΡΡΡ ΠΈΠ»ΠΈ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ, Π΅Π³ΠΎ ΠΊΡΡ ΡΠ΅ΡΡΠ΅ΡΡΡ. Π‘ ΡΡΠ΅ΡΠΎΠΌ ΡΡΠΎΠ³ΠΎ ΡΡΠΎΠΈΡ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΈΡΠ»ΠΎ Π²Π»Π°Π΄Π΅Π»ΡΡΠ΅Π² ΠΊΡΡΠ° Π΄Π»Ρ Π²ΡΠ΅Ρ
ΠΊΡΡΠ΅ΠΉ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅ ΡΠ΅ΠΌ Π² Π΄Π²Π°, ΡΠ°ΠΊ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΠ°Π²Π°ΡΡΡΡ ΠΊΠΎΠΏΠΈΡ ΠΊΡΡΠ°. Π Π΅ΡΠ΅Π½ΠΈΠ΅ β Π·Π°ΠΏΡΡΡΠΈΡΡ /opt/jboss/startup-scripts
Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅:
Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠΊΡΠΈΠΏΡΠ°
embed-server --server-config=standalone-ha.xml --std-out=echo
batch
echo * Setting CACHE_OWNERS to "${env.CACHE_OWNERS}" in all cache-containers
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=owners, value=${env.CACHE_OWNERS:1})
run-batch
stop-embedded-server
ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ CACHE_OWNERS
Π² ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ΅.
ΠΡΠΈΠ²Π°ΡΠ½Π°Ρ ΡΠ΅ΡΡ Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΎΠΉ ip multicast
ΠΡΠ»ΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΠ΅ Weavenet Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ CNI, multicast Π±ΡΠ΄Π΅Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΡΠ°Π·Ρ ΠΆΠ΅ β ΠΈ Π²Π°ΡΠΈ ΡΠ·Π»Ρ Keycloak Π±ΡΠ΄ΡΡ Π²ΠΈΠ΄Π΅ΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π°, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π±ΡΠ΄ΡΡ Π·Π°ΠΏΡΡΠ΅Π½Ρ.
ΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π½Π΅Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ip multicast Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Kubernetes, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ JGroups Π½Π° ΡΠ°Π±ΠΎΡΡ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π°ΠΌΠΈ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ·Π»ΠΎΠ².
ΠΠ΅ΡΠ²ΡΠΉ Π²Π°ΡΠΈΠ°Π½Ρ β ΠΈΡΠΏΠΎΠ»ΡΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ KUBE_DNS
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ headless service
Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ·Π»ΠΎΠ² Keycloak, Π²Ρ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π΅ΡΠ΅ JGroups ΠΈΠΌΡ ΡΠ΅ΡΠ²ΠΈΡΠ°, ΠΊΠΎΡΠΎΡΠΎΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΎ Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ·Π»ΠΎΠ².
ΠΡΠ΅ ΠΎΠ΄ΠΈΠ½ Π²Π°ΡΠΈΠ°Π½Ρ β ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΌΠ΅ΡΠΎΠ΄Π° KUBE_PING
, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ API Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° ΡΠ·Π»ΠΎΠ² (Π½Π°Π΄ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ serviceAccount
Ρ ΠΏΡΠ°Π²Π°ΠΌΠΈ list
ΠΈ get
, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΏΠΎΠ΄Ρ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΡΡΠΎΠΉ serviceAccount
).
Π‘ΠΏΠΎΡΠΎΠ± ΠΏΠΎΠΈΡΠΊΠ° ΡΠ·Π»ΠΎΠ² Π΄Π»Ρ JGroups Π½Π°ΡΡΡΠ°ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΡΠ΅ΠΌ Π²ΡΡΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ JGROUPS_DISCOVERY_PROTOCOL
ΠΈ JGROUPS_DISCOVERY_PROPERTIES
. ΠΠ»Ρ KUBE_PING
Π½Π°Π΄ΠΎ Π²ΡΠ±ΡΠ°ΡΡ ΠΏΠΎΠ΄Ρ Π·Π°Π΄Π°Π²Π°Ρ namespace
ΠΈ labels
.
οΈ ΠΡΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ multicast ΠΈ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΠ΅ Π΄Π²Π° ΠΈ Π±ΠΎΠ»ΡΡΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠ² Keycloak Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Kubernetes (Π΄ΠΎΠΏΡΡΡΠΈΠΌ ΠΎΠ΄ΠΈΠ½ Π² namespace
production
, Π²ΡΠΎΡΠΎΠΉ βstaging
) β ΡΠ·Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Keycloak ΠΌΠΎΠ³ΡΡ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΠΊ Π΄ΡΡΠ³ΠΎΠΌΡ ΠΊΠ»Π°ΡΡΠ΅ΡΡ. ΠΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΡΠ½ΠΈΠΊΠ°Π»ΡΠ½ΡΠΉ multicast Π°Π΄ΡΠ΅Ρ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΠΏΡΡΠ΅ΠΌ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡjboss.default.multicast.address
ΠΈjboss.modcluster.multicast.address
Π²JAVA_OPTS
.
Π Π΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°ΠΌΠΈ
Π‘Π²ΡΠ·Ρ
Keycloak ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΠΊΡΡΠ΅ΠΉ Infinispan Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°, Π³Π΄Π΅ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Ρ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Keycloack, ΡΠΎΡΡΠ°Π²Π»Π΅Π½Π½ΡΠ΅ ΠΈΠ· ΡΠ·Π»ΠΎΠ² Keycloak. ΠΠΎ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅Ρ ΡΠ°Π·Π½ΠΈΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ·Π»Π°ΠΌΠΈ Keycloak Π² ΡΠ°Π·Π½ΡΡ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°Ρ .
Π£Π·Π»Ρ Keycloak ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ Π²Π½Π΅ΡΠ½ΡΡ Java Data Grid (ΡΠ΅ΡΠ²Π΅ΡΠ° Infinispan) Π΄Π»Ρ ΡΠ²ΡΠ·ΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°ΠΌΠΈ. Π‘Π²ΡΠ·Ρ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΠΏΠΎ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Ρ
ΠΡΡΠΈ Infinispan Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π½Π°ΡΡΡΠΎΠ΅Π½Ρ Ρ Π°ΡΡΠΈΠ±ΡΡΠΎΠΌ remoteStore
, Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΌΠΎΠ³Π»ΠΈ ΡΠΎΡ
ΡΠ°Π½ΡΡΡΡΡ Π² ΡΠ΄Π°Π»Π΅Π½Π½ΡΡ
(Π² Π΄ΡΡΠ³ΠΎΠΌ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ΅, ΠΏΡΠΈΠΌ. ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ°) ΠΊΡΡΠ°Ρ
. ΠΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° infinispan ΡΡΠ΅Π΄ΠΈ JDG ΡΠ΅ΡΠ²Π΅ΡΠΎΠ², ΡΠ°ΠΊ ΡΡΠΎ Π΄Π°Π½Π½ΡΠ΅, ΡΠΎΡ
ΡΠ°Π½ΡΠ΅ΠΌΡΠ΅ Π½Π° JDG1 Π½Π° ΠΏΠ»ΠΎΡΠ°Π΄ΠΊΠ΅ site1
Π±ΡΠ΄ΡΡ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠΎΠ²Π°Π½Ρ Π½Π° JDG2 Π½Π° ΠΏΠ»ΠΎΡΠ°Π΄ΠΊΠ΅ site2
.
ΠΡ ΠΈ Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠΈΠΉ ΡΠ΅ΡΠ²Π΅Ρ JDG ΠΎΠΏΠΎΠ²Π΅ΡΠ°Π΅Ρ ΡΠ΅ΡΠ²Π΅ΡΠ° Keycloak ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΡΠ΅ΡΠ΅Π· ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, ΡΡΠΎ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡΡΡ ΠΏΡΠΎΡΠΎΠΊΠΎΠ»Π° HotRod. Π£Π·Π»Ρ Keycloak Π½Π° site2
ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡ ΡΠ²ΠΎΠΈ ΠΊΡΡΠΈ Infinispan, ΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½Π°Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠ°Ρ ΡΠ΅ΡΡΠΈΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠΉ Π½Π° ΡΠ·Π»Π°Ρ
Keycloak Π½Π° site2
.
ΠΠ»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΠΊΡΡΠ΅ΠΉ ΡΠ°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π΅ Π΄Π΅Π»Π°ΡΡ ΡΠ΅Π·Π΅ΡΠ²Π½ΡΠ΅ ΠΊΠΎΠΏΠΈΠΈ ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΠΎΡΠΊΠ°Π·Π°ΡΡΡΡ ΠΎΡ Π·Π°ΠΏΠΈΡΠΈ Π΄Π°Π½Π½ΡΡ
ΡΠ΅ΡΠ΅Π· ΡΠ΅ΡΠ²Π΅Ρ Infinispan. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°Π΄ΠΎ ΡΠ±ΡΠ°ΡΡ Π½Π°ΡΡΡΠΎΠΉΠΊΡ remote-store
ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠΌΡ ΠΊΡΡΡ Infinispan (Π² ΡΠ°ΠΉΠ»Π΅ standalone-ha.xml), ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΉ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΠΉ replicated-cache
ΡΠ°ΠΊΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½Π΅Ρ Π±ΡΡΡ Π½ΡΠΆΠ½ΡΠΌ Π½Π° ΡΡΠΎΡΠΎΠ½Π΅ Infinispan ΡΠ΅ΡΠ²Π΅ΡΠ°.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° ΠΊΡΡΠ΅ΠΉ
ΠΡΡΡ Π΄Π²Π° ΡΠΈΠΏΠ° ΠΊΡΡΠ΅ΠΉ Π² Keycloak:
-
ΠΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ. ΠΠ½ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ ΡΡΠ΄ΠΎΠΌ Ρ Π±Π°Π·ΠΎΠΉ, ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΡ Π½Π°Π³ΡΡΠ·ΠΊΠΈ Π½Π° Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ , Π° ΡΠ°ΠΊΠΆΠ΅ Π΄Π»Ρ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ Π·Π°Π΄Π΅ΡΠΆΠΊΠΈ ΠΎΡΠ²Π΅ΡΠ°. Π ΡΡΠΎΠΌ ΡΠΈΠΏΠ΅ ΠΊΡΡΠ° Ρ ΡΠ°Π½ΠΈΡΡΡ realm, ΠΊΠ»ΠΈΠ΅Π½ΡΡ, ΡΠΎΠ»ΠΈ ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅. ΠΡΠΎΡ ΡΠΈΠΏ ΠΊΡΡΠ° Π½Π΅ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΡΠ΅ΡΡΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΡΡΠΎΡ ΠΊΡΡ β ΡΠ°ΡΡΡ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Keycloak. ΠΡΠ»ΠΈ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΠΏΠΈΡΡ Π² ΠΊΡΡΠ΅ β ΠΎΡΡΠ°Π»ΡΠ½ΡΠΌ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌ Π² ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΎΠ± ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ, ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Π·Π°ΠΏΠΈΡΡ ΠΈΡΠΊΠ»ΡΡΠ°Π΅ΡΡΡ ΠΈΠ· ΠΊΡΡΠ°. Π‘ΠΌ. ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅
work
Π΄Π°Π»Π΅Π΅, Π΄Π»Ρ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ. -
Π Π΅ΠΏΠ»ΠΈΡΠΈΡΡΠ΅ΠΌΡΠΉ. ΠΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΡΠ΅ΡΡΠΈΠΈ, offline ΡΠΎΠΊΠ΅Π½Ρ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ»Π΅Π΄ΠΈΡ Π·Π° ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ Π²Ρ ΠΎΠ΄Π° Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΠΎΠΏΡΡΠΎΠΊ ΡΠΈΡΠΈΠ½Π³Π° ΠΏΠ°ΡΠΎΠ»Π΅ΠΉ ΠΈ Π΄ΡΡΠ³ΠΈΡ Π°ΡΠ°ΠΊ. Π₯ΡΠ°Π½ΠΈΠΌΡΠ΅ Π΄Π°Π½Π½ΡΠ΅ Π² ΡΡΠΈΠΌ ΠΊΡΡΠ°Ρ β Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅, Ρ ΡΠ°Π½ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡΠΈ, Π½ΠΎ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠΎΠ²Π°Π½Ρ ΠΏΠΎ ΠΊΠ»Π°ΡΡΠ΅ΡΡ.
ΠΡΡΠΈ Infinispan
Π‘Π΅ΡΡΠΈΠΈ β ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ Π² Keycloak, ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΡΡΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π°Π·ΡΠ²Π°ΡΡΡΡ authenticationSessions
, ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ. ΠΠ°ΠΏΡΠΎΡΡ Ρ ΡΡΠΈΡ
ΠΊΡΡΠ΅ΠΉ ΠΎΠ±ΡΡΠ½ΠΎ Π½ΡΠΆΠ½Ρ Π±ΡΠ°ΡΠ·Π΅ΡΡ ΠΈ ΡΠ΅ΡΠ²Π΅ΡΠ°ΠΌ Keycloak, Π½Π΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΠΌ. ΠΠ΄Π΅ΡΡ ΠΈ ΠΏΡΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΎΡ sticky sessions, Π° ΡΠ°ΠΌΠΈ ΡΠ°ΠΊΠΈΠ΅ ΠΊΡΡΠΈ Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠΎΠ²Π°ΡΡ, Π΄Π°ΠΆΠ΅ ΠΈ Π² ΡΠ»ΡΡΠ°Π΅ Active-Active ΡΠ΅ΠΆΠΈΠΌΠ°.
Π’ΠΎΠΊΠ΅Π½Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ. ΠΡΠ΅ΡΠ΅Π΄Π½Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΠΈΡ, ΠΎΠ±ΡΡΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ
ΡΡΠ΅Π½Π°ΡΠΈΠ΅Π², ΠΊΠΎΠ³Π΄Π°, ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ, ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ-ΡΠΎ Π°ΡΠΈΠ½Ρ
ΡΠΎΠ½Π½ΠΎ ΠΏΠΎ ΠΏΠΎΡΡΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ forget password
ΠΊΡΡ actionTokens
ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
ΡΠ²ΡΠ·Π°Π½Π½ΡΡ
ΡΠΎΠΊΠ΅Π½ΠΎΠ² β ΠΊ ΠΏΡΠΈΠΌΠ΅ΡΡ ΡΠΎΠΊΠ΅Π½ ΡΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½, ΠΈ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°Π½ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ. ΠΡΠΎΡ ΡΠΈΠΏ ΠΊΡΡΠ° ΠΎΠ±ΡΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°ΠΌΠΈ.
ΠΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΡΡΠ°ΡΠ΅Π²Π°Π½ΠΈΠ΅ Ρ
ΡΠ°Π½ΠΈΠΌΡΡ
Π΄Π°Π½Π½ΡΡ
ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ½ΡΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Ρ Π±Π°Π·Ρ Π΄Π°Π½Π½ΡΡ
. ΠΠΎΠ΄ΠΎΠ±Π½ΠΎΠ΅ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ»ΡΡΡΠ°Π΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, Π½ΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ. ΠΡΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΠ²Π΅Ρ Keycloak ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅, ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΠ²Π΅ΡΠ° Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΠΎΠΏΠΎΠ²Π΅ΡΠ΅Π½Ρ ΠΎΠ± ΡΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΎΠ½ΠΈ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ Π°ΠΊΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π΄Π°Π½Π½ΡΡ
Π² ΡΠ²ΠΎΠΈΡ
ΠΊΡΡΠ°Ρ
. Keycloak ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΊΡΡΠΈ realms
, users
ΠΈ authorization
Π΄Π»Ρ ΠΊΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΈΠ· Π±Π°Π·Ρ.
Π’Π°ΠΊΠΆΠ΅ Π΅ΡΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠΉ ΠΊΡΡ work
, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΡΠ΅ΡΡΡ ΠΏΠΎ Π²ΡΠ΅ΠΌ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°ΠΌ. Π‘Π°ΠΌ ΠΎΠ½ Π½Π΅ Ρ
ΡΠ°Π½ΠΈΡ ΠΊΠ°ΠΊΠΈΡ
-Π»ΠΈΠ±ΠΎ Π΄Π°Π½Π½ΡΡ
ΠΈΠ· Π±Π°Π·Ρ, Π° ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΠΎΡΠΏΡΠ°Π²ΠΊΠΈ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠΉ ΠΎΠ± ΡΡΡΠ°ΡΠ΅Π²Π°Π½ΠΈΠΈ Π΄Π°Π½Π½ΡΡ
ΡΠ·Π»Π°ΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°ΠΌΠΈ. ΠΡΡΠ³ΠΈΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΠΌΠΈ, ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π°Π½Π½ΡΠ΅ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡΡΡΡ, ΡΠ·Π΅Π» Keycloak ΠΏΠΎΡΡΠ»Π°Π΅Ρ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π΄ΡΡΠ³ΠΈΠΌ ΡΠ·Π»Π°ΠΌ Π² ΡΠ²ΠΎΠ΅ΠΌ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ΅, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ·Π»Π°ΠΌ Π΄ΡΡΠ³ΠΈΡ
Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠΎΠ². ΠΠΎΡΠ»Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ°ΠΊΠΎΠ³ΠΎ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ·Π΅Π» ΠΏΡΠΎΠ²ΠΎΠ΄ΠΈΡ ΡΠΈΡΡΠΊΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΡ
Π΄Π°Π½Π½ΡΡ
Π² ΡΠ²ΠΎΠΈΡ
Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ
ΠΊΡΡΠ°Ρ
.
ΠΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠ΅ ΡΠ΅ΡΡΠΈΠΈ. ΠΡΡΠΈ Ρ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ sessions
, clientSessions
, offlineSessions
ΠΈ offlineClientSessions
, ΠΎΠ±ΡΡΠ½ΠΎ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΡΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°ΠΌΠΈ ΠΈ ΡΠ»ΡΠΆΠ°Ρ Π΄Π»Ρ Ρ
ΡΠ°Π½Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΎΠ± ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΡ
ΡΠ΅ΡΡΠΈΡΡ
, ΠΊΠΎΡΠΎΡΡΠ΅ Π°ΠΊΡΠΈΠ²Π½Ρ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅. ΠΡΠΈ ΠΊΡΡΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΠΈΠΌ Π·Π°ΠΏΡΠΎΡΡ HTTP ΠΎΡ ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ
ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ, ΡΠ°ΠΊ ΡΡΠΎ ΠΎΠ½ΠΈ ΡΠ²ΡΠ·Π°Π½Ρ Ρ sticky sessions ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠΎΠ²Π°ΡΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°ΠΌΠΈ.
ΠΠ°ΡΠΈΡΠ° ΠΎΡ ΠΏΠ΅ΡΠ΅Π±ΠΎΡΠ° Π³ΡΡΠ±ΠΎΠΉ ΡΠΈΠ»ΠΎΠΉ. ΠΡΡ loginFailures
ΡΠ»ΡΠΆΠΈΡ Π΄Π»Ρ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ
ΠΎΡΠΈΠ±ΠΎΠΊ Π²Ρ
ΠΎΠ΄Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π²Π²Π΅Π» Π½Π΅Π²Π΅ΡΠ½ΡΠΉ ΠΏΠ°ΡΠΎΠ»Ρ. Π Π΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΡΡΠ° β Π΄Π΅Π»ΠΎ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡΠ°. ΠΠΎ Π΄Π»Ρ ΡΠΎΡΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΡΡΠ΅ΡΠ° ΡΡΠΎΠΈΡ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π°ΡΠ°ΡΠ΅Π½ΡΡΠ°ΠΌΠΈ. ΠΠΎ Ρ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ Π΅ΡΠ»ΠΈ Π½Π΅ ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅, ΠΏΠΎΠ»ΡΡΠΈΡΡΡ ΡΠ»ΡΡΡΠΈΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ, ΠΈ Π΅ΡΠ»ΠΈ Π²ΡΡΠ°Π΅Ρ ΡΡΠΎΡ Π²ΠΎΠΏΡΠΎΡ β ΡΠ΅ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ Π½Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ.
ΠΡΠΈ ΡΠ°ΡΠΊΠ°ΡΠΊΠ΅ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Infinispan Π½ΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΊΡΡΠ΅ΠΉ Π² ΡΠ°ΠΉΠ» Π½Π°ΡΡΡΠΎΠ΅ΠΊ:
<replicated-cache-configuration name="keycloak-sessions" mode="ASYNC" start="EAGER" batching="false">
</replicated-cache-configuration>
<replicated-cache name="work" configuration="keycloak-sessions" />
<replicated-cache name="sessions" configuration="keycloak-sessions" />
<replicated-cache name="offlineSessions" configuration="keycloak-sessions" />
<replicated-cache name="actionTokens" configuration="keycloak-sessions" />
<replicated-cache name="loginFailures" configuration="keycloak-sessions" />
<replicated-cache name="clientSessions" configuration="keycloak-sessions" />
<replicated-cache name="offlineClientSessions" configuration="keycloak-sessions" />
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ ΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ ΠΊΠ»Π°ΡΡΠ΅Ρ Infinispan ΠΏΠ΅ΡΠ΅Π΄ Π·Π°ΠΏΡΡΠΊΠΎΠΌ ΠΊΠ»Π°ΡΡΠ΅ΡΠ° Keycloak
ΠΠ°ΡΠ΅ΠΌ Π½Π°Π΄ΠΎ Π½Π°ΡΡΡΠΎΠΈΡΡ remoteStore
Π΄Π»Ρ Keycloak ΠΊΡΡΠ΅ΠΉ. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΡΠΊΡΠΈΠΏΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π΄Π΅Π»Π°Π΅ΡΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΌΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ CACHE_OWNERS
, Π½Π°Π΄ΠΎ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ Π΅Π³ΠΎ Π² ΡΠ°ΠΉΠ» ΠΈ ΠΏΠΎΠ»ΠΎΠΆΠΈΡΡ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³ /opt/jboss/startup-scripts
:
Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠΊΡΠΈΠΏΡΠ°
embed-server --server-config=standalone-ha.xml --std-out=echo
batch
echo *** Update infinispan subsystem ***
/subsystem=infinispan/cache-container=keycloak:write-attribute(name=module, value=org.keycloak.keycloak-model-infinispan)
echo ** Add remote socket binding to infinispan server **
/socket-binding-group=standard-sockets/remote-destination-outbound-socket-binding=remote-cache:add(host=${remote.cache.host:localhost}, port=${remote.cache.port:11222})
echo ** Update replicated-cache work element **
/subsystem=infinispan/cache-container=keycloak/replicated-cache=work/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=work,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/replicated-cache=work:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache sessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=sessions,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=sessions:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache offlineSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=offlineSessions,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineSessions:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache clientSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=clientSessions,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=clientSessions:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache offlineClientSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=offlineClientSessions,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=offlineClientSessions:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache loginFailures element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
remote-servers=["remote-cache"],
cache=loginFailures,
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=loginFailures:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache actionTokens element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens/store=remote:add(
passivation=false,
fetch-state=false,
purge=false,
preload=false,
shared=true,
cache=actionTokens,
remote-servers=["remote-cache"],
properties={
rawValues=true,
marshaller=org.keycloak.cluster.infinispan.KeycloakHotRodMarshallerFactory,
protocolVersion=${keycloak.connectionsInfinispan.hotrodProtocolVersion}
}
)
/subsystem=infinispan/cache-container=keycloak/distributed-cache=actionTokens:write-attribute(name=statistics-enabled,value=true)
echo ** Update distributed-cache authenticationSessions element **
/subsystem=infinispan/cache-container=keycloak/distributed-cache=authenticationSessions:write-attribute(name=statistics-enabled,value=true)
echo *** Update undertow subsystem ***
/subsystem=undertow/server=default-server/http-listener=default:write-attribute(name=proxy-address-forwarding,value=true)
run-batch
stop-embedded-server
ΠΠ΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ JAVA_OPTS
Π΄Π»Ρ ΡΠ·Π»ΠΎΠ² Keycloak Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ HotRod: remote.cache.host
, remote.cache.port
ΠΈ ΠΈΠΌΡ ΡΠ΅ΡΠ²ΠΈΡΠ° jboss.site.name
.
Π‘ΡΡΠ»ΠΊΠΈ ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½Π°Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ
https://www.keycloak.org/docs/latest/server_installation/index.html https://docs.wildfly.org/17/High_Availability_Guide.html#cluster-configuration https://infinispan.org/docs/9.4.x/user_guide/user_guide.html https://hub.docker.com/r/jboss/keycloak https://hub.docker.com/r/jboss/infinispan
Π‘ΡΠ°ΡΡΡ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½Π° ΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²Π»Π΅Π½Π° Π΄Π»Ρ Π₯Π°Π±ΡΠ° ΡΠΎΡΡΡΠ΄Π½ΠΈΠΊΠ°ΠΌΠΈ
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com