ื”ืคืขืœืช Keycloak ื‘ืžืฆื‘ HA ื‘-Kubernetes

ื”ืคืขืœืช Keycloak ื‘ืžืฆื‘ HA ื‘-Kubernetes

TL; DR: ื™ื”ื™ื” ืชื™ืื•ืจ ืฉืœ Keycloak, ืžืขืจื›ืช ื‘ืงืจืช ื’ื™ืฉื” ื‘ืงื•ื“ ืคืชื•ื—, ื ื™ืชื•ื— ื”ืžื‘ื ื” ื”ืคื ื™ืžื™, ืคืจื˜ื™ ืชืฆื•ืจื”.

ืžื‘ื•ื ื•ืจืขื™ื•ื ื•ืช ืžืจื›ื–ื™ื™ื

ื‘ืžืืžืจ ื–ื” ื ืจืื” ืืช ื”ืจืขื™ื•ื ื•ืช ื”ื‘ืกื™ืกื™ื™ื ืฉื™ืฉ ืœื–ื›ื•ืจ ื‘ืขืช ืคืจื™ืกืช ืืฉื›ื•ืœ Keycloak ืขืœ ื’ื‘ื™ Kubernetes.

ืื ืืชื” ืจื•ืฆื” ืœื“ืขืช ื™ื•ืชืจ ืขืœ Keycloak, ืขื™ื™ืŸ ื‘ืงื™ืฉื•ืจื™ื ื‘ืกื•ืฃ ื”ืžืืžืจ. ื›ื“ื™ ืœื”ืชืขืžืง ื™ื•ืชืจ ื‘ืชืจื’ื•ืœ, ืืชื” ื™ื›ื•ืœ ืœืœืžื•ื“ ื”ืžืื’ืจ ืฉืœื ื• ืขื ืžื•ื“ื•ืœ ืฉืžื™ื™ืฉื ืืช ื”ืจืขื™ื•ื ื•ืช ื”ืขื™ืงืจื™ื™ื ืฉืœ ืžืืžืจ ื–ื” (ืžื“ืจื™ืš ื”ื”ืฉืงื” ื ืžืฆื ืฉื, ืžืืžืจ ื–ื” ื™ืกืคืง ืกืงื™ืจื” ื›ืœืœื™ืช ืฉืœ ื”ืžื›ืฉื™ืจ ื•ื”ื”ื’ื“ืจื•ืช, ืžืฉื•ืขืจ. ืžึฐืชื•ึผืจื’ึฐืžึธืŸ).

Keycloak ื”ื™ื ืžืขืจื›ืช ืžืงื™ืคื” ื”ื›ืชื•ื‘ื” ื‘-Java ื•ื‘ื ื•ื™ื” ืขืœ ื’ื‘ื™ ืฉืจืช ื™ื™ืฉื•ืžื™ื ื–ื‘ื•ื‘ ื‘ืจ. ื‘ืงื™ืฆื•ืจ, ื–ื•ื”ื™ ืžืกื’ืจืช ืœื”ืจืฉืื” ื”ืžืขื ื™ืงื” ืœืžืฉืชืžืฉื™ ืืคืœื™ืงืฆื™ื•ืช ื™ื›ื•ืœื•ืช ื”ืคื“ืจืฆื™ื” ื•-SSO (ื›ื ื™ืกื” ื™ื—ื™ื“ื”).

ืื ื• ืžื–ืžื™ื ื™ื ืืชื›ื ืœืงืจื•ื ืืช ื”ืจืฉืžื™ ัะฐะนั‚ ืื• ื•ื™ืงื™ืคื“ื™ื” ืœื”ื‘ื ื” ืžืคื•ืจื˜ืช.

ื”ืฉืงืช Keycloak

Keycloak ื“ื•ืจืฉ ืฉื ื™ ืžืงื•ืจื•ืช ื ืชื•ื ื™ื ืงื‘ื•ืขื™ื ื›ื“ื™ ืœืคืขื•ืœ:

  • ืžืกื“ ื ืชื•ื ื™ื ื”ืžืฉืžืฉ ืœืื—ืกื•ืŸ ื ืชื•ื ื™ื ืžื‘ื•ืกืกื™ื, ื›ื’ื•ืŸ ืžื™ื“ืข ืžืฉืชืžืฉ
  • ืžื˜ืžื•ืŸ Datagrid, ื”ืžืฉืžืฉ ืœืฉืžื™ืจื” ื‘ืžื˜ืžื•ืŸ ืฉืœ ื ืชื•ื ื™ื ืžืžืกื“ ื”ื ืชื•ื ื™ื, ื›ืžื• ื’ื ืœืื—ืกื•ืŸ ื›ืžื” ืžื˜ื ื ืชื•ื ื™ื ืงืฆืจื™ ืžื•ืขื“ ื•ืžืฉืชื ื™ื ืœืขืชื™ื ืงืจื•ื‘ื•ืช, ื›ื’ื•ืŸ ื”ืคืขืœื•ืช ืฉืœ ืžืฉืชืžืฉื™ื. ืžื•ื˜ืžืข ืื™ื ืกื•ืฃ, ืฉื”ื•ื ื‘ื“ืจืš ื›ืœืœ ืžื”ื™ืจ ืžืฉืžืขื•ืชื™ืช ืžืžืกื“ ื”ื ืชื•ื ื™ื. ืื‘ืœ ื‘ื›ืœ ืžืงืจื”, ื”ื ืชื•ื ื™ื ืฉื ืฉืžืจื• ื‘-Infinispan ื”ื ืืจืขื™ื™ื - ื•ืื™ืŸ ืฆื•ืจืš ืœืฉืžื•ืจ ืื•ืชื ื‘ืฉื•ื ืžืงื•ื ื›ืืฉืจ ื”ืืฉื›ื•ืœ ืžื•ืคืขืœ ืžื—ื“ืฉ.

Keycloak ืคื•ืขืœ ื‘ืืจื‘ืขื” ืžืฆื‘ื™ื ืฉื•ื ื™ื:

  • ื ื•ืจืžืœื™ - ืชื”ืœื™ืš ืื—ื“ ื•ื™ื—ื™ื“, ื”ืžื•ื’ื“ืจ ื‘ืืžืฆืขื•ืช ืงื•ื‘ืฅ standalone.xml
  • ืืฉื›ื•ืœ ืจื’ื™ืœ (ืืคืฉืจื•ืช ื–ืžื™ื ื•ืช ื’ื‘ื•ื”ื”) - ื›ืœ ื”ืชื”ืœื™ื›ื™ื ื—ื™ื™ื‘ื™ื ืœื”ืฉืชืžืฉ ื‘ืื•ืชื” ืชืฆื•ืจื”, ืฉื™ืฉ ืœืกื ื›ืจืŸ ื‘ืื•ืคืŸ ื™ื“ื ื™. ื”ื”ื’ื“ืจื•ืช ืžืื•ื—ืกื ื•ืช ื‘ืงื•ื‘ืฅ ืขืฆืžืื™-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. ืฆื™ื ื•ืจื•ืช ื‘ืขืœื™ ืฉื ืžืืคืฉืจื™ื ืœื—ื‘ืจ ืžื•ืคืขื™ ื™ื™ืฉื•ืžื™ื ื‘ืืฉื›ื•ืœ ืœืงื‘ื•ืฆื•ืช ื›ืš ืฉืœืชืงืฉื•ืจืช ื™ืฉ ืžืืคื™ื™ื ื™ื ื›ืžื• ืืžื™ื ื•ืช, ืกื“ืจ ื•ืจื’ื™ืฉื•ืช ืœื›ืฉืœื™ื.

ืžืื–ืŸ ืขื•ืžืกื™ื

ื‘ืขืช ื”ืชืงื ืช ืื™ื–ื•ืŸ ื›ื‘ืงืจ ื›ื ื™ืกื” ื‘ืืฉื›ื•ืœ Kubernetes, ื—ืฉื•ื‘ ืœื–ื›ื•ืจ ืืช ื”ื“ื‘ืจื™ื ื”ื‘ืื™ื:

Keycloak ืžื ื™ื— ืฉื”ื›ืชื•ื‘ืช ื”ืžืจื•ื—ืงืช ืฉืœ ื”ืœืงื•ื— ื”ืžืชื—ื‘ืจ ื‘ืืžืฆืขื•ืช HTTP ืœืฉืจืช ื”ืื™ืžื•ืช ื”ื™ื ื›ืชื•ื‘ืช ื”-IP ื”ืืžื™ืชื™ืช ืฉืœ ืžื—ืฉื‘ ื”ืœืงื•ื—. ื”ื’ื“ืจื•ืช ืžืื–ืŸ ื•ื›ื ื™ืกื” ืฆืจื™ื›ื•ืช ืœื”ื’ื“ื™ืจ ื›ื•ืชืจื•ืช HTTP ื‘ืฆื•ืจื” ื ื›ื•ื ื” X-Forwarded-For ะธ X-Forwarded-Proto, ื•ื’ื ืœืฉืžื•ืจ ืืช ื”ื›ื•ืชืจืช ื”ืžืงื•ืจื™ืช HOST. ื”ื’ืจืกื” ื”ืขื“ื›ื ื™ืช ื‘ื™ื•ืชืจ ingress-nginx (>0.22.0) ืžืฉื‘ื™ืช ื–ืืช ื›ื‘ืจื™ืจืช ืžื—ื“ืœ

ื”ืคืขืœืช ื”ื“ื’ืœ proxy-address-forwarding ืขืœ ื™ื“ื™ ื”ื’ื“ืจืช ืžืฉืชื ื” ืกื‘ื™ื‘ื” PROXY_ADDRESS_FORWARDING ะฒ true ื ื•ืชืŸ ืœ-Keycloak ืืช ื”ื”ื‘ื ื” ืฉื”ื•ื ืขื•ื‘ื“ ืžืื—ื•ืจื™ ืคืจื•ืงืกื™.

ืืชื” ืฆืจื™ืš ื’ื ืœื”ืคืขื™ืœ ืžืคื’ืฉื™ื ื“ื‘ื™ืงื™ื ื‘ื›ื ื™ืกื”. Keycloak ืžืฉืชืžืฉ ื‘ืžื˜ืžื•ืŸ Infinispan ืžื‘ื•ื–ืจ ื›ื“ื™ ืœืื—ืกืŸ ื ืชื•ื ื™ื ื”ืžืฉื•ื™ื›ื™ื ืœื”ืคืขืœืช ื”ืื™ืžื•ืช ื”ื ื•ื›ื—ื™ืช ื•ืœื”ืคืขืœืช ื”ืžืฉืชืžืฉ. ืžื˜ืžื•ื ื™ื ืคื•ืขืœื™ื ืขื ื‘ืขืœื™ื ื‘ื•ื“ื“ ื›ื‘ืจื™ืจืช ืžื—ื“ืœ, ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ื”ื”ืคืขืœื” ื”ืžืกื•ื™ืžืช ื”ื–ื• ืžืื•ื—ืกื ืช ื‘ืฆื•ืžืช ื›ืœืฉื”ื• ื‘ืืฉื›ื•ืœ, ื•ืฆืžืชื™ื ืื—ืจื™ื ื—ื™ื™ื‘ื™ื ืœื‘ืฆืข ืฉืื™ืœืชื•ืช ื‘ื• ืžืจื—ื•ืง ืื ื”ื ื–ืงื•ืงื™ื ืœื’ื™ืฉื” ืœื”ืคืขืœื” ื–ื•.

ืกืคืฆื™ืคื™ืช, ื‘ื ื™ื’ื•ื“ ืœืชื™ืขื•ื“, ืฆื™ืจื•ืฃ ื”ืคืขืœื” ืขื ื”ืฉื cookie ืœื ืขื‘ื“ ืขื‘ื•ืจื ื• AUTH_SESSION_ID. ืœ-Keycloak ื™ืฉ ืœื•ืœืื” ืœื”ืคื ื™ื” ืžื—ื“ืฉ, ืœื›ืŸ ืื ื• ืžืžืœื™ืฆื™ื ืœื‘ื—ื•ืจ ืฉื ืงื•ื‘ืฅ Cookie ืื—ืจ ืขื‘ื•ืจ ื”ื”ืคืขืœื” ื”ื“ื‘ื™ืงื”.

Keycloak ืžืฆืจืฃ ื’ื ืืช ืฉื ื”ืฆื•ืžืช ืฉื”ื’ื™ื‘ ืจืืฉื•ืŸ AUTH_SESSION_ID, ื•ืžื›ื™ื•ื•ืŸ ืฉื›ืœ ืฆื•ืžืช ื‘ื’ืจืกื” ื”ื–ืžื™ื ื” ื‘ื™ื•ืชืจ ืžืฉืชืžืฉ ื‘ืื•ืชื• ืžืกื“ ื ืชื•ื ื™ื, ื›ืœ ืื—ื“ ืžื”ื ื—ื™ื™ื‘ ืžื–ื”ื” ืฆื•ืžืช ื ืคืจื“ ื•ื™ื™ื—ื•ื“ื™ ืœื ื™ื”ื•ืœ ืขืกืงืื•ืช. ืžื•ืžืœืฅ ืœื”ื›ื ื™ืก JAVA_OPTS ืคืจืžื˜ืจื™ื jboss.node.name ะธ jboss.tx.node.id ื™ื™ื—ื•ื“ื™ ืœื›ืœ ืฆื•ืžืช - ืืชื” ื™ื›ื•ืœ, ืœืžืฉืœ, ืœืฉื™ื ืืช ืฉื ื”ืชืจืžื™ืœ. ืื ืชื›ื ื™ืก ืฉื ืชืจืžื™ืœ, ืืœ ืชืฉื›ื— ืืช ืžื’ื‘ืœืช 23 ื”ืชื•ื•ื™ื ืขื‘ื•ืจ ืžืฉืชื ื™ jboss, ืื– ืขื“ื™ืฃ ืœื”ืฉืชืžืฉ ื‘-StatefulSet ื•ืœื ื‘-Deployment.

ื’ืจื™ืคื” ื ื•ืกืคืช - ืื ื”ืคื•ื“ ื ืžื—ืง ืื• ืžื•ืคืขืœ ืžื—ื“ืฉ, ื”ืžื˜ืžื•ืŸ ืฉืœื• ืื‘ื“. ื‘ื”ืชื—ืฉื‘ ื‘ื›ืš, ื›ื“ืื™ ืœื”ื’ื“ื™ืจ ืืช ืžืกืคืจ ื‘ืขืœื™ ื”ืžื˜ืžื•ืŸ ืœื›ืœ ื”ืžื˜ืžื•ืŸ ืœืฉื ื™ื™ื ืœืคื—ื•ืช, ื›ืš ืฉื™ื™ืฉืืจ ืขื•ืชืง ืฉืœ ื”ืžื˜ืžื•ืŸ. ื”ืคืชืจื•ืŸ ื”ื•ื ืœืจื•ืฅ ืชืกืจื™ื˜ ืขื‘ื•ืจ Wildfly ื‘ืขืช ื”ืคืขืœืช ื”ืคื•ื“, ื”ืฆื‘ ืื•ืชื• ื‘ืกืคืจื™ื™ื” /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, ืฉื™ื“ื•ืจ ืจื™ื‘ื•ื™ ื™ืคืขืœ ืžื™ื“ - ื•ืฆืžืชื™ ื”-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 ืื—ื“ (ื ื ื™ื— ืื—ื“ ื‘ืžืจื—ื‘ ื”ืฉืžื•ืช production, ื”ืฉื ื™ - staging) - ืฆืžืชื™ื ืฉืœ ืืฉื›ื•ืœ Keycloak ืื—ื“ ื™ื›ื•ืœื™ื ืœื”ืฆื˜ืจืฃ ืœืืฉื›ื•ืœ ืื—ืจ. ื”ืงืคื“ ืœื”ืฉืชืžืฉ ื‘ื›ืชื•ื‘ืช ืจื™ื‘ื•ื™ ืฉื™ื“ื•ืจ ื™ื™ื—ื•ื“ื™ืช ืขื‘ื•ืจ ื›ืœ ืืฉื›ื•ืœ ืขืœ ื™ื“ื™ ื”ื’ื“ืจืช ืžืฉืชื ื™ืjboss.default.multicast.address ะธ jboss.modcluster.multicast.address ะฒ JAVA_OPTS.

ืฉื›ืคื•ืœ ื‘ื™ืŸ ืžืจื›ื–ื™ ื ืชื•ื ื™ื

ื”ืคืขืœืช Keycloak ื‘ืžืฆื‘ HA ื‘-Kubernetes

ืงืฉืจ

Keycloak ืžืฉืชืžืฉ ื‘ืžืกืคืจ ืืฉื›ื•ืœื•ืช ืžื˜ืžื•ืŸ ื ืคืจื“ื™ื ืฉืœ Infinispan ืขื‘ื•ืจ ื›ืœ ืžืจื›ื– ื ืชื•ื ื™ื ืฉื‘ื• ืžืžื•ืงืžื™ื ืืฉื›ื•ืœื•ืช Keycloack ื”ืžื•ืจื›ื‘ื™ื ืžืฆืžืชื™ Keycloak. ืื‘ืœ ืื™ืŸ ื”ื‘ื“ืœ ื‘ื™ืŸ ืฆื•ืžืช Keycloak ื‘ืžืจื›ื–ื™ ื ืชื•ื ื™ื ืฉื•ื ื™ื.

ืฆืžืชื™ Keycloak ืžืฉืชืžืฉื™ื ื‘-Java Data Grid ื—ื™ืฆื•ื ื™ (ืฉืจืชื™ Infinispan) ืœืชืงืฉื•ืจืช ื‘ื™ืŸ ืžืจื›ื–ื™ ื ืชื•ื ื™ื. ื”ืชืงืฉื•ืจืช ืคื•ืขืœืช ืœืคื™ ื”ืคืจื•ื˜ื•ืงื•ืœ Infinispan HotRod.

ื™ืฉ ืœื”ื’ื“ื™ืจ ืžื˜ืžื•ื ื™ื ืฉืœ Infinispan ืขื ื”ืชื›ื•ื ื” remoteStore, ื›ืš ืฉื ื™ืชืŸ ืœืื—ืกืŸ ืืช ื”ื ืชื•ื ื™ื ืžืจื—ื•ืง (ื‘ืžืจื›ื– ื ืชื•ื ื™ื ืื—ืจ, ืžืฉื•ืขืจ. ืžึฐืชื•ึผืจื’ึฐืžึธืŸ) ืžื˜ืžื•ื ื™ื. ื‘ื™ืŸ ืฉืจืชื™ ื”-JDG ื™ืฉ ืืฉื›ื•ืœื•ืช ื ืคืจื“ื™ื ืฉืœ ืื™ื ืคื™ื ื™ืกืคื™ืŸ, ื›ืš ืฉื”ื ืชื•ื ื™ื ื”ืžืื•ื—ืกื ื™ื ื‘-JDG1 ื‘ืืชืจ site1 ื™ืฉื•ื›ืคืœ ืœ-JDG2 ื‘ืืชืจ site2.

ื•ืœื‘ืกื•ืฃ, ืฉืจืช ื”-JDG ื”ืžืงื‘ืœ ืžื•ื“ื™ืข ืœืฉืจืชื™ Keycloak ืขืœ ื”ืืฉื›ื•ืœ ืฉืœื• ื‘ืืžืฆืขื•ืช ื—ื™ื‘ื•ืจื™ ืœืงื•ื—, ืฉื”ื•ื ืžืืคื™ื™ืŸ ืฉืœ ืคืจื•ื˜ื•ืงื•ืœ HotRod. ืฆืžืชื™ Keycloak ืคื•ืขืœื™ื site2 ืขื“ื›ืŸ ืืช ืžื˜ืžื•ื ื™ ื”-Infinispan ืฉืœื”ื ื•ื”ืคืขืœืช ื”ืžืฉืชืžืฉ ื”ืกืคืฆื™ืคื™ืช ื”ื•ืคื›ืช ืœื–ืžื™ื ื” ื’ื ื‘ืฆืžืชื™ Keycloak ื‘- site2.

ืขื‘ื•ืจ ืžื˜ืžื•ื ื™ื ืžืกื•ื™ืžื™ื, ืืคืฉืจ ื’ื ืœื ืœื‘ืฆืข ื’ื™ื‘ื•ื™ื™ื ื•ืœื”ื™ืžื ืข ืžื›ืชื™ื‘ืช ื ืชื•ื ื™ื ื“ืจืš ืฉืจืช Infinispan ืœื—ืœื•ื˜ื™ืŸ. ืœืฉื ื›ืš ืขืœื™ืš ืœื”ืกื™ืจ ืืช ื”ื”ื’ื“ืจื” remote-store ืžื˜ืžื•ืŸ ืกืคืฆื™ืคื™ ืฉืœ Infinispan (ื‘ืงื•ื‘ืฅ ืขืฆืžืื™-ha.xml), ื•ืœืื—ืจ ืžื›ืŸ ื›ืžื” ืกืคืฆื™ืคื™ replicated-cache ื’ื ืœื ื™ื”ื™ื” ืฆื•ืจืš ื™ื•ืชืจ ื‘ืฆื“ ืฉืจืช Infinispan.

ื”ื’ื“ืจืช ืžื˜ืžื•ื ื™ื

ื™ืฉื ื ืฉื ื™ ืกื•ื’ื™ื ืฉืœ ืžื˜ืžื•ื ื™ื ื‘-Keycloak:

  • ืžึฐืงื•ึนืžึดื™. ื”ื•ื ืžืžื•ืงื ืœื™ื“ ืžืกื“ ื”ื ืชื•ื ื™ื ื•ืžืฉืžืฉ ืœื”ืคื—ืชืช ื”ืขื•ืžืก ืขืœ ืžืกื“ ื”ื ืชื•ื ื™ื, ื›ืžื• ื’ื ืœื”ืคื—ืชืช ื–ืžืŸ ื”ืฉื”ื™ื™ืช ืชื’ื•ื‘ื”. ืกื•ื’ ื–ื” ืฉืœ ืžื˜ืžื•ืŸ ืžืื—ืกืŸ ืชื—ื•ื, ืœืงื•ื—ื•ืช, ืชืคืงื™ื“ื™ื ื•ืžื˜ื ื ืชื•ื ื™ื ืฉืœ ืžืฉืชืžืฉื™ื. ืกื•ื’ ื–ื” ืฉืœ ืžื˜ืžื•ืŸ ืื™ื ื• ืžืฉื•ื›ืคืœ, ื’ื ืื ื”ืžื˜ืžื•ืŸ ื”ื•ื ื—ืœืง ืžืืฉื›ื•ืœ Keycloak. ืื ืขืจืš ื‘ืžื˜ืžื•ืŸ ืžืฉืชื ื”, ื”ื•ื“ืขื” ืขืœ ื”ืฉื™ื ื•ื™ ื ืฉืœื—ืช ืœืฉืจืชื™ื ื”ื ื•ืชืจื™ื ื‘ืืฉื›ื•ืœ, ื•ืœืื—ืจ ืžื›ืŸ ื”ืขืจืš ืื™ื ื• ื ื›ืœืœ ืžื”ืžื˜ืžื•ืŸ. ืจืื” ืชื™ืื•ืจ work ืจืื” ืœื”ืœืŸ ืœืชื™ืื•ืจ ืžืคื•ืจื˜ ื™ื•ืชืจ ืฉืœ ื”ื”ืœื™ืš.

  • ืžืฉื•ื›ืคืœ. ืžืขื‘ื“ ื”ืคืขืœื•ืช ืžืฉืชืžืฉ, ืืกื™ืžื•ื ื™ื ืœื ืžืงื•ื•ื ื™ื, ื•ื’ื ืขื•ืงื‘ ืื—ืจ ืฉื’ื™ืื•ืช ื”ืชื—ื‘ืจื•ืช ื›ื“ื™ ืœื–ื”ื•ืช ื ื™ืกื™ื•ื ื•ืช ื“ื™ื•ื’ ื‘ืกื™ืกืžื” ื•ื”ืชืงืคื•ืช ืื—ืจื•ืช. ื”ื ืชื•ื ื™ื ื”ืžืื•ื—ืกื ื™ื ื‘ืžื˜ืžื•ื ื™ื ืืœื” ื”ื ื–ืžื ื™ื™ื, ืžืื•ื—ืกื ื™ื ืจืง ื‘-RAM, ืืš ื ื™ืชืŸ ืœืฉื›ืคืœ ืื•ืชื ื‘ืจื—ื‘ื™ ื”ืืฉื›ื•ืœ.

ืžื˜ืžื•ื ื™ Infinispan

ืžื•ืฉื‘ื™ื - ืงื•ื ืกืคื˜ ื‘-Keycloak, ืžื˜ืžื•ื ื™ื ื ืคืจื“ื™ื ื”ื ืงืจืื™ื authenticationSessions, ืžืฉืžืฉื™ื ืœืื—ืกื•ืŸ ื ืชื•ื ื™ื ืฉืœ ืžืฉืชืžืฉื™ื ืกืคืฆื™ืคื™ื™ื. ื‘ืงืฉื•ืช ืžืžื˜ืžื•ื ื™ื ืืœื” ื ื—ื•ืฆื•ืช ื‘ื“ืจืš ื›ืœืœ ืขืœ ื™ื“ื™ ื”ื“ืคื“ืคืŸ ื•ืฉืจืชื™ Keycloak, ืœื ืขืœ ื™ื“ื™ ื™ื™ืฉื•ืžื™ื. ื›ืืŸ ื ื›ื ืกืช ืœืชืžื•ื ื” ื”ืชืœื•ืช ื‘ืกืฉื ื™ื ื“ื‘ื™ืงื™ื, ื•ืื™ืŸ ืฆื•ืจืš ืœืฉื›ืคืœ ืžื˜ืžื•ื ื™ื ื›ืืœื” ืขืฆืžื, ืืคื™ืœื• ื‘ืžืงืจื” ืฉืœ ืžืฆื‘ ืืงื˜ื™ื‘ื™-ืืงื˜ื™ื‘.

ืืกื™ืžื•ื ื™ ืคืขื•ืœื”. ืžื•ืฉื’ ื ื•ืกืฃ, ื”ืžืฉืžืฉ ื‘ื“ืจืš ื›ืœืœ ืœืชืจื—ื™ืฉื™ื ืฉื•ื ื™ื ื›ืืฉืจ, ืœืžืฉืœ, ื”ืžืฉืชืžืฉ ื—ื™ื™ื‘ ืœืขืฉื•ืช ืžืฉื”ื• ื‘ืื•ืคืŸ ืืกื™ื ื›ืจื•ื ื™ ื‘ื“ื•ืืจ. ืœืžืฉืœ, ื‘ืžื”ืœืš ื”ื”ืœื™ืš forget password ืžื˜ืžื•ืŸ actionTokens ืžืฉืžืฉ ืœืžืขืงื‘ ืื—ืจ ืžื˜ื ื ืชื•ื ื™ื ืฉืœ ืืกื™ืžื•ื ื™ื ืžืฉื•ื™ื›ื™ื - ืœื“ื•ื’ืžื”, ืืกื™ืžื•ืŸ ื›ื‘ืจ ื”ื™ื” ื‘ืฉื™ืžื•ืฉ ื•ืœื ื ื™ืชืŸ ืœื”ืคืขื™ืœื• ืฉื•ื‘. ืกื•ื’ ื–ื” ืฉืœ ืžื˜ืžื•ืŸ ื‘ื“ืจืš ื›ืœืœ ืฆืจื™ืš ืœื”ื™ื•ืช ืžืฉื•ื›ืคืœ ื‘ื™ืŸ ืžืจื›ื–ื™ ื ืชื•ื ื™ื.

ืฉืžื™ืจืช ืžื˜ืžื•ืŸ ื•ื”ื–ื“ืงื ื•ืช ืฉืœ ื ืชื•ื ื™ื ืžืื•ื—ืกื ื™ื ืคื•ืขืœ ื›ื“ื™ ืœื”ืงืœ ืขืœ ื”ืขื•ืžืก ืขืœ ืžืกื“ ื”ื ืชื•ื ื™ื. ืกื•ื’ ื–ื” ืฉืœ ืžื˜ืžื•ืŸ ืžืฉืคืจ ืืช ื”ื‘ื™ืฆื•ืขื™ื, ืืš ืžื•ืกื™ืฃ ื‘ืขื™ื” ื‘ืจื•ืจื”. ืื ืฉืจืช Keycloak ืื—ื“ ืžืขื“ื›ืŸ ื ืชื•ื ื™ื, ื™ืฉ ืœื™ื™ื“ืข ืืช ื”ืฉืจืชื™ื ื”ืื—ืจื™ื ื›ื“ื™ ืฉื™ื•ื›ืœื• ืœืขื“ื›ืŸ ืืช ื”ื ืชื•ื ื™ื ื‘ืžื˜ืžื•ื ื™ื ืฉืœื”ื. Keycloak ืžืฉืชืžืฉ ื‘ืžื˜ืžื•ื ื™ื ืžืงื•ืžื™ื™ื realms, users ะธ authorization ืœืฉืžื™ืจื” ื‘ืžื˜ืžื•ืŸ ืžืžืกื“ ื”ื ืชื•ื ื™ื.

ื™ืฉ ื’ื ืžื˜ืžื•ืŸ ื ืคืจื“ work, ืืฉืจ ืžืฉื•ื›ืคืœ ื‘ื›ืœ ืžืจื›ื–ื™ ื”ื ืชื•ื ื™ื. ื”ื™ื ืขืฆืžื” ืื™ื ื” ืžืื—ืกื ืช ื ืชื•ื ื™ื ืžืžืกื“ ื”ื ืชื•ื ื™ื, ืืœื ืžืฉืžืฉืช ืœืฉืœื™ื—ืช ื”ื•ื“ืขื•ืช ืขืœ ื”ื–ื“ืงื ื•ืช ื”ื ืชื•ื ื™ื ืœืฆืžืชื™ื ื‘ื™ืŸ ืžืจื›ื–ื™ ื ืชื•ื ื™ื. ื‘ืžื™ืœื™ื ืื—ืจื•ืช, ื‘ืจื’ืข ืฉื”ื ืชื•ื ื™ื ืžืชืขื“ื›ื ื™ื, ื”ืฆื•ืžืช Keycloak ืฉื•ืœื— ื”ื•ื“ืขื” ืœืฆืžืชื™ื ืื—ืจื™ื ื‘ืžืจื›ื– ื”ื ืชื•ื ื™ื ืฉืœื•, ื›ืžื• ื’ื ืœืฆืžืชื™ื ื‘ืžืจื›ื–ื™ ื ืชื•ื ื™ื ืื—ืจื™ื. ืœืื—ืจ ืงื‘ืœืช ื”ื•ื“ืขื” ื›ื–ื•, ื›ืœ ืฆื•ืžืช ืžื ืงื” ืืช ื”ื ืชื•ื ื™ื ื”ืžืชืื™ืžื™ื ื‘ืžื˜ืžื•ื ื™ื ื”ืžืงื•ืžื™ื™ื ืฉืœื•.

ื”ืคืขืœื•ืช ืžืฉืชืžืฉ. ืžื˜ืžื•ื ื™ื ืขื ืฉืžื•ืช sessions, clientSessions, offlineSessions ะธ offlineClientSessions, ืžืฉื•ื›ืคืœื™ื ื‘ื“ืจืš ื›ืœืœ ื‘ื™ืŸ ืžืจื›ื–ื™ ื ืชื•ื ื™ื ื•ืžืฉืžืฉื™ื ืœืื—ืกื•ืŸ ื ืชื•ื ื™ื ืขืœ ื”ืคืขืœื•ืช ืฉืœ ืžืฉืชืžืฉื™ื ืคืขื™ืœื™ื ื‘ื–ืžืŸ ืฉื”ืžืฉืชืžืฉ ืคืขื™ืœ ื‘ื“ืคื“ืคืŸ. ืžื˜ืžื•ื ื™ื ืืœื” ืขื•ื‘ื“ื™ื ืขื ื”ื™ื™ืฉื•ื ื”ืžืขื‘ื“ ื‘ืงืฉื•ืช HTTP ืžืžืฉืชืžืฉื™ ืงืฆื”, ื›ืš ืฉื”ื ืžืฉื•ื™ื›ื™ื ืœื”ืคืขืœื•ืช ื“ื‘ื™ืงื•ืช ื•ื™ืฉ ืœืฉื›ืคืœ ืื•ืชื ื‘ื™ืŸ ืžืจื›ื–ื™ ื ืชื•ื ื™ื.

ื”ื’ื ื” ืขืœ ื›ื•ื— ื’ืก. ืžื˜ืžื•ืŸ 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.

ืงื™ืฉื•ืจื™ื ื•ืชื™ืขื•ื“ ื ื•ืกืฃ

ื”ืžืืžืจ ืชื•ืจื’ื ื•ื”ื•ื›ืŸ ืœื”ื‘ืจ ืขืœ ื™ื“ื™ ืขื•ื‘ื“ื™ื ืžืจื›ื– ืื™ืžื•ื ื™ ืกืœืจื - ืงื•ืจืกื™ื ืื™ื ื˜ื ืกื™ื‘ื™ื™ื, ืงื•ืจืกื™ ื•ื™ื“ืื• ื•ื”ื›ืฉืจื” ืืจื’ื•ื ื™ืช ืžืžื•ืžื—ื™ื ืžืชืจื’ืœื™ื (Kubernetes, DevOps, Docker, Ansible, Ceph, SRE)

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”