本章论述了如何使用自定义资源(CR)进行红帽构建的 Keycloak 部署的高级配置。
许多服务器选项都作为 Keycloak CR 中的第一类会面字段公开。CR 的结构基于红帽构建的 Keycloak 的配置结构。例如,若要配置服务器的 https-port,请在 CR 中遵循类似模式,并使用 httpsPort 字段。以下示例是复杂的服务器配置,但它演示了服务器选项和 Keycloak CR 之间的关系:
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
db:
vendor: postgres
usernameSecret:
name: usernameSecret
key: usernameSecretKey
passwordSecret:
name: passwordSecret
key: passwordSecretKey
host: host
database: database
port: 123
schema: schema
poolInitialSize: 1
poolMinSize: 2
poolMaxSize: 3
http:
httpEnabled: true
httpPort: 8180
httpsPort: 8543
tlsSecret: my-tls-secret
hostname:
hostname: https://my-hostname.tld
admin: https://my-hostname.tld/admin
strict: false
backchannelDynamic: true
features:
enabled:
- docker
- authorization
disabled:
- admin
- step-up-authentication
transaction:
xaEnabled: false
apiVersion : k8s.keycloak.org/v2alpha1
kind : Keycloak
metadata :
name : example- kc
spec :
db :
vendor : postgres
usernameSecret :
name : usernameSecret
key : usernameSecretKey
passwordSecret :
name : passwordSecret
key : passwordSecretKey
host : host
database : database
port : 123
schema : schema
poolInitialSize : 1
poolMinSize : 2
poolMaxSize : 3
http :
httpEnabled : true
httpPort : 8180
httpsPort : 8543
tlsSecret : my- tls- secret
hostname :
hostname : https: //my- hostname.tld
admin : https: //my- hostname.tld/admin
strict : false
backchannelDynamic : true
features :
enabled :
- docker
- authorization
disabled :
- admin
- step- up- authentication
transaction :
xaEnabled : false
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
有关选项列表,请参阅 Keycloak CRD。有关配置选项的详情,请查看 所有配置 。
一些专家服务器选项作为 Keycloak CR 中的专用字段不可用。以下是省略的字段示例:
需要深入了解底层红帽构建的 Keycloak 实现的字段
与 OpenShift 环境无关的字段
供应商配置的字段,因为它们基于使用的供应商实现动态
Keycloak CR 的 additionalOptions 字段可让红帽构建 Keycloak 以键值对的形式接受任何可用的配置。您可以使用此字段包含 Keycloak CR 中省略的任何选项。有关配置选项的详情,请查看 所有配置 。
这些值可以表示为纯文本字符串或 Secret 对象引用,如下例所示:
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
...
additionalOptions:
- name: spi-connections-http-client--default--connection-pool-size
secret: # Secret reference
name: http-client-secret # name of the Secret
key: poolSize # name of the Key in the Secret
- name: spi-email-template--mycustomprovider--enabled
value: true # plain text value
apiVersion : k8s.keycloak.org/v2alpha1
kind : Keycloak
metadata :
name : example- kc
spec :
...
additionalOptions :
- name : spi- connections- http- client- - default- - connection- pool- size
secret :
name : http- client- secret
key : poolSize
- name : spi- email- template- - mycustomprovider- - enabled
value : true
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
您可能会发现需要设置自定义环境变量 - 例如用于主题属性或 kc.[sh|bat] 脚本变量。Keycloak CR 的 spec.env 字段允许您直接设置任何环境变量。根据查找特定设置的值,Operator 中的逻辑不会参考 spec.env,因此不要对 CR 中具有第一类配置的任何使用 spec.env,或者可作为 额外的选项 指定。
以下是设置 JAVA_OPTS_APPEND 的示例:
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
...
env:
- name: JAVA_OPTS_APPEND
value: -Djava.net.preferIPv6Addresses=true
apiVersion : k8s.keycloak.org/v2alpha1
kind : Keycloak
metadata :
name : example- kc
spec :
...
env :
- name : JAVA_OPTS_APPEND
value : - Djava.net.preferIPv6Addresses=true
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
与 additionalOptions 类似,您可以指定一个值或引用 Secret。
Secret References 由 Keycloak CR 中的一些专用选项使用,如 tlsSecret,或作为 additionalOptions 中的值。
同样,ConfigMap 引用也被选项(如 configMapFile )使用。
在指定 Secret 或 ConfigMap 参考时,请确保包含引用密钥的 Secret 或 ConfigMap 存在于与引用它的 CR 相同的命名空间中。
Operator 每分钟会轮询大约一分钟,以更改引用的 Secret 或 ConfigMap。当检测到有意义的更改时,Operator 会执行红帽构建的 Keycloak Deployment 的滚动重启来获取更改。
CR 的 unsupported 字段包含没有完全测试且技术预览的高实验配置选项。
Pod 模板是一种原始 API 表示,用于 Deployment 模板。如果用例的 CR 的顶层没有支持的字段,则此字段是一个临时解决方案。
Operator 将提供的模板的字段与 Operator 为特定 Deployment 生成的值合并。使用此功能,您可以访问高级别的自定义。但是,没有保证 Deployment 将按预期工作。
以下示例演示了注入标签、注解、卷和卷挂载:
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
...
unsupported:
podTemplate:
metadata:
labels:
my-label: "keycloak"
spec:
containers:
- volumeMounts:
- name: test-volume
mountPath: /mnt/test
volumes:
- name: test-volume
secret:
secretName: keycloak-additional-secret
apiVersion : k8s.keycloak.org/v2alpha1
kind : Keycloak
metadata :
name : example- kc
spec :
...
unsupported :
podTemplate :
metadata :
labels :
my-label : "keycloak"
spec :
containers :
- volumeMounts :
- name : test- volume
mountPath : /mnt/test
volumes :
- name : test- volume
secret :
secretName : keycloak- additional- secret
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Keycloak CR 会公开选项,以对三个探测(就绪度、存活度和启动)设置 periodSeconds 和 failureThreshold
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
readinessProbe:
periodSeconds: 20
failureThreshold: 5
livenessProbe:
periodSeconds: 20
failureThreshold: 5
startupProbe:
periodSeconds: 20
failureThreshold: 5
apiVersion : k8s.keycloak.org/v2alpha1
kind : Keycloak
metadata :
name : example- kc
spec :
readinessProbe :
periodSeconds : 20
failureThreshold : 5
livenessProbe :
periodSeconds : 20
failureThreshold : 5
startupProbe :
periodSeconds : 20
failureThreshold : 5
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Red Hat build of Keycloak 和 Red Hat build of Keycloak Operator 提供了最佳的生产环境就绪体验。但是,在开发阶段,您可以禁用关键安全功能。
特别是,您可以禁用主机名和 TLS,如下例所示:
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
...
http:
httpEnabled: true
hostname:
strict: false
apiVersion : k8s.keycloak.org/v2alpha1
kind : Keycloak
metadata :
name : example- kc
spec :
...
http :
httpEnabled : true
hostname :
strict : false
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
Keycloak CR 允许指定资源选项来管理红帽构建的 Keycloak 容器的计算资源。它提供通过 Keycloak CR 独立请求和限制资源的功能,以及通过 Realm Import CR 为 realm 导入作业进行隔离。
如果没有指定值,默认 请求内存 设置为 1700MiB,限制 内存设置为 2GiB。根据红帽构建的 Keycloak 内存管理深度分析来选择这些值。
如果没有在 Realm Import CR 中指定值,它将回退到 Keycloak CR 中指定的值,或者返回上述定义的默认值。
您可以根据要求指定自定义值,如下所示:
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
...
resources:
requests:
cpu: 1200m
memory: 896Mi
limits:
cpu: 6
memory: 3Gi
apiVersion : k8s.keycloak.org/v2alpha1
kind : Keycloak
metadata :
name : example- kc
spec :
...
resources :
requests :
cpu : 1200m
memory : 896Mi
limits :
cpu : 6
memory : 3Gi
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
此外,红帽构建的 Keycloak 容器通过提供堆大小的相对值,从而更有效地管理堆大小。它可以通过提供某些 JVM 选项来实现。
如需了解更多详细信息,请参阅 在容器中运行红帽构建的 Keycloak 。
您可以通过 Keycloak CR 控制服务器 Pod 调度的一些方面。scheduling 小节会公开可选的标准 Kubernetes 关联性、容限、拓扑分布约束和优先级类名称,以微调服务器 Pod 的调度和放置。
使用所有调度字段的示例:
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
scheduling:
priorityClassName: custom-high
affinity:
podAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- podAffinityTerm:
labelSelector:
matchLabels:
app: keycloak
app.kubernetes.io/managed-by: keycloak-operator
app.kubernetes.io/component: server
topologyKey: topology.kubernetes.io/zone
weight: 10
tolerations:
- key: "some-taint"
operator: "Exists"
effect: "NoSchedule"
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
...
...
apiVersion : k8s.keycloak.org/v2alpha1
kind : Keycloak
metadata :
name : example- kc
spec :
scheduling :
priorityClassName : custom- high
affinity :
podAffinity :
preferredDuringSchedulingIgnoredDuringExecution :
- podAffinityTerm :
labelSelector :
matchLabels :
app : keycloak
app.kubernetes.io/managed-by : keycloak- operator
app.kubernetes.io/component : server
topologyKey : topology.kubernetes.io/zone
weight : 10
tolerations :
- key : "some-taint"
operator : "Exists"
effect : "NoSchedule"
topologySpreadConstraints :
- maxSkew : 1
topologyKey : kubernetes.io/hostname
whenUnsatisfiable : DoNotSchedule
...
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
有关调度概念的更多信息 ,请参阅 kubernetes 文档。
如果没有指定自定义关联性,您的 Pod 将具有同一区域和节点的反关联性,以改进可用性。
要更改管理界面的端口,请在 Keycloak CR 中使用第一类色列字段 httpManagement.port。要更改管理界面的属性,您可以通过提供 additionalOptions 字段来实现它。
您可以指定 port 和 additionalOptions,如下所示:
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
httpManagement:
port: 9001
additionalOptions:
- name: http-management-relative-path
value: /management
apiVersion : k8s.keycloak.org/v2alpha1
kind : Keycloak
metadata :
name : example- kc
spec :
httpManagement :
port : 9001
additionalOptions :
- name : http- management- relative- path
value : /management
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
如果使用自定义镜像,Operator 会 不知道 在其中可能指定的任何配置选项。例如,管理接口可以使用 https,但当自定义镜像中指定 TLS 设置时,Operator 会通过 http 访问它。为确保正确的 TLS 配置,请使用 Keycloak CR 中的 tlsSecret 和 truststores 字段,以便 Operator 可以反映这一点。
如需了解更多详细信息 ,请参阅配置管理界面 。
如果您需要提供可信证书,Keycloak CR 提供了顶级功能来配置服务器的信任存储,如 配置可信证书 中所述。
使用 Keycloak spec 的 truststores 小节来指定包含 PEM 编码文件的 Secret 或 ConfigMap,或使用扩展 .p12、.pfx 或 .pkcs12 文件的 PKCS12 文件,例如:
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
...
truststores:
my-truststore:
secret:
name: my-secret
apiVersion : k8s.keycloak.org/v2alpha1
kind : Keycloak
metadata :
name : example- kc
spec :
...
truststores :
my-truststore :
secret :
name : my- secret
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
其中 my-secret 的内容可以是 PEM 文件,例如:
apiVersion: v1
kind: Secret
metadata:
name: my-secret
stringData:
cert.pem: |
-----BEGIN CERTIFICATE-----
...
apiVersion : v1
kind : Secret
metadata :
name : my- secret
stringData :
cert.pem : |
-----BEGIN CERTIFICATE-----
...
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
在 Kubernetes 或 OpenShift 环境中,自动包含可信证书的已知位置。这包括 /var/run/secrets/kubernetes.io/serviceaccount/ca.crt 和 /var/run/secrets/kubernetes.io/serviceaccount/service-ca.crt。
当您创建新实例时,Keycloak CR spec.bootstrapAdmin 小节可用于配置 bootstrap 用户和/或服务帐户。如果没有为 spec.bootstrapAdmin 指定任何内容,Operator 将创建一个名为 "metadata.name"-initial-admin 的 Secret,其带有用户名 temp-admin 和生成的密码。如果您为 bootstrap admin 用户指定 Secret 名称,则 Secret 将需要包含用户名和密码键值对。 如果您为 bootstrap admin 服务帐户指定 Secret 名称,则 Secret 将需要包含 client-id 和 client-secret 键值对。
如果已为集群创建了 master 域,则 spec.boostrapAdmin 会被有效地忽略。如果您需要创建恢复 admin 帐户,则需要直接在 Pod 上运行 CLI 命令。
有关如何引导临时 admin 用户或服务帐户并恢复丢失的 admin 访问权限的更多信息,请参阅 Bootstrapping 和恢复管理员帐户 指南。
追踪允许对每个请求的生命周期进行详细监控,这有助于快速识别和诊断问题,从而更有效地调试和维护。
您可以通过 Keycloak CR 字段更改追踪配置,如下所示:
apiVersion: k8s.keycloak.org/v2alpha1
kind: Keycloak
metadata:
name: example-kc
spec:
tracing:
enabled: true # default 'false'
endpoint: http://my-tracing:4317 # default 'http://localhost:4317'
samplerType: parentbased_traceidratio # default 'traceidratio'
samplerRatio: 0.01 # default '1'
resourceAttributes:
some.attribute: something
additionalOptions:
- name: tracing-jdbc-enabled
value: false # default 'true'
apiVersion : k8s.keycloak.org/v2alpha1
kind : Keycloak
metadata :
name : example- kc
spec :
tracing :
enabled : true
endpoint : http: //my- tracing: 4317
samplerType : parentbased_traceidratio
samplerRatio : 0.01
resourceAttributes :
some.attribute : something
additionalOptions :
- name : tracing- jdbc- enabled
value : false
Copy to Clipboard
Copied!
Toggle word wrap
Toggle overflow
这些字段应该反映在 1:1 关联, 它们包括了更多信息。
tracing-jdbc-enabled 不会被推广为第一类的会面,因为它可能无法在将来被良好管理,因此需要通过 additionalOptions 字段进行设置。
有关追踪的详情,请参阅 Root 原因分析追踪 。
NetworkPolicies 允许您为集群中的流量流指定规则,并在 Pod 和外部世界之间指定规则。集群必须使用支持 NetworkPolicy 强制的网络插件来限制网络流量。
Operator 会自动创建一个 NetworkPolicy 来拒绝访问红帽构建的 Keycloak Pod 的集群端口。HTTP (S)端点打开到来自任何命名空间和外部世界的流量。
要禁用 NetworkPolicy,在 Keycloak CR 中设置 spec.networkPolicy.enabled,如下例所示。
默认情况下,所有源都允许到 HTTP 端点的流量和管理端点。Keycloak CR 可以扩展为由红帽构建 Keycloak 公开的每个端点包含规则列表。这些规则指定允许流量的位置(源),并可与红帽的 Keycloak Pod 构建通信。
1
它定义 HTTP 端点的规则(默认为端口 8080)。由于安全原因,HTTP 端点默认是禁用的。
2
它定义 HTTPS 端点的访问规则(默认为端口 8443)。
3
它定义管理端点的访问规则(默认为端口 9000)。Kubernetes 探测器使用管理端点,并公开红帽构建的 Keycloak 指标。
规则语法与 Kubernetes Network Policy 使用的语法相同。可以轻松地将现有规则迁移到 Keycloak CP 中。如需更多信息,请检查 规则语法 。
例如,我们假设有一个红帽构建的 Keycloak 部署在 OpenShift 集群中运行。用户必须有权访问红帽构建的 Keycloak 才能登录,因此红帽构建的 Keycloak 必须可以被互联网访问。
要使此示例更有趣,让我们假设是否监控红帽构建的 Keycloak。启用监控,如 OpenShift 文档页面中所述: 为用户定义的项目启用监控项目 。
根据这些要求,Keycloak CR 将类似如下(大多数部分都会被忽略,如 DB 连接和安全):
1
启用 Ingress 供外部访问。
2
默认 OpenShift Ingress class pod 在 openshift-ingress 命名空间中运行。我们允许来自这些 pod 的流量来访问红帽构建的 Keycloak HTTPS 端点。来自 OpenShift 集群外部的流量会遍历这些容器集。
3
Prometheus Pod 在 openshift-user-workload-monitoring 中运行。它们需要访问红帽构建的 Keycloak 来提取可用的指标。
有关 NetworkPolicies 的更多信息,请参阅 Kubernetes Network Policies 文档 。
如果需要将自定义标签或注解设置为 keycloak 服务,您可以通过 spec. http.labels 和 spec.http.annotations 完成此操作