3.3. 迁移 Keycloak CR


Keycloak CR 现在支持所有服务器配置选项。所有相关选项都直接作为 CR spec 下的第一个类 shield 字段提供。CR 中的所有选项都遵循与服务器选项相同的命名约定,使裸机和 Operator 部署之间的体验是无缝的。

另外,您可以在 additionalOptions 字段中定义 CR 中缺少的任何选项,如 SPI 供应商配置。另一种选择是使用 podTemplate (一个技术预览字段)来修改原始 Kubernetes 部署 pod 模板,以防支持的替代方案不存在作为 CR 中的第一个类 prerequisites 字段。

下面显示了一个通过 Operator 部署 Keycloak 的 Keycloak CR 示例:

apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  instances: 1
  db:
    vendor: postgres
    host: postgres-db
    usernameSecret:
      name: keycloak-db-secret
      key: username
    passwordSecret:
      name: keycloak-db-secret
      key: password
  http:
    tlsSecret: example-tls-secret
  hostname:
    hostname: test.keycloak.org
  additionalOptions:
    - name: spi-connections-http-client-default-connection-pool-size
      value: 20
Copy to Clipboard Toggle word wrap

注意与 CLI 配置的 resemblance:

./kc.sh start --db=postgres --db-url-host=postgres-db --db-username=user --db-password=pass --https-certificate-file=mycertfile --https-certificate-key-file=myprivatekey --hostname=test.keycloak.org --spi-connections-http-client-default-connection-pool-size=20
Copy to Clipboard Toggle word wrap

3.3.1. 迁移数据库配置

Red Hat build of Keycloak 可以使用与之前由 Red Hat Single Sign-On 7.6 使用的数据库实例相同的数据库实例。当红帽构建的 Keycloak 第一次连接时,数据库 schema 将自动迁移。

警告

不支持迁移由 Red Hat Single Sign-On 7.6 Operator 管理的嵌入式数据库。

在 Red Hat Single Sign-On 7.6 Operator 中,外部数据库连接使用 Secret 配置,例如:

apiVersion: v1
kind: Secret
metadata:
  name: keycloak-db-secret
  namespace: keycloak
  labels:
    app: sso
stringData:
  POSTGRES_DATABASE:  kc-db-name
  POSTGRES_EXTERNAL_ADDRESS: my-postgres-hostname
  POSTGRES_EXTERNAL_PORT: 5432
  POSTGRES_USERNAME: user
  POSTGRES_PASSWORD: pass
type: Opaque
Copy to Clipboard Toggle word wrap

在 Keycloak 的红帽构建中,数据库直接在 Keycloak CR 中配置,带有引用为 Secret 的凭证,例如:

apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  db:
    vendor: postgres
    host: my-postgres-hostname
    port: 5432
    usernameSecret:
      name: keycloak-db-secret
      key: username
    passwordSecret:
      name: keycloak-db-secret
      key: password
  ...

apiVersion: v1
kind: Secret
metadata:
  name: keycloak-db-secret
stringData:
  username: "user"
  password: "pass"
type: Opaque
Copy to Clipboard Toggle word wrap

3.3.1.1. 支持的数据库供应商

Red Hat Single Sign-On 7.6 Operator 仅支持 PostgreSQL 数据库,但 Red Hat build of Keycloak Operator 支持服务器支持的所有数据库供应商。

3.3.2. 迁移 TLS 配置

Red Hat Single Sign-On 7.6 Operator 默认将服务器配置为使用 OpenShift CA 生成的 TLS Secret。红帽构建的 Keycloak Operator 不会对 TLS 进行任何假设来满足生产最佳实践,并要求用户提供自己的 TLS 证书和密钥对,例如:

apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  http:
    tlsSecret: example-tls-secret
  ...
Copy to Clipboard Toggle word wrap

tlsSecret 中引用的 secret 的预期格式应该使用标准 Kubernetes TLS Secret (kubernetes.io/tls)类型。

Red Hat Single Sign-On 7.6 Operator 在 Route 中使用重新加密 TLS 终止策略。红帽构建的 Keycloak Operator 默认使用 passthrough 策略。另外,Red Hat Single Sign-On 7.6 Operator 支持配置 TLS 终止。Red Hat build of Keycloak Operator 不支持当前版本中的 TLS 终止。

如果默认 Operator 管理的 Route 没有满足所需的 TLS 配置,则需要由用户创建自定义路由,并默认路由禁用:

apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  ingress:
    enabled: false
  ...
Copy to Clipboard Toggle word wrap

3.3.3. 使用自定义镜像进行扩展

为了反映最佳实践并支持不可变容器,Red Hat build of Keycloak Operator 不再支持在 Keycloak CR 中指定扩展。要部署扩展,必须构建优化的自定义镜像。Keycloak CR 现在包括一个指定红帽构建的 Keycloak 镜像的专用字段,例如:

apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  image: quay.io/my-company/my-keycloak:latest
  ...
Copy to Clipboard Toggle word wrap
注意

在指定自定义镜像时,Operator 会假定它已被优化,且不会在每个服务器启动时执行昂贵的优化。

3.3.4. 删除升级策略选项

Red Hat Single Sign-On 7.6 Operator 在执行服务器升级时支持重新创建和滚动策略。这个方法不实际。在执行升级和数据库迁移前,Red Hat Single Sign-On 7.6 Operator 是否应该缩减部署。当可以安全使用滚动策略时,用户不知道用户。

因此,在 Keycloak Operator 的红帽构建中删除了这个选项,它总是隐式执行 recreate 策略,它会在使用新的服务器容器镜像创建 Pod 前缩减整个部署,以确保只有一个服务器版本访问数据库。

3.3.5. 默认公开的健康端点

红帽构建的 Keycloak 将服务器配置为默认公开一个简单的健康端点,供 OpenShift 探测使用。端点不会公开与部署相关的任何安全敏感数据,但可以在无需任何身份验证的情况下访问它。作为替代方案,可以在自定义路由中阻止 < your-server-context-root> /health 端点。

例如,

  1. 创建为 TLS 边缘终止配置的 Keycloak。

    确保省略 tlsSecret 字段:

    apiVersion: k8s.keycloak.org/v2alpha1
    kind: Keycloak
    metadata:
      name: example-kc
    spec:
      additionalOptions:
        - name: proxy
          value: edge
      hostname:
        hostname: example.com
      ...
    Copy to Clipboard Toggle word wrap
  2. 创建阻塞路由以阻止对健康端点的访问:

    kind: Route
    apiVersion: route.openshift.io/v1
    metadata:
      name: example-kc-block-health
      annotations:
        haproxy.router.openshift.io/rewrite-target: /404
    spec:
      host: example.com
      path: /health
      to:
        kind: Service
        name: example-kc-service
      port:
        targetPort: http
      tls:
        termination: edge
    Copy to Clipboard Toggle word wrap
注意

基于路径的路由需要为边缘或重新加密配置 TLS 终止。默认情况下,Operator 使用 passthrough。

3.3.6. 使用 Pod 模板迁移高级部署选项

Red Hat Single Sign-On 7.6 Operator 为部署配置公开多个低级字段,如卷。Red Hat build of Keycloak Operator 更为建议,且不会公开大多数这些字段。但是,仍然可以配置指定为 podTemplate 的任何所需的部署字段,例如:

apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  unsupported:
    podTemplate:
      metadata:
        labels:
          foo: "bar"
      spec:
        containers:
          - volumeMounts:
              - name: test-volume
                mountPath: /mnt/test
        volumes:
          - name: test-volume
            secret:
              secretName: test-secret
  ...
Copy to Clipboard Toggle word wrap
注意

spec.unsupported.podTemplate 字段只提供有限的支持,因为它会公开低级别配置,因为所有条件下还没有测试完整的功能。在可能的情况下,使用 CR spec 顶级完全支持的第一类延迟字段。

例如,不是 spec.unsupported.podTemplate.spec.imagePullSecrets,而是直接使用 spec.imagePullSecrets

3.3.7. 不再支持连接到外部实例

Red Hat Single Sign-On 7.6 Operator 支持连接到 Red Hat Single Sign-On 7.6 的外部实例。例如,Red Hat build of Keycloak Operator 不再支持通过 Client CR 在现有域中创建客户端。

3.3.8. 迁移启用 Horizontal Pod Autoscaler 的部署

要将 Horizontal Pod Autoscaler (HPA)与 Red Hat Single Sign-On 7.6 搭配使用,需要在 Keycloak CR 中设置 disableReplicasSyncing: true 字段并扩展服务器 StatefulSet。因为红帽构建的 Keycloak Operator 中的 Keycloak CR 可以被 HPA 直接扩展,所以不再需要此项。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat