第 2 章 将 Apache Kafka 控制台的 Streams 连接到 Kafka 集群
将 Apache Kafka 控制台的 Streams 部署到与 Apache Kafka 的 Streams 管理的 Kafka 集群相同的 OpenShift 集群。使用流为 Apache Kafka 控制台提供的安装文件。
对于每个 Kafka 集群,用于安装集群的 Kafka 资源的配置需要以下内容:
- 控制台连接集群所需的足够授权。
- 启用 Prometheus 并且能够从集群中提取指标。
-
指标配置(通过
ConfigMap)以适合 Prometheus 的格式导出指标。
Apache Kafka 控制台的 Streams 需要 Kafka 用户,配置为 KafkaUser 自定义资源,以便控制台以身份验证和授权的用户身份访问集群。
当您配置 KafkaUser 身份验证和授权机制时,请确保它们与对应的 Kafka 配置匹配。
-
KafkaUser.spec.authentication匹配Kafka.spec.kafka.listeners[*].authentication -
KafkaUser.spec.authorization匹配Kafka.spec.kafka.authorization
Prometheus 必须被安装并配置为从 Kubernetes 和 Kafka 集群提取指标,并在控制台中填充指标图形。
先决条件
-
安装需要具有
cluster-admin角色的 OpenShift 用户,如system:admin。 - OpenShift 4.12 到 4.15 集群。
- 由 Streams for Apache Kafka 管理的 Kafka 集群在 OpenShift 集群中运行的。
- Prometheus Operator,必须是与为 OpenShift 监控部署的独立 Operator。
-
oc命令行工具已安装并配置为连接到 OpenShift 集群。 在控制台中会话管理和身份验证的 secret 值。
您可以使用 OpenSSL TLS 管理工具生成值,如下所示:
SESSION_SECRET=$(LC_CTYPE=C openssl rand -base64 32) echo "Generated SESSION_SECRET: $SESSION_SECRET" NEXTAUTH_SECRET=$(LC_CTYPE=C openssl rand -base64 32) echo "Generated NEXTAUTH_SECRET: $NEXTAUTH_SECRET"使用
openssl help来获取所用的选项的命令行描述。
除了安装控制台的文件外,还需要预配置的文件来安装 Apache Kafka Operator 的 Streams,Prometheus Operator、Prometheus 实例和 Kafka 集群也包含在 Apache Kafka 控制台安装工件的 Streams 中。在此过程中,我们假定已安装了 operator。安装文件提供了设置和试用控制台的最快速方法,但您可以使用自己的 Apache Kafka 和 Prometheus 部署流。
流程
下载并提取 Apache Kafka 控制台安装工件的 Streams。
工件包含在安装以及 Apache Kafka 软件下载页面的 Streams 中提供的示例文件。
文件包含控制台、Kafka 集群和 Prometheus 所需的部署配置。
示例 Kafka 配置会创建一个路由监听程序,控制台用来连接到 Kafka 集群。由于控制台和 Kafka 集群部署在同一 OpenShift 集群中,您可以使用 Kafka 集群的内部 bootstrap 地址而不是路由。
通过应用 Prometheus 安装文件,使用控制台所需的配置创建 Prometheus 实例:
编辑
console-prometheus-server.clusterrolebinding.yaml文件中的${NAMESPACE},以使用 Prometheus 实例要安装到的命名空间:sed -i 's/${NAMESPACE}/'"my-project"'/g' <resource_path>/console-prometheus-server.clusterrolebinding.yaml例如,在此流程中,我们将安装到
my-project命名空间。配置将 Prometheus 的角色与其服务帐户绑定。通过按照以下顺序应用安装文件来创建 Prometheus 实例:
# Prometheus security resources oc apply -n my-project -f <resource_path>/prometheus/console-prometheus-server.clusterrole.yaml oc apply -n my-project -f <resource_path>/prometheus/console-prometheus-server.serviceaccount.yaml oc apply -n my-project -f <resource_path>/prometheus/console-prometheus-server.clusterrolebinding.yaml # Prometheus PodMonitor and Kubernetes scrape configurations oc apply -n my-project -f <resource_path>/prometheus/kafka-resources.podmonitor.yaml oc apply -n my-project -f <resource_path>/prometheus/kubernetes-scrape-configs.secret.yaml # Prometheus instance oc apply -n my-project -f <resource_path>/prometheus/console-prometheus.prometheus.yaml实例名为
console-prometheus,用于连接控制台的服务的 URL 为http://prometheus-operated.my-project.svc.cluster.local:9090,并且my-project从命名空间名称中获取。注意没有为
console-prometheus实例部署路由,因为不需要从 OpenShift 集群外部访问它。
创建和部署 Kafka 集群。
如果您使用在 KRaft 模式下运行的 Kafka 集群的控制台,请在
console-kafka-metrics.configmap.yaml文件中更新集群的指标配置:- 取消注释 KRaft 相关指标配置。
- 注释掉 ZooKeeper 相关指标。
此文件包含控制台所需的指标配置。
通过添加 ACL 类型来为 Kafka 集群提供授权访问来编辑
console-kafka-user1.kafkauser.yaml文件中的KafkaUser自定义资源。Kafka 用户至少需要以下 ACL 规则:
-
描述集群资源的DescribeConfigs权限 -
所有
主题资源的读取、DescribeConfigs权限 所有
组资源的读取、描述权限用户授权设置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: console-kafka-user1 labels: strimzi.io/cluster: console-kafka spec: authentication: type: scram-sha-512 authorization: type: simple acls: - resource: type: cluster name: "" patternType: literal operations: - Describe - DescribeConfigs - resource: type: topic name: "*" patternType: literal operations: - Read - Describe - DescribeConfigs - resource: type: group name: "*" patternType: literal operations: - Read - Describe
-
编辑
console-kafka.kafka.yaml文件以替换占位符:sed -i 's/type: ${LISTENER_TYPE}/type: route/g' console-kafka.kafka.yaml sed -i 's/\${CLUSTER_DOMAIN}/'"<my_router_base_domain>"'/g' console-kafka.kafka.yaml此文件包含用于创建
Kafka集群的 Kafka 自定义资源配置。这些命令执行以下操作:
-
将
type: ${LISTENER_TYPE}替换为type: route。虽然本示例使用路由类型,但您可以将${LISTENER_TYPE}替换为部署的任何有效的监听程序类型。 -
将
${CLUSTER_DOMAIN}替换为指定 bootstrap 和 per-broker 服务使用的路由监听程序主机所需的基域值。默认情况下,路由监听程序主机由 OpenShift 自动分配。但是,您可以通过指定主机来覆盖分配的路由主机。
另外,您可以将 示例配置复制到您自己的 Kafka 部署 中。
-
将
通过按以下顺序应用安装文件来创建 Kafka 集群:
# Metrics configuration oc apply -n my-project -f <resource_path>/console-kafka-metrics.configmap.yaml # Create the cluster oc apply -n my-project -f <resource_path>/console-kafka.kafka.yaml # Create a user for the cluster oc apply -n my-project -f <resource_path>/console-kafka-user1.kafkauser.yaml如果您使用自己的 Kafka 集群,请应用更新的
Kafka资源配置而不是console-kafka.kafka.yaml。安装文件会创建一个 Kafka 集群以及 Kafka 用户以及控制台所需的指标配置,用于连接到您要通过控制台监控的每个 Kafka 集群和指标配置。每个 Kafka 用户都需要一个唯一名称。
如果 Kafka 集群位于与 Prometheus 实例不同的命名空间中,请修改
kafka-resources.podmonitor.yaml文件使其包含namespaceSelector:apiVersion: monitoring.coreos.com/v1 kind: PodMonitor metadata: name: kafka-resources labels: app: console-kafka-monitor spec: namespaceSelector: matchNames: - <kafka_namespace> # ...这样可确保 Prometheus 可以监控 Kafka pod。将
<kafka_namespace> 替换为部署 Kafka 集群的实际命名空间。
检查部署的状态:
oc get pods -n <my_console_namespace>输出显示 Operator 和集群就绪度
NAME READY STATUS RESTARTS strimzi-cluster-operator 1/1 Running 0 console-kafka-kafka-0 1/1 Running 0 console-kafka-kafka-1 1/1 Running 0 console-kafka-kafka-2 1/1 Running 0 prometheus-operator-... 1/1 Running 0 prometheus-console-prometheus 1/1 Running 0在这里,
console-kafka是集群的名称。标识创建的 pod 的 pod ID。
在默认部署中,您要安装三个 pod。
READY 显示就绪/预期的副本数。当 STATUS 显示为 Running 时,部署成功。
安装 Apache Kafka 控制台的流。
编辑
console-server.clusterrolebinding.yaml文件,以使用控制台实例要安装到的命名空间:sed -i 's/${NAMESPACE}/'"my-project"'/g' /<resource_path>console-server.clusterrolebinding.yaml配置将控制台的角色与其服务帐户绑定。
通过应用安装文件(按以下顺序)安装控制台用户界面并路由到接口:
# Console security resources oc apply -n my-project -f <resource_path>/console-server.clusterrole.yaml oc apply -n my-project -f <resource_path>/console-server.serviceaccount.yaml oc apply -n my-project -f <resource_path>/console-server.clusterrolebinding.yaml # Console user interface service oc apply -n my-project -f <resource_path>/console-ui.service.yaml # Console route oc apply -n my-project -f <resource_path>/console-ui.route.yaml安装会创建运行控制台用户界面所需的角色、角色绑定、服务帐户、服务和路由。
为控制台中的会话管理和身份验证,创建一个名为
console-ui-secrets的Secret,其中包含两个 secret 值(如先决条件中所述):oc create secret generic console-ui-secrets -n my-project \ --from-literal=SESSION_SECRET="<session_secret_value>" \ --from-literal=NEXTAUTH_SECRET="<next_secret_value>"部署控制台时,secret 作为环境变量挂载。
获取为控制台用户界面创建的路由的主机名:
oc get route console-ui-route -n my-project -o jsonpath='{.spec.host}'访问控制台用户界面需要主机名。
编辑
console.deployment.yaml文件以替换占位符:sed -i 's/${CONSOLE_HOSTNAME}/'"<route_hostname>"'/g' console.deployment.yaml sed -i 's/${NAMESPACE}/'"my-project"'/g' console.deployment.yaml这些命令执行以下操作:
-
将
https://${CONSOLE_HOSTNAME}替换为https://<route_hostname>,这是用于访问控制台用户界面的路由。 -
将
${NAMESPACE}替换为http://prometheus-operated.${NAMESPACE}.svc.cluster.local:9090中的my-project命名空间名称,这是控制台使用的 Prometheus 实例的 URL。
如果您使用自己的 Kafka 集群,请确保使用正确的集群名称,并将其他环境变量 配置为正确的值。这些值可让控制台连接到集群并检索指标。
-
将
安装控制台:
oc apply -n my-project -f <resource_path>/console.deployment.yaml输出显示控制台就绪
NAME READY STATUS RESTARTS strimzi-cluster-operator 1/1 Running 0 console-kafka-kafka-0 1/1 Running 0 console-kafka-kafka-0 1/1 Running 0 console-kafka-kafka-0 1/1 Running 0 prometheus-operator-... 1/1 Running 0 prometheus-console-prometheus 1/1 Running 0 console-... 2/2 Running 0
在您自己的 Kafka 集群中添加示例配置
如果您已经安装了 Kafka 集群,您可以使用所需的配置更新 Kafka 资源。在应用集群配置文件时,请使用更新的 Kafka 资源,而不是使用由 Apache Kafka Console 安装文件提供的 Kafka 资源。
Kafka 资源需要以下配置:
-
用于公开集群以进行控制台连接
的路由监听程序 - 为检索集群中的指标启用 Prometheus 指标。如果您使用 ZooKeeper 进行元数据管理,请为 ZooKeeper 添加相同的配置。
-
如果集群名称与控制台部署文件(
console-kafka)中使用的集群名称不匹配,请更新引用 Kafka 集群名称的部署文件,如console-kafka-user1.kafkauser.yaml。
Prometheus 指标配置必须引用 ConfigMap,该 ConfigMap 提供控制台所需的指标配置。指标配置在 console-cluster-metrics.configmap.yaml 资源配置文件中提供。
控制台连接的 Kafka 集群配置示例
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
name: console-kafka
namespace: my-project
spec:
entityOperator:
topicOperator: {}
userOperator: {}
kafka:
authorization:
type: simple
config:
allow.everyone.if.no.acl.found: 'true'
default.replication.factor: 3
inter.broker.protocol.version: '3.6'
min.insync.replicas: 2
offsets.topic.replication.factor: 3
transaction.state.log.min.isr: 2
transaction.state.log.replication.factor: 3
listeners:
- name: route1
port: 9094
tls: true
type: route
authentication:
type: scram-sha-512
replicas: 3
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 10Gi
deleteClaim: false
metricsConfig:
type: jmxPrometheusExporter
valueFrom:
configMapKeyRef:
name: console-cluster-metrics
key: kafka-metrics-config.yml
version: 3.6.0
zookeeper:
replicas: 3
storage:
deleteClaim: false
size: 10Gi
type: persistent-claim
metricsConfig:
type: jmxPrometheusExporter
valueFrom:
configMapKeyRef:
name: console-cluster-metrics
key: zookeeper-metrics-config.yml
检查控制台部署环境变量
如果使用自己的 Kafka 集群,请检查控制台的部署配置是否有所需的环境变量。
以下前缀决定了环境变量值的范围:
-
KAFKA代表所有 Kafka 集群的配置。 -
CONSOLE_KAFKA_<UNIQUE_NAME_ID_FOR_CLUSTER> 代表每个特定集群的配置。
控制台部署配置示例
apiVersion: apps/v1
kind: Deployment
metadata:
name: console
spec:
replicas: 1
# ...
template:
metadata:
labels:
app: console
spec:
# ...
containers:
- name: console-api
# ...
env:
- name: KAFKA_SECURITY_PROTOCOL
value: SASL_SSL
- name: KAFKA_SASL_MECHANISM
value: SCRAM-SHA-512
- name: CONSOLE_KAFKA_CLUSTER1
value: my-project/console-kafka
- name: CONSOLE_KAFKA_CLUSTER1_BOOTSTRAP_SERVERS
value: console-kafka-route1-bootstrap-my-project.router.com:443
- name: CONSOLE_KAFKA_CLUSTER1_SASL_JAAS_CONFIG
valueFrom:
secretKeyRef:
name: console-kafka-user1
key: sasl.jaas.config
- name: console-ui
# ...
env:
- name: NEXTAUTH_SECRET
valueFrom:
secretKeyRef:
name: console-ui-secrets
key: NEXTAUTH_SECRET
- name: SESSION_SECRET
valueFrom:
secretKeyRef:
name: console-ui-secrets
key: SESSION_SECRET
- name: NEXTAUTH_URL
value: 'https://console-ui-route-my-project.router.com'
- name: BACKEND_URL
value: 'http://127.0.0.1:8080'
- name: CONSOLE_METRICS_PROMETHEUS_URL
value: 'http://prometheus-operated.my-project.svc.cluster.local:9090'
- 1
- 用于与 Kafka 代理通信的安全协议。
- 2
- Kafka 代理的控制台(客户端)身份验证的 SASL 机制。
- 3
- 必须与
Kafka资源配置中为集群指定的命名空间和名称匹配。 - 4
- bootstrap 代理地址的主机和端口对,用于发现并连接到 Kafka 集群中的所有代理。在本例中,使用路由监听程序地址。侦听器在
Kafka资源中配置。 - 5
- Kafka 用户的身份验证凭证,代表作为
Secret挂载的控制台。当创建对应的用户时,console-kafka-user1secret 会自动创建。secret 中的sasl.jaas.config属性包含 SASL 身份验证的 JAAS 配置。 - 6
- 用于在控制台中进行身份验证的 secret。
- 7
- 在控制台中会话管理的 secret
- 8
- 连接到 Apache Kafka 用户界面和用户访问控制台的流的 URL。
- 9
- 控制台用户界面与 进行通信的后端服务器,以进行数据检索。
- 10
- 连接到 Prometheus 实例的 URL,其中包括
Kafka资源的命名空间(my-project)。