3.3. 迁移 Keycloak CR
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。
例如,
创建为 TLS 边缘终止配置的 Keycloak。
确保省略
tlsSecret
字段:apiVersion: k8s.keycloak.org/v2alpha1 kind: Keycloak metadata: name: example-kc spec: proxy: Headers:xforwarded hostname: hostname: example.com ...
创建阻塞路由以禁止访问健康端点:
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 扩展。