搜索

3.3. 迁移 Keycloak CR

download PDF

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

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

下面显示了一个通过 Operator 部署红帽构建的 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

请注意 CLI 配置的位置:

./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

3.3.1. 迁移数据库配置

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

警告

不支持迁移由 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

在 Red Hat build of 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

3.3.1.1. 支持的数据库供应商

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

3.3.2. 迁移 TLS 配置

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

apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  http:
    tlsSecret: example-tls-secret
  ...

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

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

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

apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
  name: example-kc
spec:
  ingress:
    enabled: false
  ...

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

为了反映最佳实践并支持不可变容器,红帽构建的 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
  ...
注意

在指定自定义镜像时,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. 默认公开的健康端点

Red Hat build of Keycloak 将服务器配置为默认公开一个简单的健康端点,供 OpenShift 探测使用。端点不会公开任何有关部署的安全敏感数据,但无需任何身份验证即可访问。作为替代方案,在自定义 Route 上可以阻止 < your-server-context-root> /health endpoint。

例如,

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

    确保省略 tlsSecret 字段:

    apiVersion: k8s.keycloak.org/v2alpha1
    kind: Keycloak
    metadata:
      name: example-kc
    spec:
      proxy:
       Headers:xforwarded
      hostname:
        hostname: example.com
      ...
  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
注意

基于路径的路由需要为 edge 或 reencrypt 配置 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
  ...
注意

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 的外部实例。例如,红帽构建的 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 字段并扩展 server StatefulSet。这不再需要,因为红帽构建的 Keycloak Operator 中的 Keycloak CR 可以直接由 HPA 扩展。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.