第 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"
    Copy to Clipboard Toggle word wrap

    使用 openssl help 来获取所用的选项的命令行描述。

除了安装控制台的文件外,还需要预配置的文件来安装 Apache Kafka Operator 的 Streams,Prometheus Operator、Prometheus 实例和 Kafka 集群也包含在 Apache Kafka 控制台安装工件的 Streams 中。在此过程中,我们假定已安装了 operator。安装文件提供了设置和试用控制台的最快速方法,但您可以使用自己的 Apache Kafka 和 Prometheus 部署流。

流程

  1. 下载并提取 Apache Kafka 控制台安装工件的 Streams。

    工件包含在安装以及 Apache Kafka 软件下载页面的 Streams 中提供的示例文件。

    文件包含控制台、Kafka 集群和 Prometheus 所需的部署配置。

    示例 Kafka 配置会创建一个路由监听程序,控制台用来连接到 Kafka 集群。由于控制台和 Kafka 集群部署在同一 OpenShift 集群中,您可以使用 Kafka 集群的内部 bootstrap 地址而不是路由。

  2. 通过应用 Prometheus 安装文件,使用控制台所需的配置创建 Prometheus 实例:

    1. 编辑 console-prometheus-server.clusterrolebinding.yaml 文件中的 ${NAMESPACE},以使用 Prometheus 实例要安装到的命名空间:

      sed -i 's/${NAMESPACE}/'"my-project"'/g' <resource_path>/console-prometheus-server.clusterrolebinding.yaml
      Copy to Clipboard Toggle word wrap

      例如,在此流程中,我们将安装到 my-project 命名空间。配置将 Prometheus 的角色与其服务帐户绑定。

    2. 通过按照以下顺序应用安装文件来创建 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
      Copy to Clipboard Toggle word wrap

      实例名为 console-prometheus,用于连接控制台的服务的 URL 为 http://prometheus-operated.my-project.svc.cluster.local:9090,并且 my-project 从命名空间名称中获取。

      注意

      没有为 console-prometheus 实例部署路由,因为不需要从 OpenShift 集群外部访问它。

  3. 创建和部署 Kafka 集群。

    1. 如果您使用在 KRaft 模式下运行的 Kafka 集群的控制台,请在 console-kafka-metrics.configmap.yaml 文件中更新集群的指标配置:

      • 取消注释 KRaft 相关指标配置。
      • 注释掉 ZooKeeper 相关指标。

      此文件包含控制台所需的指标配置。

    2. 通过添加 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
        Copy to Clipboard Toggle word wrap

    3. 编辑 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
      Copy to Clipboard Toggle word wrap

      此文件包含用于创建 Kafka 集群的 Kafka 自定义资源配置。

      这些命令执行以下操作:

      • type: ${LISTENER_TYPE} 替换为 type: route。虽然本示例使用 路由类型,但您可以将 ${LISTENER_TYPE} 替换为部署的任何有效的监听程序类型。
      • ${CLUSTER_DOMAIN} 替换为指定 bootstrap 和 per-broker 服务使用的路由监听程序主机所需的基域值。默认情况下,路由 监听程序主机由 OpenShift 自动分配。但是,您可以通过指定主机来覆盖分配的路由主机。

      另外,您可以将 示例配置复制到您自己的 Kafka 部署 中。

    4. 通过按以下顺序应用安装文件来创建 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
      Copy to Clipboard Toggle word wrap

      如果您使用自己的 Kafka 集群,请应用更新的 Kafka 资源配置而不是 console-kafka.kafka.yaml

      安装文件会创建一个 Kafka 集群以及 Kafka 用户以及控制台所需的指标配置,用于连接到您要通过控制台监控的每个 Kafka 集群和指标配置。每个 Kafka 用户都需要一个唯一名称。

    5. 如果 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>
        # ...
      Copy to Clipboard Toggle word wrap

      这样可确保 Prometheus 可以监控 Kafka pod。将 <kafka_namespace > 替换为部署 Kafka 集群的实际命名空间。

  4. 检查部署的状态:

    oc get pods -n <my_console_namespace>
    Copy to Clipboard Toggle word wrap

    输出显示 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
    Copy to Clipboard Toggle word wrap

    在这里,console-kafka 是集群的名称。

    标识创建的 pod 的 pod ID。

    在默认部署中,您要安装三个 pod。

    READY 显示就绪/预期的副本数。当 STATUS 显示为 Running 时,部署成功。

  5. 安装 Apache Kafka 控制台的流。

    1. 编辑 console-server.clusterrolebinding.yaml 文件,以使用控制台实例要安装到的命名空间:

      sed -i 's/${NAMESPACE}/'"my-project"'/g' /<resource_path>console-server.clusterrolebinding.yaml
      Copy to Clipboard Toggle word wrap

      配置将控制台的角色与其服务帐户绑定。

    2. 通过应用安装文件(按以下顺序)安装控制台用户界面并路由到接口:

      # 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
      Copy to Clipboard Toggle word wrap

      安装会创建运行控制台用户界面所需的角色、角色绑定、服务帐户、服务和路由。

    3. 为控制台中的会话管理和身份验证,创建一个名为 console-ui-secretsSecret,其中包含两个 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>"
      Copy to Clipboard Toggle word wrap

      部署控制台时,secret 作为环境变量挂载。

    4. 获取为控制台用户界面创建的路由的主机名:

      oc get route console-ui-route -n my-project -o jsonpath='{.spec.host}'
      Copy to Clipboard Toggle word wrap

      访问控制台用户界面需要主机名。

    5. 编辑 console.deployment.yaml 文件以替换占位符:

      sed -i 's/${CONSOLE_HOSTNAME}/'"<route_hostname>"'/g' console.deployment.yaml
      sed -i 's/${NAMESPACE}/'"my-project"'/g' console.deployment.yaml
      Copy to Clipboard Toggle word wrap

      这些命令执行以下操作:

      • https://${CONSOLE_HOSTNAME} 替换为 https://<route_hostname >,这是用于访问控制台用户界面的路由。
      • ${NAMESPACE} 替换为 http://prometheus-operated.${NAMESPACE}.svc.cluster.local:9090 中的 my-project 命名空间名称,这是控制台使用的 Prometheus 实例的 URL。

      如果您使用自己的 Kafka 集群,请确保使用正确的集群名称,并将其他环境变量 配置为正确的值。这些值可让控制台连接到集群并检索指标。

    6. 安装控制台:

      oc apply -n my-project -f <resource_path>/console.deployment.yaml
      Copy to Clipboard Toggle word wrap

      输出显示控制台就绪

      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
      Copy to Clipboard Toggle word wrap

在您自己的 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: 
1

      - 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: 
2

      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: 
3

      type: jmxPrometheusExporter
      valueFrom:
        configMapKeyRef:
          name: console-cluster-metrics
          key: zookeeper-metrics-config.yml
Copy to Clipboard Toggle word wrap

1
为控制台连接公开集群的监听程序。在本例中,配置了路由监听程序。
2
Prometheus 指标,通过引用包含 Prometheus JMX 导出器配置的 ConfigMap 启用。
3
只有在使用带有 ZooKeeper 的 Apache Kafka 的 Streams for Apache Kafka 时才添加 ZooKeeper 配置。KRaft 模式不需要它。

检查控制台部署环境变量

如果使用自己的 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 
1

          value: SASL_SSL
        - name: KAFKA_SASL_MECHANISM 
2

          value: SCRAM-SHA-512
        - name: CONSOLE_KAFKA_CLUSTER1 
3

          value: my-project/console-kafka
        - name: CONSOLE_KAFKA_CLUSTER1_BOOTSTRAP_SERVERS 
4

          value: console-kafka-route1-bootstrap-my-project.router.com:443
        - name: CONSOLE_KAFKA_CLUSTER1_SASL_JAAS_CONFIG 
5

          valueFrom:
            secretKeyRef:
              name: console-kafka-user1
              key: sasl.jaas.config
      - name: console-ui
        # ...
        env:
        - name: NEXTAUTH_SECRET 
6

          valueFrom:
            secretKeyRef:
              name: console-ui-secrets
              key: NEXTAUTH_SECRET
        - name: SESSION_SECRET 
7

          valueFrom:
            secretKeyRef:
              name: console-ui-secrets
              key: SESSION_SECRET
        - name: NEXTAUTH_URL 
8

          value: 'https://console-ui-route-my-project.router.com'
        - name: BACKEND_URL  
9

          value: 'http://127.0.0.1:8080'
        - name: CONSOLE_METRICS_PROMETHEUS_URL 
10

          value: 'http://prometheus-operated.my-project.svc.cluster.local:9090'
Copy to Clipboard Toggle word wrap

1
用于与 Kafka 代理通信的安全协议。
2
Kafka 代理的控制台(客户端)身份验证的 SASL 机制。
3
必须与 Kafka 资源配置中为集群指定的命名空间和名称匹配。
4
bootstrap 代理地址的主机和端口对,用于发现并连接到 Kafka 集群中的所有代理。在本例中,使用路由监听程序地址。侦听器在 Kafka 资源中配置。
5
Kafka 用户的身份验证凭证,代表作为 Secret 挂载的控制台。当创建对应的用户时,console-kafka-user1 secret 会自动创建。secret 中的 sasl.jaas.config 属性包含 SASL 身份验证的 JAAS 配置。
6
用于在控制台中进行身份验证的 secret。
7
在控制台中会话管理的 secret
8
连接到 Apache Kafka 用户界面和用户访问控制台的流的 URL。
9
控制台用户界面与 进行通信的后端服务器,以进行数据检索。
10
连接到 Prometheus 实例的 URL,其中包括 Kafka 资源的命名空间(my-project)。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat