生产环境下的keycloak集群部署

902 阅读2分钟

背景

由于keycloak官网给的生产部署方式过于复杂,配置参数太多,对于新手有一定的难度,部署的过程出现的意外网上很难找到答案;而且官方没有给出通俗易懂的集群部署方式,经过几天的摸索实践了自己的部署方式,总结记录下来,也方便大家参考。

一.部署环境:麒麟v10(64位)

[roott]# uname -a
Linux 4.19.90-17.ky10.aarch64 #1 SMP Sun Jun 28 14:27:40 CST 2020 aarch64 aarch64 aarch64 GNU/Linux

二.部署方式:容器部署(docker-compose + openssl) 1.keycloak以production方式启动,要求使用域名并且要启用https,这里我们使用td.idm.com做为域名,并采用自签的https证书

1.使用openssl自签证书

openssl req -newkey rsa:2048 -nodes
-keyout server.key.pem -x509 -days 3650 -out server.crt.pem

2.给证书访问权限(注意:一定要给权限,否则production模式启动失败)

chmod -R 644 /home/tdpt/cert/server.crt.pem
chmod -R 644 /home/tdpt/cert/server.key.pem

3.编写docker-compose.yml

version: '3'
services:
  keycloak:
    container_name: keycloak-prod
    image: quay.io/keycloak/keycloak:18.0.0
    environment:
     # KC_DB: mysql
     # KC_DB_URL: jdbc:mysql://ip:port/dbName?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
      KC_DB_URL_HOST: {ip}
      KC_DB_URL_PORT: {port}
      KC_DB_URL_DATABASE: {dbName}
      KC_DB_USERNAME: {dbUsername}
      KC_DB_PASSWORD: {dbPassword}
      KEYCLOAK_ADMIN: {kc_admin}
      KEYCLOAK_ADMIN_PASSWORD: {kc_password}
      KC_HOSTNAME: td.idm.com
      KC_HTTPS_CERTIFICATE_FILE: /opt/keycloak/conf/server.crt.pem
      KC_HTTPS_CERTIFICATE_KEY_FILE: /opt/keycloak/conf/server.key.pem
 #     DEBUG_PORT: '*:8787'
#      DEBUG: 'true'
    volumes:
      - ./providers:/opt/keycloak/providers
      - /home/tdpt/cert/server.crt.pem:/opt/keycloak/conf/server.crt.pem
      - /home/tdpt/cert/server.key.pem:/opt/keycloak/conf/server.key.pem
    command: start
    ports:
      - 8443:8443

注意:使用start-dev命令,即deployment模式下可以使用KC_DB,KC_DB_URL参数,但是start 命令,即production模式下会报错,找不到jdbc:mysql驱动;这里使用8443端口。

其他参数参考:www.keycloak.org/server/conf… www.keycloak.org/server/cont…

三.负载均衡

通过nginx的ip_hash方式实现负载均衡和高可用

upstream keycloak_ssl {
        ip_hash;
        server ip1:8443;
        server ip2:8443;
        server ip3:8443;
    }

    server {
        listen       8443 ssl;

        server_name  td.idm.com;
        
        ssl_certificate      /opt/unisoftware/services/nginx/cert/server.crt;
        ssl_certificate_key  /opt/unisoftware/services/nginx/cert/server.key;
        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_prefer_server_ciphers  on;
        ssl_protocols TLSv1.2;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

        location / {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass https://keycloak_ssl;
        }
    }

四.Q&A

1.docker-compose启动报错Strict hostname resolution configured but no hostname was set?

解决:添加KC_HOSTNAME参数

  1. docker-compose启动报错Key material not provided to setup HTTPS. Please configure your keys/certificates or start the server in development mode.

解决:KC_HTTPS_CERTIFICATE_FILE: /opt/keycloak/conf/server.crt.pem KC_HTTPS_CERTIFICATE_KEY_FILE: /opt/keycloak/conf/server.key.pem

  1. docker-compose启动报错ERROR: /opt/keycloak/conf/keys/server.crt.pem

解决:

  chmod -R 644 /home/tdpt/cert/server.key.pem
  chmod -R 644 /home/tdpt/cert/server.crt.pem

4.docker-compose启动报错,找不到驱动jdbc:mysql

解决:不要使用KC_DB_URL,使用KC_DB_URL_HOST,KC_DB_URL_PORT,KC_DB_URL_DATABASE