如何在Kubernetes中自动部署Keycloak 15自定义SPI
Kubernetes 中自动部署 Keycloak 15 自定义 SPI 的方案
以下是三种可行的实现方式,按稳定性优先级排序:
方案一:构建包含 SPI 的自定义 Keycloak 镜像(推荐)
这种方式将 SPI 直接打包进镜像,Pod 重启或全新部署时都会自带 SPI,可靠性最高。
- 编写
Dockerfile:
# 指定基础镜像为 Keycloak 15,不要用 latest 避免版本漂移 FROM jboss/keycloak:15 # 将本地的 SPI jar 复制到 Keycloak 的部署目录 COPY common-keycloak-spi-0.1.jar /opt/jboss/keycloak/standalone/deployments/
- 构建并推送镜像到你的镜像仓库:
docker build -t your-registry/keycloak-with-spi:15 . docker push your-registry/keycloak-with-spi:15
- 编写 Kubernetes Deployment YAML:
apiVersion: apps/v1 kind: Deployment metadata: name: keycloak spec: replicas: 1 selector: matchLabels: app: keycloak template: metadata: labels: app: keycloak spec: containers: - name: keycloak image: your-registry/keycloak-with-spi:15 env: - name: KEYCLOAK_USER value: "admin" - name: KEYCLOAK_PASSWORD value: "admin" ports: - containerPort: 8080
方案二:使用 ConfigMap 挂载 SPI 文件
通过 ConfigMap 将 SPI jar 挂载到 Keycloak 部署目录,适合快速测试场景。
- 创建包含 SPI 的 ConfigMap:
# 若 jar 体积超过 1MiB,建议改用 Secret(ConfigMap 有大小限制) kubectl create configmap keycloak-spi --from-file=common-keycloak-spi-0.1.jar
- 编写 Deployment YAML 挂载 ConfigMap:
apiVersion: apps/v1 kind: Deployment metadata: name: keycloak spec: replicas: 1 selector: matchLabels: app: keycloak template: metadata: labels: app: keycloak spec: containers: - name: keycloak image: jboss/keycloak:15 env: - name: KEYCLOAK_USER value: "admin" - name: KEYCLOAK_PASSWORD value: "admin" ports: - containerPort: 8080 volumeMounts: - name: spi-volume mountPath: /opt/jboss/keycloak/standalone/deployments/common-keycloak-spi-0.1.jar subPath: common-keycloak-spi-0.1.jar volumes: - name: spi-volume configMap: name: keycloak-spi
注意:挂载的文件为只读状态,若 SPI 部署时需要生成临时文件(如 .deployed 标记),可能会失败。
方案三:通过 Init 容器拷贝 SPI 到可写卷
解决 ConfigMap 只读的问题,用 Init 容器将 SPI 拷贝到可写卷后再供主容器使用。
- 创建包含 SPI 的 ConfigMap:
kubectl create configmap keycloak-spi --from-file=common-keycloak-spi-0.1.jar
- 编写 Deployment YAML:
apiVersion: apps/v1 kind: Deployment metadata: name: keycloak spec: replicas: 1 selector: matchLabels: app: keycloak template: metadata: labels: app: keycloak spec: # Init 容器先完成 SPI 文件拷贝 initContainers: - name: copy-spi image: busybox:1.35 command: ['sh', '-c', 'cp /spi/common-keycloak-spi-0.1.jar /deployments/'] volumeMounts: - name: spi-config mountPath: /spi - name: deployments-volume mountPath: /deployments containers: - name: keycloak image: jboss/keycloak:15 env: - name: KEYCLOAK_USER value: "admin" - name: KEYCLOAK_PASSWORD value: "admin" ports: - containerPort: 8080 volumeMounts: - name: deployments-volume mountPath: /opt/jboss/keycloak/standalone/deployments volumes: - name: spi-config configMap: name: keycloak-spi - name: deployments-volume emptyDir: {}
说明:emptyDir 卷为可写状态,Keycloak 可以正常生成部署标记文件,确保 SPI 加载成功。
内容的提问来源于stack exchange,提问作者Vipul Tiwari
相关产品推荐
相关产品推荐

