在 OpenShift 中部署和管理 AMQ Streams
在 OpenShift Container Platform 中部署和管理 AMQ Streams 2.5
摘要
使开源包含更多
红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。有关更多详情,请参阅我们的首席技术官 Chris Wright 提供的消息。
第 1 章 部署概述
AMQ Streams 简化了在 OpenShift 集群中运行 Apache Kafka 的过程。
本指南提供有关部署和管理 AMQ Streams 的说明。部署选项和步骤使用 AMQ Streams 中包含的示例安装文件进行。虽然指南突出显示了重要的配置注意事项,但它并不涵盖所有可用选项。要深入了解 Kafka 组件配置选项,请参阅 AMQ Streams 自定义资源 API 参考。
除了部署说明外,指南还提供了部署前和部署后指导。它涵盖了设置并保护对 Kafka 集群的客户端访问。另外,它探索额外的部署选项,如指标集成、分布式追踪和集群管理工具,如 Cruise Control 和 AMQ Streams Drain Cleaner。您还将发现有关管理 AMQ Streams 和微调 Kafka 配置的建议,以获得最佳性能。
AMQ Streams 和 Kafka 都提供了升级说明,以帮助保持部署最新。
AMQ Streams 设计为与所有类型的 OpenShift 集群兼容,无论其发行版无关。无论您的部署涉及公有云或私有云,还是要设置本地开发环境,本指南中的说明适用于所有情况。
1.1. AMQ Streams 自定义资源
使用 AMQ Streams 将 Kafka 组件部署到 OpenShift 集群可以通过自定义资源的应用程序进行配置。这些自定义资源作为自定义资源定义(CRD)添加的 API 实例创建,以扩展 OpenShift 资源。
CRD 充当描述 OpenShift 集群中的自定义资源的配置说明,由 AMQ Streams 提供,用于部署中使用的每个 Kafka 组件,以及用户和主题。CRD 和自定义资源被定义为 YAML 文件。AMQ Streams 发行版提供了 YAML 文件示例。
CRD 还允许 AMQ Streams 资源从原生 OpenShift 功能中获益,如 CLI 访问和配置验证。
1.1.1. AMQ Streams 自定义资源示例
CRD 需要在集群中进行一次性安装,以定义用于实例化和管理 AMQ Streams 特定资源的模式。
在安装 CRD 中添加新的自定义资源类型后,您可以根据规格创建资源实例。
根据集群设置,安装通常需要集群管理员特权。
管理自定义资源的访问权限仅限于 AMQ Streams 管理员。如需更多信息,请参阅 第 4.5 节 “设计 AMQ Streams 管理员”。
在 OpenShift 集群中,CRD 定义了一个新的资源 kind
,如 kind:Kafka
。
Kubernetes API 服务器允许根据类型
创建自定义资源,并通过 CRD 了解在添加到 OpenShift 时如何验证和存储自定义资源。
删除 CustomResourceDefinition
时,该类型的自定义资源也会被删除。另外,自定义资源创建的 OpenShift 资源也会被删除,如 Deployment
、Pod
、Service
和 ConfigMap
资源。
每个 AMQ Streams 特定的自定义资源符合为资源的类型
的 CRD 定义的架构。AMQ Streams 组件的自定义资源具有通用配置属性,它们在 spec
下定义。
要了解 CRD 和自定义资源之间的关系,请参阅 Kafka 主题的 CRD 示例。
Kafka 主题 CRD
apiVersion: kafka.strimzi.io/v1beta2 kind: CustomResourceDefinition metadata: 1 name: kafkatopics.kafka.strimzi.io labels: app: strimzi spec: 2 group: kafka.strimzi.io versions: v1beta2 scope: Namespaced names: # ... singular: kafkatopic plural: kafkatopics shortNames: - kt 3 additionalPrinterColumns: 4 # ... subresources: status: {} 5 validation: 6 openAPIV3Schema: properties: spec: type: object properties: partitions: type: integer minimum: 1 replicas: type: integer minimum: 1 maximum: 32767 # ...
- 1
- 主题 CRD 的元数据、名称和标签来标识 CRD。
- 2
- 此 CRD 的规格,包括组(域)名称、复数名称和受支持的模式版本,它们用于 URL 用于访问主题的 API。其他名称用于识别 CLI 中的实例资源。例如,
oc get kafkatopic my-topic
或oc get kafkatopics
。 - 3
- CLI 命令可以使用短名称。例如,
oc get kt
是oc get kafkatopic
的缩写形式。 - 4
- 对自定义资源使用
get
命令时显示的信息。 - 5
- CRD 的当前状态,如资源的 schema 引用 中所述。
- 6
- openAPIV3Schema 验证提供了创建主题自定义资源的验证。例如,主题至少需要一个分区和一个副本。
您可以识别 AMQ Streams 安装文件提供的 CRD YAML 文件,因为文件名包含一个索引号,后跟 'Crd'。
以下是 KafkaTopic
自定义资源的对应示例。
Kafka 主题自定义资源
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic 1 metadata: name: my-topic labels: strimzi.io/cluster: my-cluster 2 spec: 3 partitions: 1 replicas: 1 config: retention.ms: 7200000 segment.bytes: 1073741824 status: conditions: 4 lastTransitionTime: "2019-08-20T11:37:00.706Z" status: "True" type: Ready observedGeneration: 1 / ...
自定义资源可以通过平台 CLI 应用到集群。创建自定义资源时,它会使用与 Kubernetes API 内置资源相同的验证。
创建 KafkaTopic
自定义资源后,主题 Operator 会通知,并在 AMQ Streams 中创建相应的 Kafka 主题。
1.2. AMQ Streams operator
AMQ Streams operator 是专门构建的,具有专家操作知识,以便在 OpenShift 上有效地管理 Kafka。每个操作器都执行不同的功能。
- Cluster Operator
- Cluster Operator 在 OpenShift 上处理 Apache Kafka 集群的部署和管理。它自动设置 Kafka 代理和其他 Kafka 组件和资源。
- Topic Operator
- 主题 Operator 管理 Kafka 集群中的创建、配置和删除主题。
- User Operator
- User Operator 管理需要访问 Kafka 代理的 Kafka 用户。
部署 AMQ Streams 时,您首先部署 Cluster Operator。然后,Cluster Operator 已准备好处理 Kafka 的部署。您还可以使用 Cluster Operator (推荐)或独立 Operator 部署 Topic Operator 和 User Operator。您可以将独立 Operator 与不是由 Cluster Operator 管理的 Kafka 集群一起使用。
主题 Operator 和 User Operator 是实体 Operator 的一部分。Cluster Operator 可以基于 Entity Operator 配置部署一个或多个 Operator。
要部署独立 Operator,您需要设置环境变量以连接到 Kafka 集群。如果您使用 Cluster Operator 部署 Operator,则不需要设置这些环境变量,因为它们将由 Cluster Operator 设置。
1.2.1. 在 OpenShift 命名空间中观察 AMQ Streams 资源
Operator 在 OpenShift 命名空间中观察和管理 AMQ Streams 资源。Cluster Operator 可以监控单个命名空间、多个命名空间或 OpenShift 集群中的所有命名空间。主题 Operator 和用户 Operator 可以监视单个命名空间。
-
Cluster Operator 监视
Kafka
资源 -
主题 Operator 监视
KafkaTopic
资源 -
User Operator 监视
KafkaUser
资源
主题 Operator 和 User Operator 只能监视命名空间中的单个 Kafka 集群。它们只能连接到单个 Kafka 集群。
如果多个主题 Operator 监视同一命名空间,则可能会出现名称冲突和主题删除。这是因为每个 Kafka 集群都使用具有相同名称的 Kafka 主题(如 __consumer_offsets
)。请确定只有一个主题 Operator 会监视给定的命名空间。
当将多个用户 Operator 与单个命名空间一起使用时,带有给定用户名的用户可在多个 Kafka 集群中存在。
如果使用 Cluster Operator 部署 Topic Operator 和 User Operator,它们默认监控 Cluster Operator 部署的 Kafka 集群。您还可以使用 operator 配置中的 watchedNamespace
指定命名空间。
对于每个 Operator 的独立部署,您可以指定一个命名空间和与 Kafka 集群的连接,以便在配置中监视。
1.2.2. 管理 RBAC 资源
Cluster Operator 为需要访问 OpenShift 资源的 AMQ Streams 组件创建和管理基于角色的访问控制(RBAC)资源。
要使 Cluster Operator 正常工作,OpenShift 集群中的权限需要与 Kafka 资源交互,如 Kafka
和 KafkaConnect
,以及 ConfigMap
、Pod
、Deployment
和 Service
等受管资源。
通过以下 OpenShift RBAC 资源指定权限:
-
ServiceAccount
-
Role
和ClusterRole
-
RoleBinding
和ClusterRoleBinding
1.2.2.1. 将权限委派给 AMQ Streams 组件
Cluster Operator 在名为 strimzi-cluster-operator
的服务帐户下运行。分配了集群角色,授予其为 AMQ Streams 组件创建 RBAC 资源的权限。角色绑定将集群角色绑定与服务帐户关联。
OpenShift 可防止在一个 ServiceAccount
下运行的组件授予授予 ServiceAccount
没有的另一个 ServiceAccount
特权。因为 Cluster Operator 会创建它管理的资源所需的 RoleBinding
和 ClusterRoleBinding
RBAC 资源,所以它需要一个赋予同一权限的角色。
下表描述了 Cluster Operator 创建的 RBAC 资源。
名称 | 使用的 |
---|---|
| Kafka 代理 pod |
| ZooKeeper pod |
| Kafka Connect pod |
| MirrorMaker pod |
| MirrorMaker 2 pod |
| Kafka Bridge pod |
| Entity Operator |
名称 | 使用的 |
---|---|
| Cluster Operator |
| Cluster Operator |
| Cluster Operator |
| Cluster Operator,机架功能(使用时) |
| Cluster Operator, Topic Operator, User Operator |
| Cluster Operator,用于机架感知的 Kafka 客户端 |
名称 | 使用的 |
---|---|
| Cluster Operator |
| Cluster Operator,用于机架感知的 Kafka 代理 |
| Cluster Operator,用于机架感知的 Kafka 客户端 |
名称 | 使用的 |
---|---|
| Cluster Operator |
| Cluster Operator,用于机架感知的 Kafka 代理 |
1.2.2.2. 使用一个 ServiceAccount
运行 Cluster Operator
Cluster Operator 最好使用 ServiceAccount
运行。
Cluster Operator 的 ServiceAccount
示例
apiVersion: v1 kind: ServiceAccount metadata: name: strimzi-cluster-operator labels: app: strimzi
然后,Operator 的部署需要在 spec.template.spec.serviceAccountName
中指定。
Cluster Operator 的 Deployment
的部分示例
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-cluster-operator labels: app: strimzi spec: replicas: 1 selector: matchLabels: name: strimzi-cluster-operator strimzi.io/kind: cluster-operator template: metadata: labels: name: strimzi-cluster-operator strimzi.io/kind: cluster-operator spec: serviceAccountName: strimzi-cluster-operator # ...
1.2.2.3. ClusterRole
资源
Cluster Operator 使用 ClusterRole
资源来提供对资源所需的访问权限。根据 OpenShift 集群设置,可能需要集群管理员来创建集群角色。
只有在创建 ClusterRole
资源时才需要集群管理员权限。Cluster Operator 不会在集群管理员帐户下运行。
ClusterRole
资源遵循 最小特权原则,并只包含 Cluster Operator 操作 Kafka 组件集群所需的权限。第一个分配的权限集允许 Cluster Operator 管理 OpenShift 资源,如 Deployment
、Pod
和 ConfigMap
。
Cluster Operator 需要所有集群角色才能委派权限。
Cluster Operator 使用 strimzi-cluster-operator-namespaced
和 strimzi-cluster-operator-global
集群角色来授予命名空间范围的资源级别和集群范围的资源级别的权限。
Cluster Operator 的带有命名空间资源的 ClusterRole
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-cluster-operator-namespaced labels: app: strimzi rules: # Resources in this role are used by the operator based on an operand being deployed in some namespace. When needed, you # can deploy the operator as a cluster-wide operator. But grant the rights listed in this role only on the namespaces # where the operands will be deployed. That way, you can limit the access the operator has to other namespaces where it # does not manage any clusters. - apiGroups: - "rbac.authorization.k8s.io" resources: # The cluster operator needs to access and manage rolebindings to grant Strimzi components cluster permissions - rolebindings verbs: - get - list - watch - create - delete - patch - update - apiGroups: - "rbac.authorization.k8s.io" resources: # The cluster operator needs to access and manage roles to grant the entity operator permissions - roles verbs: - get - list - watch - create - delete - patch - update - apiGroups: - "" resources: # The cluster operator needs to access and delete pods, this is to allow it to monitor pod health and coordinate rolling updates - pods # The cluster operator needs to access and manage service accounts to grant Strimzi components cluster permissions - serviceaccounts # The cluster operator needs to access and manage config maps for Strimzi components configuration - configmaps # The cluster operator needs to access and manage services and endpoints to expose Strimzi components to network traffic - services - endpoints # The cluster operator needs to access and manage secrets to handle credentials - secrets # The cluster operator needs to access and manage persistent volume claims to bind them to Strimzi components for persistent data - persistentvolumeclaims verbs: - get - list - watch - create - delete - patch - update - apiGroups: - "apps" resources: # The cluster operator needs to access and manage deployments to run deployment based Strimzi components - deployments - deployments/scale - deployments/status # The cluster operator needs to access and manage stateful sets to run stateful sets based Strimzi components - statefulsets # The cluster operator needs to access replica-sets to manage Strimzi components and to determine error states - replicasets verbs: - get - list - watch - create - delete - patch - update - apiGroups: - "" # legacy core events api, used by topic operator - "events.k8s.io" # new events api, used by cluster operator resources: # The cluster operator needs to be able to create events and delegate permissions to do so - events verbs: - create - apiGroups: # Kafka Connect Build on OpenShift requirement - build.openshift.io resources: - buildconfigs - buildconfigs/instantiate - builds verbs: - get - list - watch - create - delete - patch - update - apiGroups: - networking.k8s.io resources: # The cluster operator needs to access and manage network policies to lock down communication between Strimzi components - networkpolicies # The cluster operator needs to access and manage ingresses which allow external access to the services in a cluster - ingresses verbs: - get - list - watch - create - delete - patch - update - apiGroups: - route.openshift.io resources: # The cluster operator needs to access and manage routes to expose Strimzi components for external access - routes - routes/custom-host verbs: - get - list - watch - create - delete - patch - update - apiGroups: - image.openshift.io resources: # The cluster operator needs to verify the image stream when used for Kafka Connect image build - imagestreams verbs: - get - apiGroups: - policy resources: # The cluster operator needs to access and manage pod disruption budgets this limits the number of concurrent disruptions # that a Strimzi component experiences, allowing for higher availability - poddisruptionbudgets verbs: - get - list - watch - create - delete - patch - update
Cluster Operator 的带有集群范围资源的 ClusterRole
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-cluster-operator-global labels: app: strimzi rules: - apiGroups: - "rbac.authorization.k8s.io" resources: # The cluster operator needs to create and manage cluster role bindings in the case of an install where a user # has specified they want their cluster role bindings generated - clusterrolebindings verbs: - get - list - watch - create - delete - patch - update - apiGroups: - storage.k8s.io resources: # The cluster operator requires "get" permissions to view storage class details # This is because only a persistent volume of a supported storage class type can be resized - storageclasses verbs: - get - apiGroups: - "" resources: # The cluster operator requires "list" permissions to view all nodes in a cluster # The listing is used to determine the node addresses when NodePort access is configured # These addresses are then exposed in the custom resource states - nodes verbs: - list
strimzi-cluster-operator-leader-election
集群角色代表领导选举机制所需的权限。
带有领导选举权限的 ClusterRole
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-cluster-operator-leader-election labels: app: strimzi rules: - apiGroups: - coordination.k8s.io resources: # The cluster operator needs to access and manage leases for leader election # The "create" verb cannot be used with "resourceNames" - leases verbs: - create - apiGroups: - coordination.k8s.io resources: # The cluster operator needs to access and manage leases for leader election - leases resourceNames: # The default RBAC files give the operator only access to the Lease resource names strimzi-cluster-operator # If you want to use another resource name or resource namespace, you have to configure the RBAC resources accordingly - strimzi-cluster-operator verbs: - get - list - watch - delete - patch - update
strimzi-kafka-broker
集群角色代表使用机架感知的 Kafka pod 中 init 容器所需的访问。
名为 strimzi-<cluster_name>-kafka-init
的角色绑定会为 <cluster_name>-kafka
服务账户分配访问集群内使用 strimzi-kafka-broker
角色的节点。如果没有使用 rack 功能,且集群没有通过 nodeport
公开,则不会创建绑定。
Cluster Operator 的 ClusterRole
允许它将 OpenShift 节点的访问权限委派给 Kafka 代理 pod
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-kafka-broker labels: app: strimzi rules: - apiGroups: - "" resources: # The Kafka Brokers require "get" permissions to view the node they are on # This information is used to generate a Rack ID that is used for High Availability configurations - nodes verbs: - get
strimzi-entity-operator
集群角色代表 Topic Operator 和 User Operator 所需的访问权限。
主题 Operator 生成带有状态信息的 OpenShift 事件,因此 & lt;cluster_name> -entity-operator
服务帐户绑定到 strimzi-entity-operator
角色,该角色通过 strimzi-entity-operator
角色绑定授予此访问权限。
Cluster Operator 的 ClusterRole
允许它将对事件的访问权限委派给主题和用户 Operator
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-entity-operator labels: app: strimzi rules: - apiGroups: - "kafka.strimzi.io" resources: # The entity operator runs the KafkaTopic assembly operator, which needs to access and manage KafkaTopic resources - kafkatopics - kafkatopics/status # The entity operator runs the KafkaUser assembly operator, which needs to access and manage KafkaUser resources - kafkausers - kafkausers/status verbs: - get - list - watch - create - patch - update - delete - apiGroups: - "" resources: - events verbs: # The entity operator needs to be able to create events - create - apiGroups: - "" resources: # The entity operator user-operator needs to access and manage secrets to store generated credentials - secrets verbs: - get - list - watch - create - delete - patch - update
strimzi-kafka-client
集群角色代表使用机架感知的 Kafka 客户端所需的访问。
Cluster Operator 的 ClusterRole
允许它将对 OpenShift 节点的访问权限委派给基于 Kafka 客户端的 pod
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-kafka-client labels: app: strimzi rules: - apiGroups: - "" resources: # The Kafka clients (Connect, Mirror Maker, etc.) require "get" permissions to view the node they are on # This information is used to generate a Rack ID (client.rack option) that is used for consuming from the closest # replicas when enabled - nodes verbs: - get
1.2.2.4. ClusterRoleBinding
资源
Cluster Operator 使用 ClusterRoleBinding
和 RoleBinding
资源将其 ClusterRole
与 ServiceAccount
相关联:包含集群范围资源的集群角色需要集群角色绑定。
Cluster Operator 的 ClusterRoleBinding
示例
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: strimzi-cluster-operator labels: app: strimzi subjects: - kind: ServiceAccount name: strimzi-cluster-operator namespace: myproject roleRef: kind: ClusterRole name: strimzi-cluster-operator-global apiGroup: rbac.authorization.k8s.io
委派权限时使用的集群角色还需要集群角色绑定:
Cluster Operator 和 Kafka 代理机架意识的 ClusterRoleBinding
示例
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: strimzi-cluster-operator-kafka-broker-delegation labels: app: strimzi # The Kafka broker cluster role must be bound to the cluster operator service account so that it can delegate the cluster role to the Kafka brokers. # This must be done to avoid escalating privileges which would be blocked by Kubernetes. subjects: - kind: ServiceAccount name: strimzi-cluster-operator namespace: myproject roleRef: kind: ClusterRole name: strimzi-kafka-broker apiGroup: rbac.authorization.k8s.io
Cluster Operator 和 Kafka 客户端的 ClusterRoleBinding
示例
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: strimzi-cluster-operator-kafka-client-delegation labels: app: strimzi # The Kafka clients cluster role must be bound to the cluster operator service account so that it can delegate the # cluster role to the Kafka clients using it for consuming from closest replica. # This must be done to avoid escalating privileges which would be blocked by Kubernetes. subjects: - kind: ServiceAccount name: strimzi-cluster-operator namespace: myproject roleRef: kind: ClusterRole name: strimzi-kafka-client apiGroup: rbac.authorization.k8s.io
仅包含命名空间的资源的集群角色仅使用角色绑定绑定。
Cluster Operator 的 RoleBinding
示例
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: strimzi-cluster-operator labels: app: strimzi subjects: - kind: ServiceAccount name: strimzi-cluster-operator namespace: myproject roleRef: kind: ClusterRole name: strimzi-cluster-operator-namespaced apiGroup: rbac.authorization.k8s.io
Cluster Operator 和 Kafka 代理机架感知的 RoleBinding
示例
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: strimzi-cluster-operator-entity-operator-delegation labels: app: strimzi # The Entity Operator cluster role must be bound to the cluster operator service account so that it can delegate the cluster role to the Entity Operator. # This must be done to avoid escalating privileges which would be blocked by Kubernetes. subjects: - kind: ServiceAccount name: strimzi-cluster-operator namespace: myproject roleRef: kind: ClusterRole name: strimzi-entity-operator apiGroup: rbac.authorization.k8s.io
1.3. 使用 Kafka Bridge 与 Kafka 集群连接
您可以使用 AMQ Streams Kafka Bridge API 创建和管理消费者,并通过 HTTP 发送和接收记录,而不是原生 Kafka 协议。
设置 Kafka Bridge 时,您可以配置对 Kafka 集群的 HTTP 访问。然后,您可以使用 Kafka Bridge 来生成和消费来自集群的消息,以及通过其 REST 接口执行其他操作。
其他资源
- 有关安装和使用 Kafka Bridge 的详情,请参考使用 AMQ Streams Kafka Bridge。
1.4. 无缝 FIPS 支持
联邦信息处理标准(FIPS)是计算机安全和互操作性的标准。当在启用了 FIPS 的 OpenShift 集群上运行 AMQ Streams 时,AMQ Streams 容器镜像中使用的 OpenJDK 会自动切换到 FIPS 模式。在版本 2.4 中,AMQ Streams 可以在启用了 FIPS 的 OpenShift 集群上运行,而无需更改或特殊配置。它只使用 OpenJDK 中的 FIPS 兼容安全库。
最小密码长度
在 FIPS 模式下运行时,SCRAM-SHA-512 密码至少需要 32 个字符。从 AMQ Streams 2.4 中,AMQ Streams User Operator 中的默认密码长度也被设置为 32 个字符。如果您的 Kafka 集群带有使用小于 32 个字符的密码长度的自定义配置,则需要更新您的配置。如果您有少于 32 个字符的密码,则需要重新生成具有所需长度的密码。例如,您可以通过删除用户 secret 并等待 User Operator 创建具有适当长度的新密码来完成此操作。
如果使用启用了 FIPS 的 OpenShift 集群,与常规 OpenShift 集群相比,可能会遇到更高的内存消耗。为了避免任何问题,我们建议将内存请求增加到至少 512Mi。
1.5. 文档约定
用户替换的值
用户替换的值(也称为 可替换值 )以尖括号(< >)一同显示。下划线(_)用于多词值。如果值引用代码或命令,也使用 monospace
。
例如,以下代码显示 < ;my_namespace
> 必须替换为正确的命名空间名称:
sed -i 's/namespace: .*/namespace: <my_namespace>' install/cluster-operator/*RoleBinding*.yaml
1.6. 其他资源
第 2 章 AMQ Streams 安装方法
您可以通过两种方式将 AMQ Streams 在 OpenShift 4.10 上安装到 4.14。
安装方法 | Description |
---|---|
从 AMQ Streams 软件下载页面下载 Red Hat AMQ Streams 2.5 OpenShift Installation and Example Files。使用
您还可以使用
| |
使用 OperatorHub 中的 AMQ Streams Operator 将 AMQ Streams 部署到单个命名空间或所有命名空间。 |
要获得最大的灵活性,请选择安装工件方法。OperatorHub 方法提供了一个标准配置,可让您利用自动更新。
不支持使用 Helm 安装 AMQ Streams。
第 3 章 使用 AMQ Streams 部署的内容
为使用 AMQ Streams 分发的 OpenShift 提供了 Apache Kafka 组件。Kafka 组件通常作为集群运行,以实现高可用性。
使用 Kafka 组件的典型部署可能包括:
- 代理节点的 Kafka 集群
- 复制 ZooKeeper 实例的 zookeeper 集群
- 用于外部数据连接的 Kafka 连接 集群
- Kafka MirrorMaker 集群在二级集群中镜像 Kafka 集群
- Kafka Exporter 来提取额外的 Kafka 指标数据以进行监控。
- Kafka Bridge 为 Kafka 集群发出基于 HTTP 的请求
- Cruise Control 在代理节点间重新平衡主题分区
并非所有组件都是必须的,但最少需要 Kafka 和 ZooKeeper。有些组件可以在没有 Kafka 的情况下部署,如 MirrorMaker 或 Kafka Connect。
3.1. 部署顺序
部署到 OpenShift 集群所需的顺序如下:
- 部署 Cluster Operator 来管理 Kafka 集群
- 使用 ZooKeeper 集群部署 Kafka 集群,并在部署中包含 Topic Operator 和 User Operator
(可选)部署:
- 如果没有使用 Kafka 集群部署它们,则主题 Operator 和用户 Operator
- Kafka Connect
- Kafka MirrorMaker
- Kafka Bridge
- 用于监控指标的组件
Cluster Operator 为组件创建 OpenShift 资源,如 Deployment
、Service
和 Pod
资源。部署时,OpenShift 资源的名称会附加为组件指定的名称。例如,名为 my-kafka-cluster
的 Kafka 集群有一个名为 my-kafka-cluster-kafka
的服务。
第 4 章 准备 AMQ Streams 部署
通过完成任何必要的部署前任务,准备 AMQ Streams 部署。根据您的具体要求执行必要的准备步骤,如下所示:
要在本指南中运行命令,您的集群用户必须有权管理基于角色的访问控制(RBAC)和 CRD。
4.1. 部署先决条件
要部署 AMQ Streams,您需要以下内容:
OpenShift 4.10 到 4.14 集群。
AMQ Streams 基于 Strimzi 0.36.x。
-
oc
命令行工具已安装并配置为连接到正在运行的集群。
4.2. 下载 AMQ Streams 发行工件
要使用部署文件安装 AMQ Streams,请从 AMQ Streams 软件下载页面 下载并解压文件。
AMQ Streams 发行版本工件包括示例 YAML 文件,可帮助您将 AMQ Streams 组件部署到 OpenShift,执行通用操作和配置 Kafka 集群。
使用 oc
从下载的 ZIP 文件的 install/cluster-operator
文件夹中部署 Cluster Operator。有关部署和配置 Cluster Operator 的更多信息,请参阅 第 6.2 节 “部署 Cluster Operator”。
另外,如果要使用带有不是由 AMQ Streams Cluster Operator 管理的 Kafka 集群的独立安装主题和用户 Operator,您可以从 install/topic-operator
和 install/user-operator
文件夹部署它们。
AMQ Streams 容器镜像也通过 红帽生态系统目录 提供。但是,我们建议您使用提供的 YAML 文件来部署 AMQ Streams。
4.3. 将容器镜像推送到您自己的 registry
AMQ Streams 的容器镜像 Red Hat Ecosystem Catalog 提供。AMQ Streams 提供的安装 YAML 文件将直接 从红帽生态系统目录拉取镜像。
如果您无法访问 红帽生态系统目录 或希望使用您自己的容器存储库,请执行以下操作:
- 拉取此处列出的 所有容器镜像
- 将其推送到您自己的 registry 中
- 更新安装 YAML 文件中的镜像名称
发行版本支持的每个 Kafka 版本均有单独的镜像。
容器镜像 | namespace/Repository | Description |
---|---|---|
Kafka |
| 用于运行 Kafka 的 AMQ Streams 镜像,包括:
|
Operator |
| 用于运行 Operator 的 AMQ Streams 镜像:
|
Kafka Bridge |
| 用于运行 AMQ Streams Kafka Bridge 的 AMQ Streams 镜像 |
AMQ Streams Drain Cleaner |
| 用于运行 AMQ Streams Drain Cleaner 的 AMQ Streams 镜像 |
4.4. 创建用于向容器镜像 registry 进行身份验证的 pull secret
AMQ Streams 提供的安装 YAML 文件直接 从红帽生态系统目录拉取容器镜像。如果 AMQ Streams 部署需要身份验证,请在 secret 中配置身份验证凭据并将其添加到安装 YAML 中。
通常不需要身份验证,但可能会在某些平台上请求。
先决条件
- 您需要您的红帽用户名和密码或红帽 registry 服务帐户中的登录详情。
您可以使用您的红帽订阅 从红帽客户门户 创建 registry 服务帐户。
流程
创建包含登录详情和从中拉取 AMQ Streams 镜像的容器 registry 的 pull secret:
oc create secret docker-registry <pull_secret_name> \ --docker-server=registry.redhat.io \ --docker-username=<user_name> \ --docker-password=<password> \ --docker-email=<email>
添加您的用户名和密码。电子邮件地址是可选的。
编辑
install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
部署文件,以使用STRIMZI_IMAGE_PULL_SECRET
环境变量指定 pull secret:apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-cluster-operator spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: - name: STRIMZI_IMAGE_PULL_SECRETS value: "<pull_secret_name>" # ...
secret 适用于 Cluster Operator 创建的所有 pod。
4.5. 设计 AMQ Streams 管理员
AMQ Streams 提供用于配置部署的自定义资源。默认情况下,查看、创建、编辑和删除这些资源的权限仅限于 OpenShift 集群管理员。AMQ Streams 提供了两个集群角色,可用于为其他用户分配这些权限:
-
strimzi-view
允许用户查看和列出 AMQ Streams 资源。 -
strimzi-admin
还允许用户创建、编辑或删除 AMQ Streams 资源。
安装这些角色时,它们将自动聚合(添加)这些权限到默认的 OpenShift 集群角色。strimzi-view
聚合到 view
角色,strimzi-admin
聚合到 edit
和 admin
角色。由于聚合,您可能不需要将这些角色分配给已经具有类似权限的用户。
以下流程演示了如何分配允许非集群管理员管理 AMQ Streams 资源的 strimzi-admin
角色。
系统管理员可在部署 Cluster Operator 后指定 AMQ Streams 管理员。
先决条件
- 用于管理 CRD 的 AMQ Streams 自定义资源定义(CRD)和基于角色的访问控制(RBAC)资源已使用 Cluster Operator 部署。
流程
在 OpenShift 中创建
strimzi-view
和strimzi-admin
集群角色。oc create -f install/strimzi-admin
如果需要,请为需要它们的用户分配提供访问权限的角色。
oc create clusterrolebinding strimzi-admin --clusterrole=strimzi-admin --user=user1 --user=user2
第 5 章 使用 Web 控制台从 OperatorHub 安装 AMQ Streams
在 OpenShift Container Platform Web 控制台中,从 OperatorHub 安装 AMQ Streams Operator。
本节中的步骤演示了如何:
5.1. 从 OperatorHub 安装 AMQ Streams Operator
您可以使用 OpenShift Container Platform Web 控制台中的 OperatorHub 安装并订阅 AMQ Streams Operator。
此流程描述了如何创建项目,并将 AMQ Streams Operator 安装到该项目中。项目是命名空间的表示。对于可管理性,最好使用命名空间来分隔功能。
确保使用正确的更新频道。如果您位于受支持的 OpenShift 版本,则默认 stable 频道安装 AMQ Streams 通常是安全的。但是,我们不推荐在 stable 频道中启用自动更新。自动升级将在升级前跳过所有必要的步骤。仅在特定于版本的频道中使用自动升级。
先决条件
-
使用具有
cluster-admin
或strimzi-admin
权限的账户访问 OpenShift Container Platform Web 控制台。
流程
在 OpenShift Web 控制台中进入到 Home > Projects 页面,再创建一个用于安装的项目(命名空间)。
在这个示例中,我们使用名为
amq-streams-kafka
的项目。- 进入 Operators > OperatorHub 页面。
在 Filter by keyword 框中滚动或输入关键字以查找 AMQ Streams operator。
operator 位于 Streaming 和 Messaging 目录中。
- 点 AMQ Streams 显示 Operator 信息。
- 阅读有关 Operator 的信息,再点 Install。
在 Install Operator 页面中,从以下安装和更新选项中选择:
更新频道 :选择 Operator 的更新频道。
- (默认) stable 频道包含所有最新的更新和发行版本,包括主版本、次版本和微版本,这些版本被认为经过充分测试和稳定。
- amq-streams-X.x 频道包含主发行版本的次要和微版本更新,其中 X 是主版本的版本号。
- amq-streams-X.Y.x 频道包含次要发行本版本的微版本更新,其中 X 是主版本的版本号,Y 是次版本号。
Installation Mode :选择您创建的项目,以便在特定命名空间中安装 Operator。
您可以将 AMQ Streams Operator 安装到集群中的所有命名空间(默认选项)或特定命名空间。我们建议您将特定命名空间专用于 Kafka 集群和其他 AMQ Streams 组件。
- 更新批准 :默认情况下,AMQ Streams Operator 由 Operator Lifecycle Manager (OLM)自动升级到最新的 AMQ Streams 版本。另外,如果您希望手动批准将来的升级,请选择 Manual。如需有关操作器的更多信息,请参阅 OpenShift 文档。
点 Install 将 Operator 安装到所选命名空间中。
AMQ Streams Operator 将 Cluster Operator、CRD 和基于角色的访问控制(RBAC)资源部署到所选命名空间中。
Operator 就绪可用后,进入 Operators > Installed Operators 来验证 Operator 是否已安装到所选命名空间中。
状态将显示为 Succeeded。
现在,您可以使用 AMQ Streams operator 部署 Kafka 组件,从 Kafka 集群开始。
如果您进入到 Workloads > Deployments,您可以查看 Cluster Operator 和 Entity Operator 的部署详情。Cluster Operator 的名称包含一个版本号:amq-streams-cluster-operator-<version>
。使用 AMQ Streams 安装工件部署 Cluster Operator 时的名称不同。在本例中,名称是 strimzi-cluster-operator
。
5.2. 使用 AMQ Streams operator 部署 Kafka 组件
在 Openshift 上安装时,AMQ Streams Operator 使 Kafka 组件可从用户界面安装。
以下 Kafka 组件可用于安装:
- Kafka
- Kafka Connect
- Kafka MirrorMaker
- Kafka MirrorMaker 2
- Kafka 主题
- Kafka 用户
- Kafka Bridge
- Kafka Connector
- Kafka Rebalance
您可以选择组件并创建实例。您至少创建一个 Kafka 实例。这个步骤描述了如何使用默认设置创建 Kafka 实例。您可以在执行安装前配置默认安装规格。
创建其他 Kafka 组件实例的过程相同。
先决条件
- AMQ Streams Operator 安装在 OpenShift 集群上。
流程
在 Web 控制台中导航到 Operators > ; Installed Operators 页面,然后点击 AMQ Streams 来显示 Operator 详情。
在 Provided APIs 中,您可以创建 Kafka 组件的实例。
点 Kafka 下的 Create instance 创建 Kafka 实例。
默认情况下,您将创建一个名为
my-cluster
的 Kafka 集群,它有三个 Kafka 代理节点和三个 ZooKeeper 节点。集群使用临时存储。点 Create 开始安装 Kafka。
等待状态变为 Ready。
第 6 章 使用安装工件部署 AMQ Streams
为部署 AMQ Streams 准备您的环境,您可以将 AMQ Streams 部署到 OpenShift 集群。使用由发行工件提供的安装文件。
AMQ Streams 基于 Strimzi 0.36.x。您可以将 AMQ Streams 2.5 在 OpenShift 4.10 上部署到 4.14。
使用安装文件部署 AMQ Streams 的步骤如下:
- 部署 Cluster Operator
使用 Cluster Operator 部署以下内容:
另外,还可根据要求部署以下 Kafka 组件:
要在本指南中运行命令,OpenShift 用户必须具有管理基于角色的访问控制(RBAC)和 CRD 的权限。
6.1. 基本部署路径
您可以设置一个部署,其中 AMQ Streams 管理同一命名空间中的单个 Kafka 集群。您可以使用此配置进行开发或测试。或者,您可以在生产环境中使用 AMQ Streams 来管理不同命名空间中的多个 Kafka 集群。
任何 AMQ Streams 部署的第一步是使用 install/cluster-operator
文件安装 Cluster Operator。
单个命令应用 cluster-operator
文件夹中的所有安装文件: oc apply -f ./install/cluster-operator
。
该命令设置您需要创建和管理 Kafka 部署的所有内容,包括:
-
Cluster Operator (
部署
、ConfigMap
) -
AMQ Streams CRD (
CustomResourceDefinition
) -
RBAC 资源(
ClusterRole
、ClusterRoleBinding
、RoleBinding
) -
Service account (
ServiceAccount
)
基本部署路径如下:
- 下载发行工件
- 创建用于部署 Cluster Operator 的 OpenShift 命名空间
-
更新
install/cluster-operator
文件,以使用为 Cluster Operator 创建的命名空间 - 安装 Cluster Operator 以监视一个、多个命名空间或所有命名空间
-
更新
- 创建 Kafka 集群
之后,您可以部署其他 Kafka 组件并设置对部署的监控。
6.2. 部署 Cluster Operator
Cluster Operator 负责在 OpenShift 集群中部署和管理 Kafka 集群。
当 Cluster Operator 运行时,它将开始监视 Kafka 资源的更新。
默认情况下,部署了 Cluster Operator 的单一副本。您可以使用领导选举机制添加副本,以便在出现问题时有其他 Cluster Operator 处于待机状态。如需更多信息,请参阅 第 8.5.3 节 “使用领导选举机制运行多个 Cluster Operator 副本”。
6.2.1. 指定 Cluster Operator 监视的命名空间
Cluster Operator 监视部署了 Kafka 资源的命名空间中的更新。部署 Cluster Operator 时,您可以指定要在 OpenShift 集群中监视的命名空间。您可以指定以下命名空间:
- 单个所选命名空间 (包含 Cluster Operator 的同一命名空间)
- 多个所选命名空间
- 集群中的所有命名空间
监视多个所选命名空间会因为增加处理开销而对性能有影响。要优化命名空间监控的性能,通常建议监视单个命名空间或监控整个集群。监控单个命名空间允许集中监控特定于命名空间的资源,而监控所有命名空间则提供所有命名空间中集群资源的全面视图。
Cluster Operator 监视对以下资源的更改:
-
Kafka
集群的 Kafka。 -
Kafka Connect 集群的
KafkaConnect
。 -
KafkaConnector
用于在 Kafka Connect 集群中创建和管理连接器。 -
Kafka MirrorMaker
实例的 KafkaMirrorMaker。 -
Kafka MirrorMaker 2 实例的
KafkaMirrorMaker2
。 -
Kafka Bridge 实例的
KafkaBridge
。 -
Cruise Control 优化请求的
KafkaRebalance
。
在 OpenShift 集群中创建其中一个资源时,Operator 会从资源获取集群描述,并通过创建必要的 OpenShift 资源(如 Deployment、Pod、服务和 ConfigMap)开始为资源创建新集群。
每次更新 Kafka 资源时,Operator 都会对为资源组成集群的 OpenShift 资源执行对应的更新。
资源会被修补或删除,然后重新创建,以便资源反映集群的所需状态。此操作可能会导致滚动更新可能会导致服务中断。
删除资源时,操作器会取消部署集群并删除所有相关 OpenShift 资源。
虽然 Cluster Operator 可以监控 OpenShift 集群中的一个、多个或所有命名空间,但主题 Operator 和 User Operator 会监视单个命名空间中的 KafkaTopic
和 KafkaUser
资源。如需更多信息,请参阅 第 1.2.1 节 “在 OpenShift 命名空间中观察 AMQ Streams 资源”。
6.2.2. 部署 Cluster Operator 以观察单个命名空间
此流程演示了如何部署 Cluster Operator 以监视 OpenShift 集群中的单个命名空间中的 AMQ Streams 资源。
先决条件
-
您需要具有权限的帐户来创建和管理
CustomResourceDefinition
和 RBAC (ClusterRole
和RoleBinding
)资源。
流程
编辑 AMQ Streams 安装文件,以使用 Cluster Operator 将安装到的命名空间。
例如,在此过程中,Cluster Operator 被安装到命名空间
my-cluster-operator-namespace
中。在 Linux 中,使用:
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
在 MacOS 中,使用:
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
部署 Cluster Operator:
oc create -f install/cluster-operator -n my-cluster-operator-namespace
检查部署的状态:
oc get deployments -n my-cluster-operator-namespace
输出显示部署名称和就绪度
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1
READY
显示就绪/预期的副本数。当AVAILABLE
输出显示为1
时,部署成功。
6.2.3. 部署 Cluster Operator 以观察多个命名空间
此流程演示了如何部署 Cluster Operator,以便在 OpenShift 集群中的多个命名空间中监视 AMQ Streams 资源。
先决条件
-
您需要具有权限的帐户来创建和管理
CustomResourceDefinition
和 RBAC (ClusterRole
和RoleBinding
)资源。
流程
编辑 AMQ Streams 安装文件,以使用 Cluster Operator 将安装到的命名空间。
例如,在此过程中,Cluster Operator 被安装到命名空间
my-cluster-operator-namespace
中。在 Linux 中,使用:
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
在 MacOS 中,使用:
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
编辑
install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
文件,以添加 Cluster Operator 将监视到STRIMZI_NAMESPACE
环境变量的所有命名空间的列表。例如,在此过程中,Cluster Operator 会监视
watched-namespace-1
,watched-namespace-2
,watched-namespace-3
。apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: - name: strimzi-cluster-operator image: registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.5.1 imagePullPolicy: IfNotPresent env: - name: STRIMZI_NAMESPACE value: watched-namespace-1,watched-namespace-2,watched-namespace-3
对于列出的每个命名空间,请安装
RoleBindings
。在这个示例中,将这些命令的
watched-namespace
替换为在前一步中列出的命名空间,为watched-namespace-1
,watched-namespace-2
,watched-namespace-3
重复这个操作:oc create -f install/cluster-operator/020-RoleBinding-strimzi-cluster-operator.yaml -n <watched_namespace> oc create -f install/cluster-operator/023-RoleBinding-strimzi-cluster-operator.yaml -n <watched_namespace> oc create -f install/cluster-operator/031-RoleBinding-strimzi-cluster-operator-entity-operator-delegation.yaml -n <watched_namespace>
部署 Cluster Operator:
oc create -f install/cluster-operator -n my-cluster-operator-namespace
检查部署的状态:
oc get deployments -n my-cluster-operator-namespace
输出显示部署名称和就绪度
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1
READY
显示就绪/预期的副本数。当AVAILABLE
输出显示为1
时,部署成功。
6.2.4. 部署 Cluster Operator 以监视所有命名空间
此流程演示了如何部署 Cluster Operator,以便在 OpenShift 集群中的所有命名空间中监视 AMQ Streams 资源。
在这个模式中运行时,Cluster Operator 会自动管理创建的任何新命名空间中的集群。
先决条件
-
您需要具有权限的帐户来创建和管理
CustomResourceDefinition
和 RBAC (ClusterRole
和RoleBinding
)资源。
流程
编辑 AMQ Streams 安装文件,以使用 Cluster Operator 将安装到的命名空间。
例如,在此过程中,Cluster Operator 被安装到命名空间
my-cluster-operator-namespace
中。在 Linux 中,使用:
sed -i 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
在 MacOS 中,使用:
sed -i '' 's/namespace: .*/namespace: my-cluster-operator-namespace/' install/cluster-operator/*RoleBinding*.yaml
编辑
install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
文件,将STRIMZI_NAMESPACE
环境变量的值设置为sVirt
。apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: # ... serviceAccountName: strimzi-cluster-operator containers: - name: strimzi-cluster-operator image: registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.5.1 imagePullPolicy: IfNotPresent env: - name: STRIMZI_NAMESPACE value: "*" # ...
创建
ClusterRoleBindings
,为 Cluster Operator 为所有命名空间赋予集群范围的访问权限。oc create clusterrolebinding strimzi-cluster-operator-namespaced --clusterrole=strimzi-cluster-operator-namespaced --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator oc create clusterrolebinding strimzi-cluster-operator-watched --clusterrole=strimzi-cluster-operator-watched --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator oc create clusterrolebinding strimzi-cluster-operator-entity-operator-delegation --clusterrole=strimzi-entity-operator --serviceaccount my-cluster-operator-namespace:strimzi-cluster-operator
将 Cluster Operator 部署到 OpenShift 集群。
oc create -f install/cluster-operator -n my-cluster-operator-namespace
检查部署的状态:
oc get deployments -n my-cluster-operator-namespace
输出显示部署名称和就绪度
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 1/1 1 1
READY
显示就绪/预期的副本数。当AVAILABLE
输出显示为1
时,部署成功。
6.3. 部署 Kafka
为了可以使用 Cluster Operator 管理 Kafka 集群,您必须将它部署为 Kafka
资源。AMQ Streams 提供示例部署文件来执行此操作。您可以使用这些文件同时部署主题 Operator 和 User Operator。
部署 Cluster Operator 后,使用 Kafka
资源来部署以下组件:
安装 Kafka 时,AMQ Streams 还会安装 ZooKeeper 集群并添加将 Kafka 与 ZooKeeper 连接所需的配置。
如果要尝试节点池功能的预览,您可以使用一个或多个节点池部署 Kafka 集群。节点池为一组 Kafka 节点提供配置。通过使用节点池,节点可以在同一 Kafka 集群中有不同的配置。
节点池不会被默认启用,因此您必须在使用 KafkaNodePools 功能门前启用 KafkaNodePools
功能门。
如果您还没有将 Kafka 集群部署为 Kafka
资源,则无法使用 Cluster Operator 管理它。例如,这会应用到在 OpenShift 外部运行的 Kafka 集群。但是,您可以通过将其 部署为独立组件,使用 Topic Operator 和 User Operator 及 不是由 AMQ Streams 管理的 Kafka 集群。您还可以将其他 Kafka 组件与不是由 AMQ Streams 管理的 Kafka 集群部署并使用。
6.3.1. 部署 Kafka 集群
此流程演示了如何使用 Cluster Operator 将 Kafka 集群部署到 OpenShift 集群。
部署使用 YAML 文件来提供规格来创建 Kafka
资源。
AMQ Streams 提供以下示例 文件来创建 Kafka 集群:
kafka-persistent.yaml
- 使用三个 ZooKeeper 和三个 Kafka 节点部署持久集群。
kafka-jbod.yaml
- 部署具有三个 ZooKeeper 和三个 Kafka 节点的持久集群(每个都使用多个持久性卷)。
kafka-persistent-single.yaml
- 使用单个 ZooKeeper 节点和一个 Kafka 节点部署持久集群。
kafka-ephemeral.yaml
- 使用三个 ZooKeeper 和三个 Kafka 节点部署临时集群。
kafka-ephemeral-single.yaml
- 使用三个 ZooKeeper 节点和一个 Kafka 节点部署临时集群。
在此过程中,我们对 ephemeral(临时)和persistent(持久) Kafka 集群部署使用示例。
- 临时集群
-
通常,临时(或临时)Kafka 集群适合开发和测试目的,不适用于生产环境。此部署使用
emptyDir
卷来存储代理信息(用于 ZooKeeper)和主题或分区(用于 Kafka)。使用emptyDir
卷意味着其内容严格与 pod 生命周期相关,并在 pod 停机时被删除。 - 持久性集群
持久的 Kafka 集群使用持久性卷来存储 ZooKeeper 和 Kafka 数据。使用
PersistentVolumeClaim
获取PersistentVolume
,使其独立于PersistentVolume
的实际类型。PersistentVolumeClaim
可以使用StorageClass
来触发自动卷置备。如果没有指定StorageClass
,OpenShift 将尝试使用默认StorageClass
。以下示例显示了一些常见的持久性卷类型:
- 如果您的 OpenShift 集群在 Amazon AWS 上运行,OpenShift 可以置备 Amazon EBS 卷
- 如果您的 OpenShift 集群在 Microsoft Azure 上运行,OpenShift 可以置备 Azure Disk Storage 卷
- 如果您的 OpenShift 集群在 Google Cloud 上运行,OpenShift 可以置备 Persistent Disk 卷
- 如果您的 OpenShift 集群在裸机上运行,OpenShift 可以置备本地持久性卷
YAML 文件示例指定最新支持的 Kafka 版本,以及其支持的日志消息格式版本和 inter-broker 协议版本的配置。Kafka config
的 inter.broker.protocol.version
属性必须是指定的 Kafka 版本 (spec.kafka.version
) 支持的版本。属性表示 Kafka 集群中使用的 Kafka 协议版本。
从 Kafka 3.0.0 开始,当将 inter.broker.protocol.version
设置为 3.0
或更高版本时,log.message.format.version
选项将被忽略,不需要设置。
在升级 Kafka 时,需要对 inter.broker.protocol.version
的更新。
示例集群默认命名为 my-cluster
。集群名称由资源名称定义,在部署集群后无法更改。要在部署集群前更改集群名称,请编辑相关 YAML 文件中的 Kafka
资源的 Kafka.metadata.name
属性。
默认集群名称和指定的 Kafka 版本
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: version: 3.5.0 #... config: #... log.message.format.version: "3.5" inter.broker.protocol.version: "3.5" # ...
流程
创建并部署临时或持久集群。
创建和部署临时集群:
oc apply -f examples/kafka/kafka-ephemeral.yaml
创建和部署持久集群:
oc apply -f examples/kafka/kafka-persistent.yaml
检查部署的状态:
oc get pods -n <my_cluster_operator_namespace>
输出显示 pod 名称和就绪状态
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 my-cluster-kafka-0 1/1 Running 0 my-cluster-kafka-1 1/1 Running 0 my-cluster-kafka-2 1/1 Running 0 my-cluster-zookeeper-0 1/1 Running 0 my-cluster-zookeeper-1 1/1 Running 0 my-cluster-zookeeper-2 1/1 Running 0
my-cluster
是 Kafka 集群的名称。从
0
开始的连续索引号标识每个 Kafka 和 ZooKeeper pod。使用默认部署,您可以创建一个 Entity Operator 集群、3 个 Kafka pod 和 3 ZooKeeper pod。
READY
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
其他资源
6.3.2. (预览)部署 Kafka 节点池
此流程演示了如何使用 Cluster Operator 将 Kafka 节点池部署到 OpenShift 集群。节点池代表 Kafka 集群中共享相同配置的 Kafka 节点组。对于节点池中的每个 Kafka 节点,节点池中没有定义的任何配置都会继承 kafka
资源中的集群配置。
节点池功能作为技术预览提供。节点池不会被默认启用,因此您必须在使用 KafkaNodePools 功能门前启用 KafkaNodePools
功能门。
部署使用 YAML 文件来提供规格来创建 KafkaNodePool
资源。您可以将节点池与 Kafka 集群一起使用,该集群使用 KRaft (Kafka Raft metadata)模式或 ZooKeeper 进行集群管理。
KRaft 模式在 Apache Kafka 或 AMQ Streams 中不适用于生产环境。
AMQ Streams 提供以下 示例文件,您可以使用它来创建 Kafka 节点池:
kafka.yaml
- 使用 3 个节点和 2 个不同的 Kafka 代理池部署 ZooKeeper。每个池都有 3 个代理。示例中的池使用不同的存储配置。
kafka-with-dual-role-kraft-nodes.yaml
- 使用共享代理和控制器角色的 KRaft 节点池部署 Kafka 集群。
kafka-with-kraft.yaml
- 部署 Kafka 集群,具有一个控制器节点池和一个代理节点池。
您不需要立即开始使用节点池。如果您决定使用它们,您可以执行此处概述的步骤,以使用 KafkaNodePool
资源部署新的 Kafka 集群,或 迁移现有的 Kafka 集群。
如果要将现有 Kafka 集群迁移到使用节点池,请参阅 迁移现有 Kafka 集群的步骤。
流程
从命令行启用
KafkaNodePools
功能门:oc set env deployment/strimzi-cluster-operator STRIMZI_FEATURE_GATES="+KafkaNodePools"
或者,通过编辑 Cluster Operator Deployment 并更新
STRIMZI_FEATURE_GATES
环境变量:env - name: STRIMZI_FEATURE_GATES value: +KafkaNodePools
这会更新 Cluster Operator。
如果使用 KRaft 模式,还要启用
UseKRaft
功能门。创建节点池。
使用三个代理的两个节点池部署 Kafka 集群和 ZooKeeper 集群:
oc apply -f examples/kafka/nodepools/kafka.yaml
使用使用 dual-role 节点的单一节点池,以 KRaft 模式部署 Kafka 集群:
oc apply -f examples/kafka/nodepools/kafka-with-dual-role-kraft-nodes.yaml
使用 KRaft 模式部署 Kafka 集群,对于代理和控制节点有独立的节点池,:
oc apply -f examples/kafka/nodepools/kafka-with-kraft.yaml
检查部署的状态:
oc get pods -n <my_cluster_operator_namespace>
输出显示节点池名称和就绪
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 my-cluster-pool-a-kafka-0 1/1 Running 0 my-cluster-pool-a-kafka-1 1/1 Running 0 my-cluster-pool-a-kafka-4 1/1 Running 0
-
my-cluster
是 Kafka 集群的名称。 pool-a
是节点池的名称。以
0
开始的连续索引号标识每个创建的 Kafka pod。如果使用 ZooKeeper,您还会看到 ZooKeeper pod。READY
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。有关部署的信息也会显示在
KafkaNodePool
资源的状态中,包括池中节点的 ID 列表。注意节点 ID 按顺序分配自集群中所有节点池中的 0 (零)。这意味着节点 ID 可能无法在特定节点池中按顺序运行。如果集群中节点 ID 序列出现差距,则会为要添加的下一个节点分配一个填充空白的 ID。缩减时,池中具有最高节点 ID 的节点会被删除。
-
其他资源
6.3.3. 使用 Cluster Operator 部署主题 Operator
此流程描述了如何使用 Cluster Operator 部署主题 Operator。可以部署主题 Operator 以在双向模式或单向模式中使用。要了解更多有关双向和单向主题管理的信息,请参阅 第 9.1 节 “主题管理模式”。
单向主题管理作为技术预览提供。默认情况下,不启用单向主题管理,因此您必须 启用 UnidirectionalTopicOperator
功能门 才能使用它。
您可以将 Kafka
资源的 entityOperator
属性配置为包含 topicOperator
。默认情况下,Topic Operator 会监视 Cluster Operator 部署的 Kafka 集群命名空间中的 KafkaTopic
资源。您还可以使用 Topic Operator spec
中的 watchedNamespace
指定一个命名空间。单个主题 Operator 可以监视单个命名空间。一个命名空间应该只被一个主题 Operator 监视。
如果您使用 AMQ Streams 将多个 Kafka 集群部署到同一命名空间中,请只为一个 Kafka 集群启用 Topic Operator,或使用 watchedNamespace
属性配置 Topic Operator 以监视其他命名空间。
如果要将 Topic Operator 与不是由 AMQ Streams 管理的 Kafka 集群搭配使用,您必须将 Topic Operator 部署为独立组件。
有关配置 entityOperator
和 topicOperator
属性的更多信息,请参阅配置 Entity Operator。
流程
编辑
Kafka
资源的entityOperator
属性,使其包含topicOperator
:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}
使用
EntityTopicOperatorSpec
schema reference 中所述的属性配置 Topic Operatorspec
。如果您希望所有属性使用默认值,请使用空对象(
{}
)。创建或更新资源:
oc apply -f <kafka_configuration_file>
检查部署的状态:
oc get pods -n <my_cluster_operator_namespace>
输出显示 pod 名称和就绪度
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 # ...
my-cluster
是 Kafka 集群的名称。READY
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
6.3.4. 使用 Cluster Operator 部署 User Operator
此流程描述了如何使用 Cluster Operator 部署 User Operator。
您可以将 Kafka
资源的 entityOperator
属性配置为包含 userOperator
。默认情况下,User Operator 会监视 Kafka 集群部署命名空间中的 KafkaUser
资源。您还可以使用 User Operator spec
中的 watchedNamespace
指定命名空间。单个用户 Operator 可以监视单个命名空间。一个命名空间应该只被一个 User Operator 监视。
如果要将 User Operator 与不是由 AMQ Streams 管理的 Kafka 集群搭配使用,您必须将 User Operator 部署为独立组件。
有关配置 entityOperator
和 userOperator
属性的更多信息,请参阅配置 Entity Operator。
流程
编辑
Kafka
资源的entityOperator
属性,使其包含userOperator
:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: #... entityOperator: topicOperator: {} userOperator: {}
使用
EntityUserOperatorSpec
schema reference 中所述的属性配置 User Operatorspec
。如果您希望所有属性使用默认值,请使用空对象(
{}
)。创建或更新资源:
oc apply -f <kafka_configuration_file>
检查部署的状态:
oc get pods -n <my_cluster_operator_namespace>
输出显示 pod 名称和就绪度
NAME READY STATUS RESTARTS my-cluster-entity-operator 3/3 Running 0 # ...
my-cluster
是 Kafka 集群的名称。READY
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
6.3.5. Kafka 集群资源列表
以下资源由 OpenShift 集群中的 Cluster Operator 创建:
共享资源
cluster-name-cluster-ca
- 带有用于加密集群通信的 Cluster CA 私钥的 secret。
cluster-name-cluster-ca-cert
- 带有集群 CA 公钥的 secret。此密钥可用于验证 Kafka 代理的身份。
cluster-name-clients-ca
- 带有用于签署用户证书的 Clients CA 私钥的 secret
cluster-name-clients-ca-cert
- 带有客户端 CA 公钥的 secret。此密钥可用于验证 Kafka 用户的身份。
cluster-name-cluster-operator-certs
- 带有 Cluster operator 密钥的 secret,用于与 Kafka 和 ZooKeeper 通信。
Zookeeper 节点
cluster-name-zookeeper
提供给以下 ZooKeeper 资源的名称:
- 用于管理 ZooKeeper 节点 pod 的 StrimziPodSet。
- ZooKeeper 节点使用的服务帐户。
- 为 ZooKeeper 节点配置 PodDisruptionBudget。
cluster-name-zookeeper-idx
- StrimziPodSet 创建的 Pod。
cluster-name-zookeeper-nodes
- 无头服务需要使 DNS 直接解析 ZooKeeper pod IP 地址。
cluster-name-zookeeper-client
- Kafka 代理使用的服务作为客户端连接到 ZooKeeper 节点。
cluster-name-zookeeper-config
- 包含 ZooKeeper 辅助配置的 ConfigMap,由 ZooKeeper 节点 pod 挂载为卷。
cluster-name-zookeeper-nodes
- 使用 ZooKeeper 节点密钥的 secret。
cluster-name-network-policy-zookeeper
- 网络策略管理对 ZooKeeper 服务的访问。
data-cluster-name-zookeeper-idx
-
用于为 ZooKeeper 节点 pod
idx
存储数据的卷的持久性卷声明。只有在选择了持久性存储来存储数据时,才会创建此资源。
Kafka 代理
cluster-name-kafka
提供给以下 Kafka 资源的名称:
- 用于管理 Kafka 代理 pod 的 StrimziPodSet。
- Kafka pod 使用的服务帐户。
- 为 Kafka 代理配置 PodDisruptionBudget。
cluster-name-kafka-idx
提供给以下 Kafka 资源的名称:
- StrimziPodSet 创建的 Pod。
- 带有 Kafka 代理配置的 ConfigMap。
cluster-name-kafka-brokers
- 服务需要 DNS 解析 Kafka 代理 pod IP 地址。
cluster-name-kafka-bootstrap
- 服务可用作从 OpenShift 集群内连接的 Kafka 客户端的 bootstrap 服务器。
cluster-name-kafka-external-bootstrap
-
从 OpenShift 集群外部连接的客户端的 bootstrap 服务。只有在启用外部监听程序时,才会创建此资源。当监听器名称为
external
且端口为9094
时,旧的服务名称将用于向后兼容。 cluster-name-kafka-pod-id
-
用于将流量从 OpenShift 集群外部路由到各个容器集的服务。只有在启用外部监听程序时,才会创建此资源。当监听器名称为
external
且端口为9094
时,旧的服务名称将用于向后兼容。 cluster-name-kafka-external-bootstrap
-
从 OpenShift 集群外部连接的客户端的 bootstrap 路由。只有在启用了外部监听程序并设置为 type
路由
时,才会创建此资源。当监听器名称为external
且端口为9094
时,旧的路由名称将用于向后兼容。 cluster-name-kafka-pod-id
-
将来自 OpenShift 集群外的流量路由到各个容器集。只有在启用了外部监听程序并设置为 type
路由
时,才会创建此资源。当监听器名称为external
且端口为9094
时,旧的路由名称将用于向后兼容。 cluster-name-kafka-listener-name-bootstrap
- 从 OpenShift 集群外部连接的客户端的 bootstrap 服务。只有在启用外部监听程序时,才会创建此资源。新的服务名称将用于所有其他外部监听程序。
cluster-name-kafka-listener-name-pod-id
- 用于将流量从 OpenShift 集群外部路由到各个容器集的服务。只有在启用外部监听程序时,才会创建此资源。新的服务名称将用于所有其他外部监听程序。
cluster-name-kafka-listener-name-bootstrap
-
从 OpenShift 集群外部连接的客户端的 bootstrap 路由。只有在启用了外部监听程序并设置为 type
路由
时,才会创建此资源。新路由名称将用于所有其他外部监听程序。 cluster-name-kafka-listener-name-pod-id
-
将来自 OpenShift 集群外的流量路由到各个容器集。只有在启用了外部监听程序并设置为 type
路由
时,才会创建此资源。新路由名称将用于所有其他外部监听程序。 cluster-name-kafka-config
-
包含 Kafka 辅助配置的 ConfigMap,当禁用
UseStrimziPodSets
功能门时,代理 pod 会作为卷挂载。 cluster-name-kafka-brokers
- 带有 Kafka 代理密钥的 secret。
cluster-name-network-policy-kafka
- 网络策略管理对 Kafka 服务的访问。
strimzi-namespace-name-cluster-name-kafka-init
- Kafka 代理使用的集群角色绑定。
cluster-name-jmx
- 带有 JMX 用户名和密码的 secret,用于保护 Kafka 代理端口。只有在 Kafka 中启用 JMX 时,才会创建此资源。
data-cluster-name-kafka-idx
-
用于存储 Kafka 代理 pod
idx
数据的卷的持久性卷声明。只有选择了持久性存储来存储数据时,才会创建此资源。 data-id-cluster-name-kafka-idx
-
卷
id
的持久性卷声明用于存储 Kafka 代理 podidx
的数据。只有在置备持久性卷来存储数据时,才会为 JBOD 卷选择持久性存储来创建此资源。
Entity Operator
只有在使用 Cluster Operator 部署 Entity Operator 时,才会创建这些资源。
cluster-name-entity-operator
提供给以下实体 Operator 资源的名称:
- 使用主题和用户 Operator 部署。
- Entity Operator 使用的服务帐户。
- 网络策略管理对实体 Operator 指标的访问。
cluster-name-entity-operator-random-string
- 由实体 Operator 部署创建的 Pod。
cluster-name-entity-topic-operator-config
- 带有主题 Operator 的辅助配置的 ConfigMap。
cluster-name-entity-user-operator-config
- 带有用户 Operator 的辅助配置的 ConfigMap。
cluster-name-entity-topic-operator-certs
- 带有主题 Operator 密钥的 secret,用于与 Kafka 和 ZooKeeper 通信。
cluster-name-entity-user-operator-certs
- 带有用户 Operator 密钥的 secret,用于与 Kafka 和 ZooKeeper 通信。
strimzi-cluster-name-entity-topic-operator
- Entity Topic Operator 使用的角色绑定。
strimzi-cluster-name-entity-user-operator
- Entity User Operator 使用的角色绑定。
Kafka Exporter
只有在使用 Cluster Operator 部署 Kafka Exporter 时,才会创建这些资源。
cluster-name-kafka-exporter
提供给以下 Kafka 导出器资源的名称:
- 使用 Kafka 导出器进行部署。
- 用于收集消费者滞后指标的服务。
- Kafka Exporter 使用的服务帐户。
- 网络策略用于管理对 Kafka 导出器指标的访问。
cluster-name-kafka-exporter-random-string
- 由 Kafka Exporter 部署创建的 Pod。
Sything Control
只有在使用 Cluster Operator 部署 Cruise Control 时,才会创建这些资源。
cluster-name-cruise-control
给定以下 Cruise 控制资源的名称:
- 使用 Cruise Control 部署。
- 用于与 Cruise Control 进行通信的服务。
- Cruise Control 使用的服务帐户。
cluster-name-cruise-control-random-string
- 由 Cruise Control 部署创建的 Pod。
cluster-name-cruise-control-config
- 包含 Cruise Control 辅助配置的 ConfigMap,并由 Cruise Control pod 挂载为卷。
cluster-name-cruise-control-certs
- 带有 Cruise Control 密钥的 secret,用于与 Kafka 和 ZooKeeper 通信。
cluster-name-network-policy-cruise-control
- 网络策略管理对 Cruise Control 服务的访问。
6.4. 部署 Kafka 连接
Kafka Connect 是一个使用连接器插件在 Kafka 代理和其他系统间流传输数据的集成工具包。Kafka Connect 提供了一个框架,用于将 Kafka 与外部数据源或目标(如数据库或消息传递系统)集成,用于使用连接器导入或导出数据。连接器是提供所需的连接配置的插件。
在 AMQ Streams 中,Kafka Connect 部署为分布式模式。Kafka Connect 也可以以独立模式工作,但 AMQ Streams 不支持它。
使用 连接器 的概念,Kafka Connect 提供了一个框架,用于将大量数据移到 Kafka 集群中,同时保持可扩展性和可靠性。
Cluster Operator 管理使用 KafkaConnector 资源部署的 Kafka Connect
集群,以及利用 KafkaConnector
资源创建的连接器。
要使用 Kafka Connect,您需要执行以下操作。
术语 连接器 会互换使用,以表示在 Kafka Connect 集群或连接器类中运行的连接器实例。在本指南中,当含义从上下文中清除时,会使用术语 连接器。
6.4.1. 将 Kafka Connect 部署到 OpenShift 集群
此流程演示了如何使用 Cluster Operator 将 Kafka Connect 集群部署到 OpenShift 集群。
Kafka Connect 集群部署使用可配置的节点数(也称为 worker),将连接器工作负载作为 任务 分发,以便消息流高度可扩展且可靠。
部署使用 YAML 文件来提供规格来创建 KafkaConnect
资源。
AMQ Streams 提供 示例配置文件。在此过程中,我们使用以下示例文件:
-
examples/connect/kafka-connect.yaml
流程
部署 Kafka 连接到 OpenShift 集群。使用
examples/connect/kafka-connect.yaml
文件来部署 Kafka Connect。oc apply -f examples/connect/kafka-connect.yaml
检查部署的状态:
oc get pods -n <my_cluster_operator_namespace>
输出显示部署名称和就绪度
NAME READY STATUS RESTARTS my-connect-cluster-connect-<pod_id> 1/1 Running 0
my-connect-cluster
是 Kafka Connect 集群的名称。pod ID 标识创建的每个 pod。
使用默认部署,您可以创建一个 Kafka Connect pod。
READY
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
其他资源
6.4.2. 为多个实例配置 Kafka 连接
如果您运行多个 Kafka Connect 实例,您必须更改以下配置属性 的默认配置
:
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: # ... config: group.id: connect-cluster 1 offset.storage.topic: connect-cluster-offsets 2 config.storage.topic: connect-cluster-configs 3 status.storage.topic: connect-cluster-status 4 # ... # ...
对于具有相同 group.id
的所有 Kafka Connect 实例,这三个主题的值必须相同。
除非更改默认设置,否则每个连接到同一 Kafka 集群的 Kafka Connect 实例都使用相同的值部署。实际上,所有实例都是在集群中运行并使用相同的主题的所有实例。
如果多个 Kafka Connect 集群尝试使用相同的主题,Kafka Connect 将无法正常工作,并生成错误。
如果要运行多个 Kafka Connect 实例,请更改每个实例的这些属性值。
6.4.3. 添加连接器
Kafka Connect 使用连接器与其他系统集成来流传输数据。连接器是 Kafka Connector
类的实例,可以是以下类型之一:
- 源连接器
- 源连接器是一个运行时实体,它从外部系统获取数据并将其传送到 Kafka 作为信息。
- sink 连接器
- sink 连接器是一个运行时实体,它从 Kafka 主题获取信息并将其传送到外部系统。
Kafka Connect 使用插件架构为连接器提供实施工件。插件允许连接到其他系统,并提供额外的配置来操作数据。插件包括连接器和其他组件,如数据转换器和转换。连接器使用特定类型的外部系统运行。每个连接器都定义了其配置架构。您提供到 Kafka Connect 的配置,以在 Kafka Connect 中创建连接器实例。然后,连接器实例定义了一组用于在系统之间移动数据的任务。
使用以下方法之一将连接器插件添加到 Kafka Connect 中:
将插件添加到容器镜像后,您可以使用以下方法启动、停止和管理连接器实例:
您还可以使用这些选项创建新的连接器实例。
6.4.3.1. 自动使用连接器插件构建新容器镜像
配置 Kafka Connect,以便 AMQ Streams 会自动使用额外的连接器构建新容器镜像。您可以使用 KafkaConnect
自定义资源的 .spec.build.plugins
属性定义连接器插件。AMQ Streams 将自动下载连接器插件并将其添加到新容器镜像中。容器被推送到 .spec.build.output
中指定的容器存储库中,并在 Kafka Connect 部署中自动使用。
先决条件
- 必须部署 Cluster Operator。
- 容器 registry。
您需要提供自己的容器 registry,其中可将镜像推送到、存储和拉取镜像。AMQ Streams 支持私有容器 registry 以及公共 registry,如 Quay 或 Docker Hub。
流程
通过在
.spec.build.output
中指定容器 registry 来配置KafkaConnect
自定义资源,并在.spec.build.plugins
中指定其他连接器:apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec: 1 #... build: output: 2 type: docker image: my-registry.io/my-org/my-connect-cluster:latest pushSecret: my-registry-credentials plugins: 3 - name: debezium-postgres-connector artifacts: - type: tgz url: https://repo1.maven.org/maven2/io/debezium/debezium-connector-postgres/2.1.3.Final/debezium-connector-postgres-2.1.3.Final-plugin.tar.gz sha512sum: c4ddc97846de561755dc0b021a62aba656098829c70eb3ade3b817ce06d852ca12ae50c0281cc791a5a131cb7fc21fb15f4b8ee76c6cae5dd07f9c11cb7c6e79 - name: camel-telegram artifacts: - type: tgz url: https://repo.maven.apache.org/maven2/org/apache/camel/kafkaconnector/camel-telegram-kafka-connector/0.11.5/camel-telegram-kafka-connector-0.11.5-package.tar.gz sha512sum: d6d9f45e0d1dbfcc9f6d1c7ca2046168c764389c78bc4b867dab32d24f710bb74ccf2a007d7d7a8af2dfca09d9a52ccbc2831fc715c195a3634cca055185bd91 #...
创建或更新资源:
$ oc apply -f <kafka_connect_configuration_file>
- 等待新容器镜像构建,并且部署 Kafka Connect 集群。
-
使用 Kafka Connect REST API 或
KafkaConnector
自定义资源使用您添加的连接器插件。
6.4.3.2. 使用 Kafka Connect 基础镜像中的连接器插件构建新容器镜像
使用 Kafka Connect 基础镜像中的连接器插件创建自定义 Docker 镜像,将自定义镜像添加到 /opt/kafka/plugins
目录中。
您可以使用 Red Hat Ecosystem Catalog 上的 Kafka 容器镜像作为基础镜像,使用额外的连接器插件创建自己的自定义镜像。
在启动时,Kafka Connect 的 AMQ Streams 版本会加载 /opt/kafka/plugins
目录中包含的任何第三方连接器插件。
流程
使用
registry.redhat.io/amq-streams/kafka-35-rhel8:2.5.1
作为基础镜像,创建一个新的Dockerfile
:FROM registry.redhat.io/amq-streams/kafka-35-rhel8:2.5.1 USER root:root COPY ./my-plugins/ /opt/kafka/plugins/ USER 1001
插件文件示例
$ tree ./my-plugins/ ./my-plugins/ ├── debezium-connector-mongodb │ ├── bson-<version>.jar │ ├── CHANGELOG.md │ ├── CONTRIBUTE.md │ ├── COPYRIGHT.txt │ ├── debezium-connector-mongodb-<version>.jar │ ├── debezium-core-<version>.jar │ ├── LICENSE.txt │ ├── mongodb-driver-core-<version>.jar │ ├── README.md │ └── # ... ├── debezium-connector-mysql │ ├── CHANGELOG.md │ ├── CONTRIBUTE.md │ ├── COPYRIGHT.txt │ ├── debezium-connector-mysql-<version>.jar │ ├── debezium-core-<version>.jar │ ├── LICENSE.txt │ ├── mysql-binlog-connector-java-<version>.jar │ ├── mysql-connector-java-<version>.jar │ ├── README.md │ └── # ... └── debezium-connector-postgres ├── CHANGELOG.md ├── CONTRIBUTE.md ├── COPYRIGHT.txt ├── debezium-connector-postgres-<version>.jar ├── debezium-core-<version>.jar ├── LICENSE.txt ├── postgresql-<version>.jar ├── protobuf-java-<version>.jar ├── README.md └── # ...
COPY 命令指向要复制到容器镜像的插件文件。
本例为 Debezium 连接器(MongoDB、MySQL 和 PostgreSQL)添加了插件,但并非所有文件都被列为 brevity。在 Kafka Connect 中运行的 Debezium 与任何其他 Kafka Connect 任务相同。
- 构建容器镜像。
- 将自定义镜像推送到容器 registry。
指向新容器镜像。
您可以使用以下方法之一指向镜像:
编辑
KafkaConnect
自定义资源的KafkaConnect.spec.image
属性。如果设置,此属性会覆盖 Cluster Operator 中的
STRIMZI_KAFKA_CONNECT_IMAGES
环境变量。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster spec: 1 #... image: my-new-container-image 2 config: 3 #...
-
编辑
install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
文件中的STRIMZI_KAFKA_CONNECT_IMAGES
环境变量,然后重新安装 Cluster Operator。
6.4.3.3. 部署 KafkaConnector 资源
部署 KafkaConnector
资源来管理连接器。KafkaConnector
自定义资源提供了一种 OpenShift 原生方法来管理 Cluster Operator 连接器。您不需要发送 HTTP 请求来管理连接器,就像 Kafka Connect REST API 一样。您可以通过更新对应的 KafkaConnector
资源来管理正在运行的连接器实例,然后应用更新。Cluster Operator 更新正在运行的连接器实例的配置。您可以通过删除对应的 KafkaConnector
来删除连接器。
KafkaConnector
资源必须部署到与其链接到的 Kafka Connect 集群相同的命名空间中。
在此过程中显示的配置中,autoRestart
属性被设置为 true
。这可让自动重启失败的连接器和任务。最多进行 7 个重启尝试,之后必须手动重新启动。您可以注解 KafkaConnector
资源来 重启连接器 或 手动重启连接器任务。
连接器示例
您可以使用您自己的连接器,或尝试 AMQ Streams 提供的示例。直到 Apache Kafka 3.1.0 之前,Apache Kafka 中包含文件连接器插件示例。从 Apache Kafka 的 3.1.1 和 3.2.0 版本开始,需要将示例 添加到插件路径中,作为任何其他连接器。
AMQ Streams 为示例文件连接器插件提供了一个 示例 KafkaConnector
配置文件 (examples/connect/source-connector.yaml
) ,它会创建以下连接器实例作为 KafkaConnector
资源:
-
从 Kafka 许可证文件(源)读取每行的
FileStreamSourceConnector
实例,并将数据作为信息写入单个 Kafka 主题。 -
从 Kafka 主题读取消息的
FileStreamSinkConnector
实例,并将信息写入临时文件(接收器)。
我们使用此流程使用示例文件创建连接器。
示例连接器不应在生产环境中使用。
先决条件
- Kafka Connect 部署
- Cluster Operator 正在运行
流程
使用以下方法之一将
FileStreamSourceConnector
和FileStreamSinkConnector
插件添加到 Kafka Connect 中:在 Kafka Connect 配置中,将
strimzi.io/use-connector-resources 注解设置为
true
。apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" spec: # ...
启用
KafkaConnector
资源后,Cluster Operator 会监视它们。编辑
examples/connect/source-connector.yaml
文件:apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector 1 labels: strimzi.io/cluster: my-connect-cluster 2 spec: class: org.apache.kafka.connect.file.FileStreamSourceConnector 3 tasksMax: 2 4 autoRestart: 5 enabled: true config: 6 file: "/opt/kafka/LICENSE" 7 topic: my-topic 8 # ...
- 1
KafkaConnector
资源的名称,用作连接器的名称。使用对 OpenShift 资源有效的任何名称。- 2
- 在其中创建连接器实例的 Kafka Connect 集群的名称。连接器必须部署到它们所链接的 Kafka Connect 集群相同的命名空间中。
- 3
- 连接器类的完整名称或别名。这应该存在于 Kafka Connect 集群使用的镜像中。
- 4
- 连接器可创建的最大 Kafka Connect 任务数量。
- 5
- 启用自动重启失败的连接器和任务。
- 6
- 连接器配置 作为键值对。
- 7
- 这个示例源连接器配置从
/opt/kafka/LICENSE
文件中读取数据。 - 8
- 将源数据发布到的 Kafka 主题。
在 OpenShift 集群中创建源
KafkaConnector
:oc apply -f examples/connect/source-connector.yaml
创建
examples/connect/sink-connector.yaml
文件:touch examples/connect/sink-connector.yaml
将以下 YAML 粘贴到
sink-connector.yaml
文件中:apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-sink-connector labels: strimzi.io/cluster: my-connect spec: class: org.apache.kafka.connect.file.FileStreamSinkConnector 1 tasksMax: 2 config: 2 file: "/tmp/my-file" 3 topics: my-topic 4
在 OpenShift 集群中创建 sink
KafkaConnector
:oc apply -f examples/connect/sink-connector.yaml
检查是否创建了连接器资源:
oc get kctr --selector strimzi.io/cluster=<my_connect_cluster> -o name my-source-connector my-sink-connector
将 <my_connect_cluster> 替换为 Kafka Connect 集群的名称。
在容器中,执行
kafka-console-consumer.sh
来读取源连接器写入主题的消息:oc exec <my_kafka_cluster>-kafka-0 -i -t -- bin/kafka-console-consumer.sh --bootstrap-server <my_kafka_cluster>-kafka-bootstrap.NAMESPACE.svc:9092 --topic my-topic --from-beginning
将 <my_kafka_cluster> 替换为 Kafka 集群的名称。
源和接收器连接器配置选项
连接器配置在 KafkaConnector
资源的 spec.config
属性中定义。
FileStreamSourceConnector
和 FileStreamSinkConnector
类支持与 Kafka Connect REST API 相同的配置选项。其他连接器支持不同的配置选项。
名称 | 类型 | 默认值 | Description |
---|---|---|---|
| 字符串 | null | 要写入消息的源文件。如果没有指定,则使用标准输入。 |
| list | null | 将数据发布到的 Kafka 主题。 |
名称 | 类型 | 默认值 | Description |
---|---|---|---|
| 字符串 | null | 要写入消息的目标文件。如果没有指定,则使用标准输出。 |
| list | null | 从中读取数据的一个或多个 Kafka 主题。 |
| 字符串 | null | 与一个或多个 Kafka 主题匹配的正则表达式,以便从中读取数据。 |
6.4.3.4. 手动重启连接器
如果您使用 KafkaConnector
资源来管理连接器,请使用 restart
注解来手动触发连接器重启。
先决条件
- Cluster Operator 正在运行。
流程
查找控制您要重启的 Kafka 连接器的
KafkaConnector
自定义资源的名称:oc get KafkaConnector
通过在 OpenShift 中注解
KafkaConnector
资源来重启连接器。oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart=true
restart
注解设置为true
。等待下一个协调发生(默认为两分钟)。
Kafka 连接器会重启,只要协调过程检测到注解。当 Kafka Connect 接受重启请求时,注解会从
KafkaConnector
自定义资源中删除。
6.4.3.5. 手动重启 Kafka 连接器任务
如果您使用 KafkaConnector
资源来管理连接器,请使用 restart-task
注解来手动触发连接器任务的重启。
先决条件
- Cluster Operator 正在运行。
流程
查找控制您要重启的 Kafka 连接器任务的
KafkaConnector
自定义资源的名称:oc get KafkaConnector
从
KafkaConnector
自定义资源查找要重启的任务 ID。任务 ID 是非负整数,从 0 开始:oc describe KafkaConnector <kafka_connector_name>
通过在 OpenShift 中注解
KafkaConnector
资源,使用 ID 重启连接器任务:oc annotate KafkaConnector <kafka_connector_name> strimzi.io/restart-task=0
在本例中,任务
0
被重启。等待下一个协调发生(默认为两分钟)。
只要协调过程检测到注解,Kafka 连接器任务会被重启。当 Kafka Connect 接受重启请求时,注解会从
KafkaConnector
自定义资源中删除。
6.4.3.6. 公开 Kafka Connect API
使用 Kafka Connect REST API 作为使用 KafkaConnector
资源管理连接器的替代选择。Kafka Connect REST API 作为一个运行在 <connect_cluster_name>-connect-api:8083
的服务其中 <connect_cluster_name> 是 Kafka Connect 集群的名称。服务在创建 Kafka Connect 实例时创建。
Kafka Connect REST API 支持的操作请参考 Apache Kafka Connect API 文档。
strimzi.io/use-connector-resources
注解启用 KafkaConnectors。如果您将注解应用到 KafkaConnect
资源配置,则需要将其删除以使用 Kafka Connect API。否则,Cluster Operator 会恢复使用 Kafka Connect REST API 进行的手动更改。
您可以将连接器配置添加为 JSON 对象。
添加连接器配置的 curl 请求示例
curl -X POST \ http://my-connect-cluster-connect-api:8083/connectors \ -H 'Content-Type: application/json' \ -d '{ "name": "my-source-connector", "config": { "connector.class":"org.apache.kafka.connect.file.FileStreamSourceConnector", "file": "/opt/kafka/LICENSE", "topic":"my-topic", "tasksMax": "4", "type": "source" } }'
该 API 仅在 OpenShift 集群中访问。如果要使 Kafka Connect API 可供 OpenShift 集群中运行的应用程序访问,您可以通过创建以下功能之一来手动公开它:
-
LoadBalancer
或NodePort
类型服务 -
Ingress
资源(仅限 Kubernetes) - OpenShift 路由(仅限 OpenShift)
连接是不安全的,因此建议进行外部访问。
如果您决定创建服务,请使用 < connect_cluster_name>-connect-api
服务 选择器
中的标签来配置服务将流量路由到的 pod:
服务的选择器配置
# ... selector: strimzi.io/cluster: my-connect-cluster 1 strimzi.io/kind: KafkaConnect strimzi.io/name: my-connect-cluster-connect 2 #...
您还必须创建一个允许来自外部客户端的 HTTP 请求的 NetworkPolicy
。
允许请求 Kafka Connect API 的 NetworkPolicy 示例
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: my-custom-connect-network-policy
spec:
ingress:
- from:
- podSelector: 1
matchLabels:
app: my-connector-manager
ports:
- port: 8083
protocol: TCP
podSelector:
matchLabels:
strimzi.io/cluster: my-connect-cluster
strimzi.io/kind: KafkaConnect
strimzi.io/name: my-connect-cluster-connect
policyTypes:
- Ingress
- 1
- 允许连接到 API 的 pod 标签。
要在集群外添加连接器配置,请使用 curl 命令中公开 API 的资源 URL。
6.4.3.7. 限制对 Kafka Connect API 的访问
仅将对 Kafka Connect API 的访问限制为可信用户,以防止未经授权的操作和潜在的安全问题。Kafka Connect API 提供了大量更改连接器配置的功能,这有助于采取安全措施。有权访问 Kafka Connect API 的人员可能会获得管理员可能假设的敏感信息是安全的。
Kafka Connect REST API 可以被经过身份验证访问 OpenShift 集群的任何人访问,并知道端点 URL,其中包括主机名/IP 地址和端口号。
例如,假设机构使用 Kafka Connect 集群和连接器将客户数据库的敏感数据流传输到中央数据库。管理员使用配置供应商插件存储与连接到客户数据库和中央数据库(如数据库连接详情和身份验证凭据)相关的敏感信息。配置提供程序保护此敏感信息无法向未授权用户公开。但是,有权访问 Kafka Connect API 的用户仍然可以获得对客户数据库的访问权限,而无需经过管理员的批准。他们可以通过设置一个假的数据库并将连接器配置为连接它。然后,他们可以修改连接器配置以指向客户数据库,但不是将数据发送到中央数据库,而是将其发送到假的数据库。通过将连接器配置为连接到假的数据库,可以截获连接到客户端数据库的登录详情和凭证,即使它们被安全地存储在配置提供程序中。
如果您使用 KafkaConnector
自定义资源,默认情况下,OpenShift RBAC 规则只允许 OpenShift 集群管理员更改连接器。您还可以指定非集群管理员来管理 AMQ Streams 资源。在 Kafka Connect 配置中启用 KafkaConnector
资源后,Cluster Operator 会恢复使用 Kafka Connect REST API 所做的更改。如果您不使用 KafkaConnector
资源,默认的 RBAC 规则不会限制对 Kafka Connect API 的访问。如果要使用 OpenShift RBAC 限制对 Kafka Connect REST API 的直接访问,则需要启用和使用 KafkaConnector
资源。
为了提高安全性,我们建议为 Kafka Connect API 配置以下属性:
org.apache.kafka.disallowed.login.modules
(Kafka 3.4 或更高版本)设置
org.apache.kafka.disallowed.login.modules
Java 系统属性,以防止使用不安全的登录模块。例如,指定com.sun.security.auth.module.JndiLoginModule
可防止使用 KafkaJndiLoginModule
。禁止登录模块的配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" spec: # ... jvmOptions: javaSystemProperties: - name: org.apache.kafka.disallowed.login.modules value: com.sun.security.auth.module.JndiLoginModule, org.apache.kafka.common.security.kerberos.KerberosLoginModule # ...
只允许可信登录模块,并按照您使用的版本的 Kafka 的最新建议进行操作。作为最佳实践,您应该通过使用
org.apache.kafka.disallowed.login.modules
系统属性明确禁止 Kafka Connect 配置中不安全的登录模块。connector.client.config.override.policy
将
connector.client.config.override.policy
属性设置为None
,以防止连接器配置覆盖 Kafka Connect 配置及其使用的用户和制作者。指定连接器覆盖策略的配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" spec: # ... config: connector.client.config.override.policy: None # ...
6.4.3.8. 从 Kafka Connect API 切换到使用 KafkaConnector 自定义资源
您可以从使用 Kafka Connect API 切换到使用 KafkaConnector
自定义资源来管理连接器。要进行交换机,请按照所示的顺序执行以下操作:
-
使用配置部署
KafkaConnector
资源,以创建您的连接器实例。 -
通过将
strimzi.io/use-connector-resources
注解设置为true
,在 Kafka Connect 配置中启用KafkaConnector
资源。
如果在创建 KafkaConnector
资源前启用 KafkaConnector 资源,则删除所有连接器。
要从使用 KafkaConnector
资源切换到使用 Kafka Connect API,首先从 Kafka Connect 配置中删除启用 KafkaConnector
资源的注解。否则,Cluster Operator 会恢复使用 Kafka Connect REST API 进行的手动更改。
在进行交换机时 ,检查 KafkaConnect
资源的状态。metadata.generation
的值(当前版本的部署)必须与 status.observedGeneration
(资源最新协调)匹配。当 Kafka Connect 集群为 Ready
时,您可以删除 KafkaConnector
资源。
6.4.4. Kafka Connect 集群资源列表
以下资源由 OpenShift 集群中的 Cluster Operator 创建:
- connect-cluster-name-connect
提供给以下 Kafka Connect 资源的名称:
-
创建 Kafka Connect worker 节点 pod 的部署(当
StableConnectIdentities
功能门被禁用时)。 -
StrimziPodSet 创建 Kafka Connect worker 节点 pod (当启用了
StableConnectIdentities
功能门时)。 -
为 Connect pod 提供稳定 DNS 名称的无头服务(启用了
StableConnectIdentities
功能门时)。 - 为 Kafka Connect worker 节点配置的 Pod Disruption Budget。
-
创建 Kafka Connect worker 节点 pod 的部署(当
- connect-cluster-name-connect-idx
-
由 Kafka Connect StrimziPodSet 创建的 Pod (当启用了
StableConnectIdentities
功能门时)。 - connect-cluster-name-connect-api
- 公开用于管理 Kafka Connect 集群的 REST 接口的服务。
- connect-cluster-name-config
- 包含 Kafka Connect 辅助配置的 ConfigMap,并由 Kafka 代理 pod 挂载为卷。
6.5. 部署 Kafka MirrorMaker
Kafka MirrorMaker 在两个或多个 Kafka 集群之间复制数据,并在数据中心之间复制数据。此过程称为镜像(mirror),以避免与 Kafka 分区复制概念混淆。MirrorMaker 使用来自源集群的消息,并将这些消息重新发布到目标集群。
集群间的数据复制支持以下场景:
- 在系统失败时恢复数据
- 从多个源集群整合数据以进行集中分析
- 对特定集群的数据访问限制
- 在特定位置置备数据以提高延迟
6.5.1. 将 Kafka MirrorMaker 部署到 OpenShift 集群中
此流程演示了如何使用 Cluster Operator 将 Kafka MirrorMaker 集群部署到 OpenShift 集群。
部署使用 YAML 文件来提供规格,根据部署的 MirrorMaker 版本创建 KafkaMirrorMaker
或 KafkaMirrorMaker2
资源。
Kafka MirrorMaker 1 (称为文档中的 MirrorMaker )已在 Apache Kafka 3.0.0 中弃用,并将在 Apache Kafka 4.0.0 中删除。因此,在 AMQ Streams 中还已弃用了用于部署 Kafka MirrorMaker
1 的 KafkaMirrorMaker 自定义资源。当使用 Apache Kafka 4.0.0 时,KafkaMirrorMaker
资源将从 AMQ Streams 中删除。作为替代方法,在 IdentityReplicationPolicy
中使用 KafkaMirrorMaker2
自定义资源。
AMQ Streams 提供 示例配置文件。在此过程中,我们使用以下示例文件:
-
examples/mirror-maker/kafka-mirror-maker.yaml
-
examples/mirror-maker/kafka-mirror-maker-2.yaml
流程
将 Kafka MirrorMaker 部署到 OpenShift 集群中:
对于 MirrorMaker:
oc apply -f examples/mirror-maker/kafka-mirror-maker.yaml
对于 MirrorMaker 2:
oc apply -f examples/mirror-maker/kafka-mirror-maker-2.yaml
检查部署的状态:
oc get pods -n <my_cluster_operator_namespace>
输出显示部署名称和就绪度
NAME READY STATUS RESTARTS my-mirror-maker-mirror-maker-<pod_id> 1/1 Running 1 my-mm2-cluster-mirrormaker2-<pod_id> 1/1 Running 1
my-mirror-maker
是 Kafka MirrorMaker 集群的名称。my-mm2-cluster
是 Kafka MirrorMaker 2 集群的名称。pod ID 标识创建的每个 pod。
使用默认部署,您要安装单个 MirrorMaker 或 MirrorMaker 2 pod。
READY
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
6.5.2. Kafka MirrorMaker 集群资源列表
以下资源由 OpenShift 集群中的 Cluster Operator 创建:
- <mirror-maker-name>-mirror-maker
- 负责创建 Kafka MirrorMaker Pod 的部署。
- <mirror-maker-name>-config
- 包含 Kafka MirrorMaker 的辅助配置的 ConfigMap,由 Kafka 代理 pod 挂载为卷。
- <mirror-maker-name>-mirror-maker
- 为 Kafka MirrorMaker worker 节点配置的 Pod Disruption Budget。
6.6. 部署 Kafka Bridge
Kafka Bridge 提供了一个 API,用于将基于 HTTP 的客户端与 Kafka 集群集成。
6.6.1. 在 OpenShift 集群中部署 Kafka Bridge
此流程演示了如何使用 Cluster Operator 将 Kafka Bridge 集群部署到 OpenShift 集群。
部署使用 YAML 文件来提供规格来创建 KafkaBridge
资源。
AMQ Streams 提供 示例配置文件。在此过程中,我们使用以下示例文件:
-
examples/bridge/kafka-bridge.yaml
流程
将 Kafka Bridge 部署到 OpenShift 集群:
oc apply -f examples/bridge/kafka-bridge.yaml
检查部署的状态:
oc get pods -n <my_cluster_operator_namespace>
输出显示部署名称和就绪度
NAME READY STATUS RESTARTS my-bridge-bridge-<pod_id> 1/1 Running 0
my-bridge
是 Kafka Bridge 集群的名称。pod ID 标识创建的每个 pod。
使用默认部署,您会安装单个 Kafka Bridge pod。
READY
显示就绪/预期的副本数。当STATUS
显示为Running
时,部署成功。
6.6.2. 将 Kafka Bridge 服务公开给本地机器
使用端口转发将 AMQ Streams Kafka Bridge 服务公开给 http://localhost:8080 中的本地机器。
端口转发仅适用于开发和测试目的。
流程
列出 OpenShift 集群中的 pod 的名称:
oc get pods -o name pod/kafka-consumer # ... pod/my-bridge-bridge-<pod_id>
在端口
8080
上连接到 Kafka Bridge pod:oc port-forward pod/my-bridge-bridge-<pod_id> 8080:8080 &
注意如果本地计算机上的端口 8080 已在使用中,请使用其他 HTTP 端口,如
8008
。
API 请求现在从本地机器上的端口 8080 转发到 Kafka Bridge pod 的端口 8080。
6.6.3. 在 OpenShift 之外访问 Kafka Bridge
部署后,AMQ Streams Kafka Bridge 只能由在同一 OpenShift 集群中运行的应用程序访问。这些应用程序使用 < ;kafka_bridge_name> -bridge-service
服务来访问 API。
如果要使 Kafka Bridge 可供 OpenShift 集群中运行的应用程序访问,您可以通过创建以下功能之一来手动公开它:
-
LoadBalancer
或NodePort
类型服务 -
Ingress
资源(仅限 Kubernetes) - OpenShift 路由(仅限 OpenShift)
如果您决定创建服务,请使用 < kafka_bridge_name>-bridge-service
服务 选择器
中的标签来配置服务将流量路由到的 pod:
# ...
selector:
strimzi.io/cluster: kafka-bridge-name 1
strimzi.io/kind: KafkaBridge
#...
- 1
- OpenShift 集群中的 Kafka Bridge 自定义资源的名称。
6.6.4. Kafka Bridge 集群资源列表
以下资源由 OpenShift 集群中的 Cluster Operator 创建:
- bridge-cluster-name-bridge
- 用于创建 Kafka Bridge worker 节点 pod 的部署。
- bridge-cluster-name-bridge-service
- 公开 Kafka Bridge 集群的 REST 接口的服务。
- bridge-cluster-name-bridge-config
- 包含 Kafka Bridge acillary 配置的 ConfigMap,并由 Kafka 代理 pod 挂载为卷。
- bridge-cluster-name-bridge
- 为 Kafka Bridge worker 节点配置的 Pod Disruption Budget。
6.7. AMQ Streams operator 的替代独立部署选项
您可以对 Topic Operator 和 User Operator 执行独立部署。如果使用不是由 Cluster Operator 管理的 Kafka 集群,请考虑这些 Operator 的独立部署。
您将操作器部署到 OpenShift。Kafka 可以在 OpenShift 外部运行。例如,您可以使用 Kafka 作为受管服务。您可以调整独立 Operator 的部署配置,以匹配 Kafka 集群的地址。
6.7.1. 部署独立主题 Operator
此流程演示了如何将主题 Operator 部署为主题管理的独立组件。您可以将独立主题 Operator 与不由 Cluster Operator 管理的 Kafka 集群一起使用。
独立部署可以处理任何 Kafka 集群。
独立部署文件由 AMQ Streams 提供。使用 05-Deployment-strimzi-topic-operator.yaml
部署文件来部署主题 Operator。添加或设置环境变量来连接 Kafka 集群。
主题 Operator 监视单一命名空间中的 KafkaTopic
资源。您可以在 Topic Operator 配置中指定要监视的命名空间以及与 Kafka 集群的连接。单个主题 Operator 可以监视单个命名空间。一个命名空间应该只被一个主题 Operator 监视。如果要使用多个主题 Operator,请配置每个主题来监视不同的命名空间。这样,您可以将主题 Operator 与多个 Kafka 集群一起使用。
先决条件
您正在运行一个 Kafka 集群,供主题 Operator 连接。
只要为连接正确配置独立主题 Operator,则 Kafka 集群可以在裸机环境、虚拟机或受管云应用程序服务上运行。
流程
编辑
install/topic-operator/05-Deployment-strimzi-topic-operator.yaml
独立部署文件中的env
属性。独立主题 Operator 部署配置示例
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-topic-operator # ... env: - name: STRIMZI_NAMESPACE 1 valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS 2 value: my-kafka-bootstrap-address:9092 - name: STRIMZI_RESOURCE_LABELS 3 value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_ZOOKEEPER_CONNECT 4 value: my-cluster-zookeeper-client:2181 - name: STRIMZI_ZOOKEEPER_SESSION_TIMEOUT_MS 5 value: "18000" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS 6 value: "120000" - name: STRIMZI_TOPIC_METADATA_MAX_ATTEMPTS 7 value: "6" - name: STRIMZI_LOG_LEVEL 8 value: INFO - name: STRIMZI_TLS_ENABLED 9 value: "false" - name: STRIMZI_JAVA_OPTS 10 value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES 11 value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_PUBLIC_CA 12 value: "false" - name: STRIMZI_TLS_AUTH_ENABLED 13 value: "false" - name: STRIMZI_SASL_ENABLED 14 value: "false" - name: STRIMZI_SASL_USERNAME 15 value: "admin" - name: STRIMZI_SASL_PASSWORD 16 value: "password" - name: STRIMZI_SASL_MECHANISM 17 value: "scram-sha-512" - name: STRIMZI_SECURITY_PROTOCOL 18 value: "SSL"
- 1
- 主题 Operator 的 OpenShift 命名空间,以监视
KafkaTopic
资源。指定 Kafka 集群的命名空间。 - 2
- bootstrap 代理地址的主机和端口对,以发现并连接到 Kafka 集群中的所有代理。在服务器停机时,使用以逗号分隔的列表指定两个或多个代理地址。
- 3
- 用于标识主题 Operator 管理的
KafkaTopic
资源的标签。这不一定是 Kafka 集群的名称。它可以是分配给KafkaTopic
资源的标签。如果您部署多个主题 Operator,则标签必须是唯一的。也就是说,Operator 无法管理同一资源。 - 4
- (ZooKeeper)用于连接到 ZooKeeper 集群的地址的主机和端口对。这必须是 Kafka 集群正在使用的同一 ZooKeeper 集群。
- 5
- (ZooKeeper) ZooKeeper 会话超时,以毫秒为单位。默认值为
18000
(18 秒)。 - 6
- 定期协调之间的间隔,以毫秒为单位。默认值为
120000
(2 分钟)。 - 7
- 从 Kafka 获取主题元数据的尝试次数。每次尝试之间的时间定义为指数 backoff。由于分区或副本数,当主题创建需要更长的时间时,请考虑增加这个值。默认值为
6
个尝试。 - 8
- 打印日志记录消息的级别。您可以将级别设置为
ERROR
、WARNING
、INFO
、DEBUG
或TRACE
。 - 9
- 启用 TLS 支持与 Kafka 代理的加密通信。
- 10
- (可选)运行主题 Operator 的 JVM 使用的 Java 选项。
- 11
- (可选)为主题 Operator 设置的调试(
-D
)选项。 - 12
- (可选)如果通过
STRIMZI_TLS_ENABLED
启用 TLS,请跳过信任存储证书的生成。如果启用了此环境变量,代理必须使用公共可信证书颁发机构作为其 TLS 证书。默认值为false
。 - 13
- (可选)为 mTLS 身份验证生成密钥存储证书。把它设置为
false
可禁用 mTLS 到 Kafka 代理的客户端身份验证。默认值是true
。 - 14
- (可选)在连接到 Kafka 代理时启用对客户端身份验证的 SASL 支持。默认值为
false
。 - 15
- (可选)客户端身份验证的 SASL 用户名。只有通过
STRIMZI_SASL_ENABLED
启用 SASL 时才强制。 - 16
- (可选)客户端身份验证的 SASL 密码。只有通过
STRIMZI_SASL_ENABLED
启用 SASL 时才强制。 - 17
- (可选)客户端身份验证的 SASL 机制。只有通过
STRIMZI_SASL_ENABLED
启用 SASL 时才强制。您可以将值设为plain
,scram-sha-256
, 或scram-sha-512
。 - 18
- (可选)用于与 Kafka 代理通信的安全协议。默认值为 "PLAINTEXT"。您可以将值设为
PLAINTEXT
、SSL
、SASL_PLAINTEXT
或SASL_SSL
。
-
如果要连接到使用来自公共证书颁发机构证书的 Kafka 代理,请将
STRIMZI_PUBLIC_CA
设置为true
。将此属性设置为true
,例如,如果您使用 Amazon AWS MSK 服务。 如果您使用
STRIMZI_TLS_ENABLED
环境变量启用了 mTLS,请指定用于验证与 Kafka 集群的连接的密钥存储和信任存储。mTLS 配置示例
# .... env: - name: STRIMZI_TRUSTSTORE_LOCATION 1 value: "/path/to/truststore.p12" - name: STRIMZI_TRUSTSTORE_PASSWORD 2 value: "TRUSTSTORE-PASSWORD" - name: STRIMZI_KEYSTORE_LOCATION 3 value: "/path/to/keystore.p12" - name: STRIMZI_KEYSTORE_PASSWORD 4 value: "KEYSTORE-PASSWORD" # ...
部署主题 Operator。
oc create -f install/topic-operator
检查部署的状态:
oc get deployments
输出显示部署名称和就绪度
NAME READY UP-TO-DATE AVAILABLE strimzi-topic-operator 1/1 1 1
READY
显示就绪/预期的副本数。当AVAILABLE
输出显示为1
时,部署成功。
6.7.1.1. (预览)为单向主题管理部署独立主题 Operator
单向主题管理仅通过 KafkaTopic
资源维护主题。有关单向主题管理的详情,请参考 第 9.1 节 “主题管理模式”。
如果要尝试单向主题管理的预览,请按照以下步骤部署独立主题 Operator。
流程
取消部署当前独立主题 Operator。
保留
KafkaTopic
资源,这些资源由主题 Operator 再次部署时获取。编辑独立主题 Operator 的
Deployment
配置,以删除任何与 ZooKeeper 相关的环境变量:-
STRIMZI_ZOOKEEPER_CONNECT
-
STRIMZI_ZOOKEEPER_SESSION_TIMEOUT_MS
-
TC_ZK_CONNECTION_TIMEOUT_MS
STRIMZI_USE_ZOOKEEPER_TOPIC_STORE
它是定义是否使用 unidirectional Topic Operator 的 ZooKeeper 变量是否存在。单向主题管理不使用 ZooKeeper。如果没有 ZooKeeper 环境变量,则使用 unidirectional Topic Operator。否则会使用双向主题 Operator。
如果存在时可以删除的其他未使用的环境变量:
-
STRIMZI_REASSIGN_THROTTLE
-
STRIMZI_REASSIGN_VERIFY_INTERVAL_MS
-
STRIMZI_TOPIC_METADATA_MAX_ATTEMPTS
-
STRIMZI_TOPICS_PATH
-
STRIMZI_STORE_TOPIC
-
STRIMZI_STORE_NAME
-
STRIMZI_APPLICATION_ID
-
STRIMZI_STALE_RESULT_TIMEOUT_MS
-
(可选)将
STRIMZI_USE_FINALIZERS
环境变量设置为false
:其他单向主题管理配置
# ... env: - name: STRIMZI_USE_FINALIZERS value: "false"
如果您不想使用终结器来控制 删除主题,请将此环境变量设置为
false
。单向主题管理的独立主题 Operator 部署配置示例
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-topic-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-topic-operator # ... env: - name: STRIMZI_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS value: my-kafka-bootstrap-address:9092 - name: STRIMZI_RESOURCE_LABELS value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS value: "120000" - name: STRIMZI_LOG_LEVEL value: INFO - name: STRIMZI_TLS_ENABLED value: "false" - name: STRIMZI_JAVA_OPTS value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_PUBLIC_CA value: "false" - name: STRIMZI_TLS_AUTH_ENABLED value: "false" - name: STRIMZI_SASL_ENABLED value: "false" - name: STRIMZI_SASL_USERNAME value: "admin" - name: STRIMZI_SASL_PASSWORD value: "password" - name: STRIMZI_SASL_MECHANISM value: "scram-sha-512" - name: STRIMZI_SECURITY_PROTOCOL value: "SSL" - name: STRIMZI_USE_FINALIZERS value: "true"
- 以标准的方式部署独立主题 Operator。
6.7.2. 部署独立用户 Operator
此流程演示了如何将 User Operator 部署为用户管理的独立组件。您可以将独立的 User Operator 与不由 Cluster Operator 管理的 Kafka 集群一起使用。
独立部署可以处理任何 Kafka 集群。
独立部署文件由 AMQ Streams 提供。使用 05-Deployment-strimzi-user-operator.yaml
部署文件来部署 User Operator。添加或设置环境变量来连接 Kafka 集群。
User Operator 监视单个命名空间中的 KafkaUser
资源。您可以在 User Operator 配置中指定要监视的命名空间以及与 Kafka 集群的连接。单个用户 Operator 可以监视单个命名空间。一个命名空间应该只被一个 User Operator 监视。如果要使用多个 User Operator,请配置每个 User Operator 以监视不同的命名空间。这样,您可以将 User Operator 与多个 Kafka 集群一起使用。
先决条件
您正在运行一个 Kafka 集群,供 User Operator 连接。
只要为连接正确配置独立用户 Operator,则 Kafka 集群可以在裸机环境、虚拟机或受管云应用程序服务上运行。
流程
编辑
install/user-operator/05-Deployment-strimzi-user-operator.yaml
独立部署文件中的以下env
属性。独立用户 Operator 部署配置示例
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-user-operator labels: app: strimzi spec: # ... template: # ... spec: # ... containers: - name: strimzi-user-operator # ... env: - name: STRIMZI_NAMESPACE 1 valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_KAFKA_BOOTSTRAP_SERVERS 2 value: my-kafka-bootstrap-address:9092 - name: STRIMZI_CA_CERT_NAME 3 value: my-cluster-clients-ca-cert - name: STRIMZI_CA_KEY_NAME 4 value: my-cluster-clients-ca - name: STRIMZI_LABELS 5 value: "strimzi.io/cluster=my-cluster" - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS 6 value: "120000" - name: STRIMZI_WORK_QUEUE_SIZE 7 value: 10000 - name: STRIMZI_CONTROLLER_THREAD_POOL_SIZE 8 value: 10 - name: STRIMZI_USER_OPERATIONS_THREAD_POOL_SIZE 9 value: 4 - name: STRIMZI_LOG_LEVEL 10 value: INFO - name: STRIMZI_GC_LOG_ENABLED 11 value: "true" - name: STRIMZI_CA_VALIDITY 12 value: "365" - name: STRIMZI_CA_RENEWAL 13 value: "30" - name: STRIMZI_JAVA_OPTS 14 value: "-Xmx=512M -Xms=256M" - name: STRIMZI_JAVA_SYSTEM_PROPERTIES 15 value: "-Djavax.net.debug=verbose -DpropertyName=value" - name: STRIMZI_SECRET_PREFIX 16 value: "kafka-" - name: STRIMZI_ACLS_ADMIN_API_SUPPORTED 17 value: "true" - name: STRIMZI_MAINTENANCE_TIME_WINDOWS 18 value: '* * 8-10 * * ?;* * 14-15 * * ?' - name: STRIMZI_KAFKA_ADMIN_CLIENT_CONFIGURATION 19 value: | default.api.timeout.ms=120000 request.timeout.ms=60000
- 1
- User Operator 的 OpenShift 命名空间,用于监视
KafkaUser
资源。只能指定一个命名空间。 - 2
- bootstrap 代理地址的主机和端口对,以发现并连接到 Kafka 集群中的所有代理。在服务器停机时,使用以逗号分隔的列表指定两个或多个代理地址。
- 3
- 包含为 mTLS 身份验证签名的 CA (certificate 授权)的公钥(
ca.crt
)值的 OpenShiftSecret
。 - 4
- 包含 CA 的私钥(
ca.key
)值的 OpenShiftSecret
,用于为 mTLS 身份验证为新用户证书签名。 - 5
- 用于标识由 User Operator 管理的
KafkaUser
资源的标签。这不一定是 Kafka 集群的名称。它可以是分配给KafkaUser
资源的标签。如果部署多个 User Operator,则标签必须是唯一的。也就是说,Operator 无法管理同一资源。 - 6
- 定期协调之间的间隔,以毫秒为单位。默认值为
120000
(2 分钟)。 - 7
- 控制器事件队列的大小。队列的大小应至少与您希望 User Operator 操作的最大用户量一样。默认值为
1024
。 - 8
- 用于协调用户的 worker 池大小。较大的池可能需要更多资源,但它也会处理更多
KafkaUser
资源,默认值为50
。 - 9
- Kafka Admin API 和 OpenShift 操作的 worker 池大小。较大的池可能需要更多资源,但它也会处理更多的
KafkaUser
资源。默认为4
。 - 10
- 打印日志记录消息的级别。您可以将级别设置为
ERROR
、WARNING
、INFO
、DEBUG
或TRACE
。 - 11
- 启用垃圾回收(GC)日志记录。默认值是
true
。 - 12
- CA 的有效性周期。默认值为
365
天。 - 13
- CA 的续订周期。续订周期从当前证书的到期日期后衡量。默认值为
30
天,以在旧证书过期前启动证书续订。 - 14
- (可选)运行用户 Operator 的 JVM 使用的 Java 选项
- 15
- (可选)为 User Operator 设置的调试(
-D
)选项 - 16
- (可选)由 User Operator 创建的 OpenShift secret 名称的前缀。
- 17
- (可选)指示 Kafka 集群是否支持使用 Kafka Admin API 管理授权 ACL 规则。当设置为
false
时,User Operator 将拒绝具有simple
授权 ACL 规则的所有资源。这有助于避免 Kafka 集群日志中不必要的异常。默认值是true
。 - 18
- (可选) Semi-colon 分隔 Cron Expressions 列表,用于定义维护时间窗,其中过期用户证书。
- 19
- (可选)配置 User Operator 以属性格式使用的 Kafka Admin 客户端的配置选项。
如果您使用 mTLS 连接到 Kafka 集群,请指定用于验证连接的 secret。否则,进入下一步。
mTLS 配置示例
# .... env: - name: STRIMZI_CLUSTER_CA_CERT_SECRET_NAME 1 value: my-cluster-cluster-ca-cert - name: STRIMZI_EO_KEY_SECRET_NAME 2 value: my-cluster-entity-operator-certs # ..."
部署 User Operator。
oc create -f install/user-operator
检查部署的状态:
oc get deployments
输出显示部署名称和就绪度
NAME READY UP-TO-DATE AVAILABLE strimzi-user-operator 1/1 1 1
READY
显示就绪/预期的副本数。当AVAILABLE
输出显示为1
时,部署成功。
第 7 章 启用 AMQ Streams 功能门
AMQ Streams operator 使用功能门来启用或禁用特定功能和功能。通过启用功能门,您可以更改对应 Operator 的行为,从而向 AMQ Streams 部署引入了该功能。
功能门可能会被默认启用或禁用,具体取决于其成熟度等级。
要修改功能门的默认状态,请使用 Operator 配置中的 STRIMZI_FEATURE_GATES
环境变量。您可以使用这个单一环境变量修改多个功能门。指定以逗号分隔的功能门名称和前缀列表。+
前缀启用功能门和 -
前缀禁用它。
启用 FeatureGate1
并禁用 FeatureGate2
的功能门配置示例
env: - name: STRIMZI_FEATURE_GATES value: +FeatureGate1,-FeatureGate2
7.1. ControlPlaneListener 功能门
ControlPlaneListener
功能门已移到 GA,这意味着它现已永久启用且无法禁用。启用 ControlPlaneListener
后,Kafka 控制器和代理之间的连接使用端口 9090 上的内部 control plane 侦听程序。在代理间复制数据,以及来自 AMQ Streams operator、Cruise Control 或 Kafka Exporter 的内部连接,在端口 9091 上使用 复制监听程序。
永久启用 ControlPlaneListener
功能门后,现在可以在 AMQ Streams 1.7 及更早版本和 AMQ Streams 2.3 及更新版本之间直接升级或降级。您必须首先升级或降级 AMQ Streams 版本 in-between,禁用 ControlPlaneListener
功能门,然后降级或升级(启用了功能门)到目标版本。
7.2. ServiceAccountPatching 功能门
ServiceAccountPatching
功能门已移到 GA,这意味着它现已永久启用且无法禁用。启用 ServiceAccountPatching
后,Cluster Operator 始终协调服务帐户并根据需要更新它们。例如,当您使用自定义资源的 template
属性更改服务帐户标签或注解时,Operator 会在现有服务帐户资源中自动更新它们。
7.3. UseStrimziPodSets 功能门
UseStrimziPodSets
功能门已移到 GA,这意味着它现已永久启用且无法禁用。对 StatefulSets
的支持已被删除,AMQ Streams 现在始终使用 StrimziPodSets
来管理 Kafka 和 ZooKeeper pod。
永久启用 UseStrimziPodSets
功能门后,无法再直接从 AMQ Streams 2.4 及更新版本降级到 AMQ Streams 2.0 或更早版本。您必须首先通过一个 AMQ Streams 版本( in-between)进行降级,禁用 UseStrimziPodSets
功能门,然后降级到 AMQ Streams 2.0 或更早版本。
7.4. (Preview) UseKRaft 功能门
UseKRaft
功能门具有 禁用的 默认状态。
UseKRaft
功能门在没有 ZooKeeper 的情况下在 KRaft (Kafka Raft 元数据)模式中部署 Kafka 集群。ZooKeeper 和 KRaft 是用于管理 Kafka 集群中元数据和协调操作的机制。KRaft 模式消除了对 ZooKeeper 等外部协调服务的需求。在 KRaft 模式中,Kafka 节点使用代理、控制器或两者的角色。它们一起管理元数据,该元数据在分区之间复制。控制器负责协调操作和维护集群的状态。
此功能门目前仅适用于开发和测试。
KRaft 模式在 Apache Kafka 或 AMQ Streams 中不适用于生产环境。
启用 UseKRaft
功能门需要启用 KafkaNodePools
功能门。要以 KRaft 模式部署 Kafka 集群,您必须使用 KafkaNodePool
资源。如需了解更多详细信息和示例,请参阅 第 6.3.2 节 “(预览)部署 Kafka 节点池”。
当启用 UseKRaft
功能门时,Kafka 集群会在没有 ZooKeeper 的情况下部署。Kafka
自定义资源中的 .spec.zookeeper
属性会被忽略,但仍然需要存在。UseKRaft
功能门提供了一个 API,用于配置 Kafka 集群节点及其角色。API 仍在开发中,预期在 KRaft 模式为生产环境就绪前有所变化。
目前,AMQ Streams 中的 KRaft 模式有以下主要限制:
- 不支持从 ZooKeeper 移动到 KRaft 集群或其他方法。
- 只有 controller-only 节点无法单独进行滚动更新或单独更新。
- 不支持升级和降级 Apache Kafka 版本或 AMQ Streams operator。用户可能需要删除集群,升级 Operator 并部署一个新的 Kafka 集群。
-
KRaft 模式 只支持 Un idirectional Topic Operator。您可以使用
UnidirectionalTopicOperator
功能门启用它。不支持 Bidirectional Topic Operator,当没有启用UnidirectionalTopicOperator
功能门时,spec.entityOperator.topicOperator
属性 必须从Kafka
自定义资源中删除。 -
不支持 JBOD 存储。可以使用
type: jbod
存储,但 JBOD 数组只能包含一个磁盘。
启用 UseKRaft 功能门
要启用 UseKRaft
功能门,在 Cluster Operator 配置中的 STRIMZI_FEATURE_GATES
环境变量中指定 +UseKRaft,+KafkaNodePools
。
7.5. StableConnectIdentities 功能门
StableConnectIdentities
功能门的默认状态 被禁用。
StableConnectIdentities
功能门使用 StrimziPodSet
资源来管理 Kafka Connect 和 Kafka MirrorMaker 2 pod,而不使用 OpenShift Deployment
资源。StrimziPodSets
为 pod 提供稳定的名称和稳定地址,在滚动升级过程中不会改变。这有助于最小化连接器任务的重新平衡数量。
启用 StableConnectIdentities
功能门
要启用 StableConnectIdentities
功能门,请在 Cluster Operator 配置中的 STRIMZI_FEATURE_GATES
环境变量中指定 +StableConnectIdentities
。
在降级到 AMQ Streams 2.3 及更早的版本时,必须禁用 StableConnectIdentities
功能门。
7.6. (预览) KafkaNodePools 功能门
KafkaNodePools
功能门具有 禁用的 默认状态。
KafkaNodePools
功能门引入了一个新的 KafkaNodePool
自定义资源,该资源启用配置不同 Apache Kafka 节点池。
节点池指的是 Kafka 集群中不同的 Kafka 节点组。每个池都有自己的唯一的配置,其中包括强制设置,如副本数、存储配置和分配的角色列表。您可以将 控制器 角色、代理 角色或两个角色都分配给 .spec.roles
字段中池中的所有节点。当与基于 ZooKeeper 的 Apache Kafka 集群一起使用时,必须将其设置为 broker
角色。与 UseKRaft
功能门一起使用时,它可以设置为 代理
、控制器
或两者。
此外,节点池可以自行配置资源请求和限值、Java JVM 选项和资源模板。没有在 KafkaNodePool
资源中设置的配置选项从 Kafka
自定义资源继承。
KafkaNodePool
资源使用 strimzi.io/cluster
标签来指示它们所属的 Kafka 集群。该标签必须设置为 Kafka
自定义资源的名称。
KafkaNodePool
资源的示例可在 AMQ Streams 提供 的示例配置文件 中找到。
启用 KafkaNodePools 功能门
要启用 KafkaNodePools
功能门,在 Cluster Operator 配置中的 STRIMZI_FEATURE_GATES
环境变量中指定 +KafkaNodePools
。使用节点池的 Kafka
自定义资源还必须具有注解 strimzi.io/node-pools: enabled
。
7.7. (预览)UnidirectionalTopicOperator 功能门
UnidirectionalTopicOperator
功能门 禁用 默认状态。
UnidirectionalTopicOperator
功能门引入了一个单向主题管理模式,用于使用 KafkaTopic
资源创建 Kafka 主题。单向模式与使用 KRaft 进行集群管理兼容。使用单向模式,您可以使用 KafkaTopic
资源创建 Kafka 主题,然后由 Topic Operator 管理。对 KafkaTopic
资源之外的主题的任何配置更改都会被恢复。有关主题管理的详情,请参考 第 9.1 节 “主题管理模式”。
启用 UnidirectionalTopicOperator 功能门
要启用 UnidirectionalTopicOperator
功能门,在 Cluster Operator 配置中的 STRIMZI_FEATURE_GATES
环境变量中指定 +UnidirectionalTopicOperator
。要使 KafkaTopic
自定义资源使用此功能,strimzi.io/managed
注解默认设置为 true
。
7.8. 功能门版本
功能门有三个成熟度阶段:
- alpha - 通常默认禁用
- beta - 通常默认启用
- GA (GA)- 通常始终启用
alpha 阶段功能可能是实验性或不稳定的,可能随时更改或尚未针对生产环境进行了测试。Beta 阶段功能经过良好测试,其功能可能不会改变。GA 阶段功能稳定,将来不应改变。如果 alpha 和 beta 阶段功能没有很有用,则它们会被删除。
-
ControlPlaneListener
功能门在 AMQ Streams 2.3 中移到 GA 阶段。它现已永久启用且无法禁用。 -
ServiceAccountPatching
功能门在 AMQ Streams 2.3 中移到 GA 阶段。它现已永久启用且无法禁用。 -
UseStrimziPodSets
功能门移到 AMQ Streams 2.5 中的 GA 阶段,并完全删除对 StatefulSets 的支持。它现已永久启用且无法禁用。 -
UseKRaft
功能门仅适用于开发,目前没有计划迁移至 beta 阶段的版本。 -
StableConnectIdentities
功能门处于 alpha 阶段,默认是禁用的。 -
KafkaNodePools
功能门处于 alpha 阶段,默认是禁用的。 -
UnidirectionalTopicOperator
功能门处于 alpha 阶段,默认是禁用的。
当功能门到达 GA 时,可能会删除功能门。这意味着该功能已合并到 AMQ Streams 核心功能中,且无法禁用。
功能门 | Alpha | Beta | GA |
---|---|---|---|
| 1.8 | 2.0 | 2.3 |
| 1.8 | 2.0 | 2.3 |
| 2.1 | 2.3 | 2.5 |
| 2.2 | - | - |
| 2.4 | - | - |
| 2.5 | - | - |
| 2.5 | - | - |
如果启用了功能门,您可能需要在从特定的 AMQ Streams 版本升级或降级前禁用它。下表显示了在升级或降级 AMQ Streams 版本时需要禁用哪些功能门。
禁用功能门 | 从 AMQ Streams 版本升级 | 降级到 AMQ Streams 版本 |
---|---|---|
| 1.7 及更早版本 | 1.7 及更早版本 |
| - | 2.0 及更早版本 |
| - | 2.3 及更早版本 |
第 8 章 配置部署
使用 AMQ Streams 自定义资源配置和管理 AMQ Streams 部署。AMQ Streams 为每个发行版本提供示例自定义资源,允许您配置和创建支持的 Kafka 组件实例。通过将自定义资源配置为根据您的特定要求包含其他功能来微调部署。对于 Kafka Connect 连接器的特定配置区域,如指标、日志记录和外部配置,您还可以使用 ConfigMap
资源。通过使用 ConfigMap
资源来融合配置,您可以集中维护。您还可以使用配置供应商从外部来源加载配置,我们建议提供 Kafka Connect 连接器配置的凭证。
使用自定义资源配置并创建以下组件的实例:
- Kafka 集群
- Kafka Connect 集群
- Kafka MirrorMaker
- Kafka Bridge
- Sything Control
您还可以使用自定义资源配置来管理实例或修改部署,以引入其他功能。这可能包括支持以下配置:
- (预览)指定节点池
- 保护对 Kafka 代理的客户端访问
- 从集群外部访问 Kafka 代理
- 创建主题
- 创建用户(客户端)
- 控制功能门
- 更改日志频率
- 分配资源限值和请求
- 引入功能,如 AMQ Streams Drain Cleaner、Cruise Control 或 distributed tracing。
AMQ Streams 自定义资源 API 参考 描述了您可以在配置中使用的属性。
应用到自定义资源的标签也会应用到组成集群的 OpenShift 资源。这为资源提供了一个方便的机制来根据需要进行标记。
将更改应用到自定义资源配置文件
您可以使用 spec
属性将配置添加到自定义资源中。添加配置后,您可以使用 oc
将更改应用到自定义资源配置文件:
oc apply -f <kafka_configuration_file>
8.1. 使用示例配置文件
通过纳入其他支持的配置来进一步增强部署。从 AMQ Streams 软件下载页 提供了可下载发行工件的示例配置文件。
默认情况下,示例文件仅包含自定义资源的基本属性和值。您可以使用 oc
命令行工具下载并应用示例。在为部署构建自己的 Kafka 组件配置时,示例可作为起点。
如果使用 Operator 安装 AMQ Streams,您仍然可以下载示例文件并使用它们上传配置。
发行版本工件包括一个包含配置示例 的示例
目录。
AMQ Streams 提供的配置文件示例
examples ├── user 1 ├── topic 2 ├── security 3 │ ├── tls-auth │ ├── scram-sha-512-auth │ └── keycloak-authorization ├── mirror-maker 4 ├── metrics 5 ├── kafka 6 │ └── nodepools 7 ├── cruise-control 8 ├── connect 9 └── bridge 10
- 1
KafkaUser
自定义资源配置,由 User Operator 管理。- 2
KafkaTopic
自定义资源配置,由 Topic Operator 管理。- 3
- Kafka 组件的身份验证和授权配置。包括 TLS 和 SCRAM-SHA-512 身份验证的示例配置。Red Hat Single Sign-On 示例包括
Kafka
自定义资源配置和 Red Hat Single Sign-On 域规格。您可以使用示例尝试 Red Hat Single Sign-On 授权服务。另外,还有一个启用了oauth
身份验证和keycloak
授权指标的示例。 - 4
- 用于部署 Mirror Maker 的
Kafka
自定义资源配置。包括复制策略和同步频率配置示例。 - 5
- 指标配置,包括 Prometheus 安装和 Grafana 仪表板文件。
- 6
Kafka
自定义资源配置,用于部署 Kafka。包括临时或持久单节点部署的示例配置。- 7
- (预览) Kafka 集群中 Kafka 节点的
KafkaNodePool
配置。包括使用 KRaft (Kafka Raft metadata)模式或 ZooKeeper 的集群中节点配置示例。 - 8
- 使用 Cruise Control 的部署配置的
Kafka
自定义资源。包含KafkaRebalance
自定义资源,从 Cruise Control 生成优化提议,以及示例配置,以使用默认或用户优化目标。 - 9
KafkaConnect
和KafkaConnector
自定义资源配置用于部署 Kafka Connect。包括单节点或多节点部署的配置示例。- 10
- Kafka Bridge 部署的
KafkaBridge
自定义资源配置。
8.2. 配置 Kafka
更新 Kafka
自定义资源的 spec
属性来配置 Kafka 部署。
另外,您还可以为 ZooKeeper 和 AMQ Streams Operator 添加配置。各个组件都独立配置通用配置属性,如日志记录和健康检查。
特别重要的配置选项包括:
- 资源请求(CPU / Memory)
- 最多和最小内存分配的 JVM 选项
- 将客户端连接到 Kafka 代理的监听程序(以及客户端的身份验证)
- 身份验证
- 存储
- 机架感知
- 指标
- 用于集群重新平衡的 Cruise Control
要深入了解 Kafka 集群配置选项,请参阅 AMQ Streams 自定义资源 API 参考。
Kafka 版本
Kafka config
的 inter.broker.protocol.version
属性必须是指定的 Kafka 版本 (spec.kafka.version
) 支持的版本。属性表示 Kafka 集群中使用的 Kafka 协议版本。
从 Kafka 3.0.0 开始,当将 inter.broker.protocol.version
设置为 3.0
或更高版本时,log.message.format.version
选项将被忽略,不需要设置。
当升级 Kafka 版本时,需要对 inter.broker.protocol.version
进行更新。如需更多信息,请参阅升级 Kafka。
管理 TLS 证书
在部署 Kafka 时,Cluster Operator 会自动设置和更新 TLS 证书,以便在集群中启用加密和身份验证。如果需要,您可以在续订周期开始前手动续订集群和客户端 CA 证书。您还可以替换集群和客户端 CA 证书使用的密钥。如需更多信息,请参阅 手动续订 CA 证书和替换私钥。
Kafka
自定义资源配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: replicas: 3 1 version: 3.5.0 2 logging: 3 type: inline loggers: kafka.root.logger.level: INFO resources: 4 requests: memory: 64Gi cpu: "8" limits: memory: 64Gi cpu: "12" readinessProbe: 5 initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 jvmOptions: 6 -Xms: 8192m -Xmx: 8192m image: my-org/my-image:latest 7 listeners: 8 - name: plain 9 port: 9092 10 type: internal 11 tls: false 12 configuration: useServiceDnsDomain: true 13 - name: tls port: 9093 type: internal tls: true authentication: 14 type: tls - name: external 15 port: 9094 type: route tls: true configuration: brokerCertChainAndKey: 16 secretName: my-secret certificate: my-certificate.crt key: my-key.key authorization: 17 type: simple config: 18 auto.create.topics.enable: "false" offsets.topic.replication.factor: 3 transaction.state.log.replication.factor: 3 transaction.state.log.min.isr: 2 default.replication.factor: 3 min.insync.replicas: 2 inter.broker.protocol.version: "3.5" storage: 19 type: persistent-claim 20 size: 10000Gi rack: 21 topologyKey: topology.kubernetes.io/zone metricsConfig: 22 type: jmxPrometheusExporter valueFrom: configMapKeyRef: 23 name: my-config-map key: my-key # ... zookeeper: 24 replicas: 3 25 logging: 26 type: inline loggers: zookeeper.root.logger: INFO resources: requests: memory: 8Gi cpu: "2" limits: memory: 8Gi cpu: "2" jvmOptions: -Xms: 4096m -Xmx: 4096m storage: type: persistent-claim size: 1000Gi metricsConfig: # ... entityOperator: 27 tlsSidecar: 28 resources: requests: cpu: 200m memory: 64Mi limits: cpu: 500m memory: 128Mi topicOperator: watchedNamespace: my-topic-namespace reconciliationIntervalSeconds: 60 logging: 29 type: inline loggers: rootLogger.level: INFO resources: requests: memory: 512Mi cpu: "1" limits: memory: 512Mi cpu: "1" userOperator: watchedNamespace: my-topic-namespace reconciliationIntervalSeconds: 60 logging: 30 type: inline loggers: rootLogger.level: INFO resources: requests: memory: 512Mi cpu: "1" limits: memory: 512Mi cpu: "1" kafkaExporter: 31 # ... cruiseControl: 32 # ...
- 1
- 副本节点的数量。
- 2
- Kafka 版本,可按照升级步骤将其改为受支持的版本。
- 3
- Kafka 日志记录器和日志级别直接(
内联
)或通过 ConfigMap 间接添加(外部
)。自定义 Log4j 配置必须放在 ConfigMap 中的log4j.properties
键下。对于 Kafkakafka.root.logger.level
日志记录器,您可以将日志级别设置为 INFO, ERROR, WARN, TRACE, DEBUG,FATAL 或 OFF。 - 4
- 用于保留支持的资源、当前
cpu
和内存
以及限制的请求,以指定可消耗的最大资源。 - 5
- 健康检查以了解何时重启容器(持续)以及容器可以接受流量(就绪状态)。
- 6
- JVM 配置选项,用于优化运行 Kafka 的虚拟机(VM)的性能。
- 7
- ADVANCED OPTION:容器镜像配置,这只在特殊情况下建议使用。
- 8
- 侦听器配置客户端如何通过 bootstrap 地址连接到 Kafka 集群。监听器被配置为 internal 或 external 监听程序,用于来自 OpenShift 集群内部或外的连接。
- 9
- 用于标识监听程序的名称。在 Kafka 集群中必须是唯一的。
- 10
- Kafka 中监听程序使用的端口号。端口号必须在给定的 Kafka 集群中唯一。允许端口号为 9092 及更高版本,但端口 9404 和 9999 除外,它们已用于 Prometheus 和 JMX。根据监听程序类型,端口号可能与连接 Kafka 客户端的端口号不同。
- 11
- 监听程序指定为
internal
或cluster-ip
(使用每个代理的ClusterIP
服务公开 Kafka),或为外部监听程序指定为route
(只限 OpenShift),loadbalancer
,nodeport
或ingress
(只限 Kubernetes)。 - 12
- 为每个监听程序启用 TLS 加密。默认为
false
。需要启用 TLS 加密,将它设置为true
, 对于route
和ingress
类型的监听器。 - 13
- 定义是否分配了包括集群服务后缀(通常为
.cluster.local
)的完全限定 DNS 名称。 - 14
- 侦听器身份验证机制指定为 mTLS、SCRAM-SHA-512 或基于令牌的 OAuth 2.0。
- 15
- 外部监听程序配置指定 Kafka 集群如何在 OpenShift 外部公开,如通过
路由
,loadbalancer
或nodeport
。 - 16
- 由外部 CA (证书颁发机构)管理的 Kafka 侦听器证书的可选配置。
brokerCertChainAndKey
指定包含服务器证书和私钥的Secret
。您可以在任何启用了 TLS 加密的监听程序中配置 Kafka 侦听器证书。 - 17
- 授权在 Kafka 代理上启用 simple、OAUTH 2.0 或 OPA 授权。简单授权使用
AclAuthorizer
Kafka 插件。 - 18
- 代理配置。标准 Apache Kafka 配置可能会提供,仅限于不直接由 AMQ Streams 管理的属性。
- 19
- 持久性卷的存储大小可能会增加,并可以添加额外的卷到 JBOD 存储中。
- 20
- 持久性存储具有额外的配置选项,如用于动态卷置备的存储
id
和class
。 - 21
- 机架感知配置,将副本分散到不同的机架、数据中心或可用性区域。
topologyKey
必须与包含机架 ID 的节点标签匹配。此配置中使用的示例使用标准topology.kubernetes.io/zone
标签指定区。 - 22
- 启用 Prometheus 指标。在本例中,为 Prometheus JMX Exporter (默认指标导出器)配置了指标。
- 23
- 通过 Prometheus JMX Exporter 将指标数据导出到 Grafana 仪表板的规则,通过引用包含 Prometheus JMX exporter 配置的 ConfigMap 来启用。您可以使用对
metricsConfig.valueFrom.configMapKeyRef.key
下包含空文件的 ConfigMap 的引用来启用指标。 - 24
- 特定于 ZooKeeper 的配置,其中包含与 Kafka 配置类似的属性。
- 25
- ZooKeeper 节点数量。ZooKeeper 集群通常有奇数个节点,一般为三个、五个或七个。大多数节点都必须可用,才能保持有效的仲裁。如果 ZooKeeper 集群丢失了其仲裁,它将停止响应客户端,并且 Kafka 代理将停止工作。拥有稳定且高度可用的 ZooKeeper 集群对于 AMQ Streams 至关重要。
- 26
- ZooKeeper 日志记录器和日志级别。
- 27
- Entity Operator 配置,用于指定主题 Operator 和 User Operator 的配置。
- 28
- 实体 Operator TLS sidecar 配置。实体 Operator 使用 TLS sidecar 与 ZooKeeper 安全通信。
- 29
- 指定主题 Operator 日志记录器和日志级别。这个示例使用
内联
日志记录。 - 30
- 指定 User Operator 日志记录器和日志级别。
- 31
- Kafka 导出程序配置。Kafka Exporter 是一个可选组件,用于在特定消费者滞后数据中从 Kafka 代理中提取指标数据。要使 Kafka Exporter 能够正常工作,消费者组需要使用。
- 32
- Cruise Control 的可选配置,用于重新平衡 Kafka 集群。
8.2.1. 使用 Kafka 静态配额插件设置代理限制
使用 Kafka 静态配额插件在 Kafka 集群中的代理上设置吞吐量和存储限制。您可以通过配置 Kafka
资源来启用插件和设置限制。您可以设置字节阈值和存储配额,以在与代理交互的客户端上放置限制。
您可以为制作者和消费者带宽设置字节阈值。总限制在访问代理的所有客户端间分布。例如,您可以为制作者设置字节阈值 40 MBps。如果两个制作者正在运行,它们各自限制为 20 MBps 的吞吐量。
存储配额在软限制和硬限制之间节流 Kafka 磁盘存储限制。限制适用于所有可用磁盘空间。生产者在软限制和硬限制之间逐渐慢。限制可防止磁盘填满速度超过其容量。完整磁盘可能会导致难以重新处理的问题。硬限制是最大存储限制。
对于 JBOD 存储,限制适用于所有磁盘。如果代理使用两个 1 TB 磁盘,并且配额为 1.1 TB,则一个磁盘可能会填满,另一个磁盘将几乎为空。
先决条件
- 管理 Kafka 集群的 Cluster Operator 正在运行。
流程
为
Kafka
资源的config
添加插件属性。此示例配置中显示了插件属性。
Kafka 静态配额插件配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... config: client.quota.callback.class: io.strimzi.kafka.quotas.StaticQuotaCallback 1 client.quota.callback.static.produce: 1000000 2 client.quota.callback.static.fetch: 1000000 3 client.quota.callback.static.storage.soft: 400000000000 4 client.quota.callback.static.storage.hard: 500000000000 5 client.quota.callback.static.storage.check-interval: 5 6
更新资源。
oc apply -f <kafka_configuration_file>
其他资源
8.2.2. 默认 ZooKeeper 配置值
当使用 AMQ Streams 部署 ZooKeeper 时,AMQ Streams 设置的一些默认配置与标准 ZooKeeper 默认值不同。这是因为 AMQ Streams 设置多个 ZooKeeper 属性,其值在 OpenShift 环境中运行 ZooKeeper。
AMQ Streams 中密钥 ZooKeeper 属性的默认配置如下:
属性 | 默认值 | Description |
---|---|---|
| 2000 | 以毫秒为单位的单空长度,它决定了会话超时的长度。 |
| 5 | 在 ZooKeeper 集群中允许后续者获得的最大 tick 数量。 |
| 2 | 后续允许不与 ZooKeeper 集群中的领导不同步的最大 tick 数量。 |
| 1 |
启用 |
| false | 禁用 ZooKeeper admin 服务器的标记。AMQ Streams 不使用 admin 服务器。 |
修改这些默认值作为 Kafka
自定义资源中的 zookeeper.config
可能会影响 ZooKeeper 集群的行为和性能。
8.3. (预览)配置节点池
更新 KafkaNodePool
自定义资源的 spec
属性来配置节点池部署。
节点池功能作为技术预览提供。节点池不会被默认启用,因此您必须在使用 KafkaNodePools 功能门前启用 KafkaNodePools
功能门。
节点池指的是 Kafka 集群中不同的 Kafka 节点组。每个池都有自己的唯一的配置,其中包括副本、角色和存储分配数量的强制设置。
另外,您还可以为以下属性指定值:
-
指定内存和 cpu 请求和限值
的资源
-
模板
为 Pod 和其他 OpenShift 资源指定自定义配置 -
jvmOptions
,用于指定堆大小、运行时和其他选项的自定义 JVM 配置
Kafka
资源代表 Kafka 集群中所有节点的配置。KafkaNodePool
资源仅代表节点池中的节点的配置。如果没有在 KafkaNodePool
中指定配置属性,它将继承自 Kafka
资源。如果在两个资源中设置,则 KafkaNodePool
资源中指定的配置具有优先权。例如,如果节点池和 Kafka 配置都包含 jvmOptions
,则使用节点池配置中指定的值。当在 KafkaNodePool.spec.jvmOptions
中设置了 -Xmx: 1024m
,在 Kafka.spec.kafka.jvmOptions
中设置了 -Xms: 512m
,节点会使用其节点池配置中的值。
Kafka
和 KafkaNodePool
模式的属性不会被合并。为了说明,如果 KafkaNodePool.spec.template
只包含 podSet.metadata.labels
,并且 Kafka.spec.kafka.template
包含 podSet.metadata.annotations
和 pod.metadata.labels
,则 Kafka 配置中的模板值会被忽略,因为节点池配置中有一个模板值。
节点池可用于以 KRaft 模式(使用 Kafka Raft 元数据)运行的 Kafka 集群,或使用 ZooKeeper 进行集群管理。如果使用 KRaft 模式,您可以为节点池中的所有节点指定角色,以作为代理、控制器或两者运行。如果使用 ZooKeeper,则节点必须设置为代理。
KRaft 模式在 Apache Kafka 或 AMQ Streams 中不适用于生产环境。
要深入了解节点池配置选项,请参阅 AMQ Streams 自定义资源 API 参考。
虽然启用节点池的 KafkaNodePools
功能门处于 alpha 阶段,但 KafkaNodePool
资源中的副本和存储配置属性还必须存在于 Kafka
资源中。当使用节点池时,Kafka
资源中的配置会被忽略。同样,在使用 KRaft 模式时,在 Kafka
资源中也必须存在 ZooKeeper 配置属性。这些属性也会被忽略。
使用 ZooKeeper 在集群中节点池的配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: pool-a 1 labels: strimzi.io/cluster: my-cluster 2 spec: replicas: 3 3 roles: - broker 4 storage: 5 type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false resources: 6 requests: memory: 64Gi cpu: "8" limits: memory: 64Gi cpu: "12"
使用 KRaft 模式的集群中节点池的配置示例
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaNodePool
metadata:
name: kraft-dual-role
labels:
strimzi.io/cluster: my-cluster
spec:
replicas: 3
roles: 1
- controller
- broker
storage:
type: jbod
volumes:
- id: 0
type: persistent-claim
size: 20Gi
deleteClaim: false
resources:
requests:
memory: 64Gi
cpu: "8"
limits:
memory: 64Gi
cpu: "12"
- 1
- 节点池中的节点的角色。在本例中,节点具有双角色作为控制器和代理。
Kafka
资源的配置必须适合 KRaft 模式。目前,KRaft 模式有很多限制。
8.3.1. (预览)将 ID 分配给节点池以进行扩展操作
此流程描述了如何在节点池中执行扩展操作时,Cluster Operator 对高级节点 ID 处理使用注解。您可以按顺序使用下一个 ID 来指定要使用的节点 ID,而不是 Cluster Operator。以这种方式管理节点 ID 可提供更多控制。
要添加一系列 ID,您可以为 KafkaNodePool
资源分配以下注解:
-
strimzi.io/next-node-ids
来添加用于新代理的 ID 范围 -
strimzi.io/remove-node-ids
来添加一系列 ID 以删除现有代理
您可以指定单个节点 ID、ID 范围或两者的组合。例如,您可以指定以下 ID 范围: [0, 1, 2, 10-20, 30]
来扩展 Kafka 节点池。通过这种格式,您可以指定单个节点 ID (0
、1
、2
、30
)以及一系列 ID (10-20
)。
在典型的场景中,您可以指定一个 ID 范围来向上扩展和单一节点 ID,以便在缩减时删除特定节点。
在此过程中,我们将扩展注解添加到节点池中,如下所示:
-
为
pool-a
分配一系列 ID 进行扩展 -
为
pool-b
分配一系列 ID 用于缩减
在扩展操作过程中,使用 ID,如下所示:
- 扩展获取新节点范围内的最低可用 ID。
- 缩减会删除范围中具有最高可用 ID 的节点。
如果在节点池中分配的节点 ID 序列中有差距,则要添加的下一个节点会被分配一个填充空白的 ID。
每次扩展操作后,不需要更新注解。任何未使用的 ID 仍对下一个扩展事件有效。
Cluster Operator 允许您以升序或降序指定 ID 范围,以便您可以按照节点扩展的顺序定义它们。例如,在扩展时,您可以指定一个范围,如 [1000-1999]
,并且新节点分配下一个最低 ID: 1000
、1001
、1002
、1003
等。相反,当缩减时,您可以指定一个范围,如 [1999-1000]
,确保具有下一个最高 ID 的节点已被删除 :100
3、1002
、1001
、1000
等。
如果没有使用注解指定 ID 范围,Cluster Operator 遵循其在扩展操作期间处理 ID 的默认行为。节点 ID 以 0 (零)开始,并在 Kafka 集群中按顺序运行。下一个最低 ID 分配给新节点。在集群中填充节点 ID 的差距。这意味着它们可能无法在节点池中按顺序运行。扩展的默认行为是在集群中添加下一个最低可用节点 ID;在缩减时,它会删除具有最高可用节点 ID 的节点。如果分配的 ID 范围被误格式化,则扩展范围没有 ID,或者缩减范围不适用于任何正在使用的节点,则应用默认方法。
流程
使用 ID 为节点池添加在扩展或缩减时要使用的 ID,如下例所示。
用于向上扩展的 ID 会被分配给节点
池池
:为扩展分配 ID
oc annotate kafkanodepool pool-a strimzi.io/next-node-ids="[0,1,2,10-20,30]"
将节点添加到
池
时使用此范围内的最低可用 ID。用于缩减的 ID 分配给节点池
pool-b
:为缩减分配 ID
oc annotate kafkanodepool pool-b strimzi.io/remove-node-ids="[60-50,9,8,7]"
缩减
pool-b
时会删除此范围内的最高可用 ID。现在,您可以扩展节点池。
如需更多信息,请参阅以下:
在协调时,如果注解被错误格式化,则会提供一个警告。
8.3.2. (预览)将节点添加到节点池中
这个步骤描述了如何扩展节点池来添加新节点。
在此过程中,我们从三个节点池( 池
)开始:
节点池中的 Kafka 节点
NAME READY STATUS RESTARTS my-cluster-pool-a-kafka-0 1/1 Running 0 my-cluster-pool-a-kafka-1 1/1 Running 0 my-cluster-pool-a-kafka-2 1/1 Running 0
节点 ID 在创建时附加到节点的名称中。我们添加节点 my-cluster-pool-a-kafka-3
,节点 ID 为 3
。
在此过程中,保存分区副本的节点 ID 会改变。考虑引用节点 ID 的任何依赖项。
先决条件
- 必须部署 Cluster Operator。
(可选)要扩展操作 ,您可以指定要使用的节点 ID 范围。
如果您为操作分配了一系列节点 ID,正在添加的节点 ID 由给定的节点序列决定。否则,会使用集群中的最低可用节点 ID。
流程
在节点池中创建新节点。
例如,节点池
pool-a
有三个副本。我们通过增加副本数量来添加节点:oc scale kafkanodepool pool-a --replicas=4
检查部署的状态,并等待节点池中的 pod 创建,并且状态为
READY
。oc get pods -n <my_cluster_operator_namespace>
输出显示节点池中的四个 Kafka 节点
NAME READY STATUS RESTARTS my-cluster-pool-a-kafka-0 1/1 Running 0 my-cluster-pool-a-kafka-1 1/1 Running 0 my-cluster-pool-a-kafka-2 1/1 Running 0 my-cluster-pool-a-kafka-3 1/1 Running 0
在增加节点池中的节点数后重新分配分区。
在扩展节点池后,您可以使用 Cruise Control
add-brokers
模式将分区副本从现有代理移到新添加的代理中。
8.3.3. (预览)从节点池中删除节点
这个步骤描述了如何缩减节点池来删除节点。
在此过程中,我们从四个节点池( 池
)开始:
节点池中的 Kafka 节点
NAME READY STATUS RESTARTS my-cluster-pool-a-kafka-0 1/1 Running 0 my-cluster-pool-a-kafka-1 1/1 Running 0 my-cluster-pool-a-kafka-2 1/1 Running 0 my-cluster-pool-a-kafka-3 1/1 Running 0
节点 ID 在创建时附加到节点的名称中。我们删除节点 my-cluster-pool-a-kafka-3
,节点 ID 为 3
。
在此过程中,保存分区副本的节点 ID 会改变。考虑引用节点 ID 的任何依赖项。
先决条件
- 必须部署 Cluster Operator。
(可选)为了缩减操作 ,您可以指定要在操作中使用的节点 ID 范围。
如果您为操作分配了一系列节点 ID,则要删除的节点的 ID 由给定的节点序列决定。否则,节点池中具有最高可用 ID 的节点会被删除。
流程
在减少节点池中的节点数前重新分配分区。
在缩减节点池前,您可以使用 Cruise Control
remove-brokers
模式将分区副本移出要删除的代理。在重新分配过程完成后,删除的节点没有实时分区,从而减少节点池中的 Kafka 节点数量。
例如,节点池
pool-a
有四个副本。我们通过减少副本数来删除节点:oc scale kafkanodepool pool-a --replicas=3
输出显示节点池中的三个 Kafka 节点
NAME READY STATUS RESTARTS my-cluster-pool-b-kafka-0 1/1 Running 0 my-cluster-pool-b-kafka-1 1/1 Running 0 my-cluster-pool-b-kafka-2 1/1 Running 0
8.3.4. (预览)在节点池之间移动节点
这个步骤描述了如何在不停机的情况下在源和目标 Kafka 节点池之间移动节点。您可以在目标节点池中创建新节点并重新分配分区,以便从源节点池中的旧节点移动数据。当新节点上的副本同步时,您可以删除旧节点。
在此过程中,我们从两个节点池开始:
-
具有三个副本的池
是目标节点池 -
带有四个副本的
pool-b
是源节点池
我们扩展 pool-a
,并重新分配分区并缩减 pool-b
,这会导致以下内容:
-
pool-a
带有四个副本 -
带有三个副本的
pool-b
在此过程中,保存分区副本的节点 ID 会改变。考虑引用节点 ID 的任何依赖项。
先决条件
- 必须部署 Cluster Operator。
(可选)要扩展和缩减操作 ,您可以指定要使用的节点 ID 范围。
如果您为操作分配了节点 ID,正在添加或删除的节点 ID 由给定的节点序列决定。否则,在添加节点时会使用集群中可用的最低节点 ID;并删除节点池中可用 ID 的节点。
流程
在目标节点池中创建新节点。
例如,节点池
pool-a
有三个副本。我们通过增加副本数量来添加节点:oc scale kafkanodepool pool-a --replicas=4
检查部署的状态,并等待节点池中的 pod 创建,并且状态为
READY
。oc get pods -n <my_cluster_operator_namespace>
输出显示目标节点池中的四个 Kafka 节点
NAME READY STATUS RESTARTS my-cluster-pool-a-kafka-0 1/1 Running 0 my-cluster-pool-a-kafka-1 1/1 Running 0 my-cluster-pool-a-kafka-4 1/1 Running 0 my-cluster-pool-a-kafka-5 1/1 Running 0
节点 ID 在创建时附加到节点的名称中。我们添加节点
my-cluster-pool-a-kafka-5
,其节点 ID 为5
。将分区从旧节点重新分配给新节点。
在缩减源节点池前,您可以使用 Cruise Control
remove-brokers
模式将分区副本移出要删除的代理。重新分配过程完成后,减少源节点池中的 Kafka 节点数量。
例如,节点池
pool-b
具有四个副本。我们通过减少副本数来删除节点:oc scale kafkanodepool pool-b --replicas=3
池中具有最高 ID 的节点已被删除。
输出显示源节点池中的三个 Kafka 节点
NAME READY STATUS RESTARTS my-cluster-pool-b-kafka-2 1/1 Running 0 my-cluster-pool-b-kafka-3 1/1 Running 0 my-cluster-pool-b-kafka-6 1/1 Running 0
8.3.5. (预览)迁移现有 Kafka 集群以使用 Kafka 节点池
这个步骤描述了如何迁移现有 Kafka 集群以使用 Kafka 节点池。更新 Kafka 集群后,您可以使用节点池来管理每个池中的节点配置。
虽然启用节点池的 KafkaNodePools
功能门处于 alpha 阶段,但 KafkaNodePool
资源中的副本和存储配置还必须存在于 Kafka
资源中。使用节点池时会忽略配置。
流程
创建新的
KafkaNodePool
资源。-
将资源命名为
kafka
。 -
将
strimzi.io/cluster
标签指向现有的Kafka
资源。 - 设置副本数和存储配置以匹配您当前的 Kafka 集群。
-
将角色设置为
代理
。
迁移 Kafka 集群的节点池配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaNodePool metadata: name: kafka labels: strimzi.io/cluster: my-cluster spec: replicas: 3 roles: - broker storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false
-
将资源命名为
应用
KafkaNodePool
资源:oc apply -f <node_pool_configuration_file>
通过应用此资源,您可以将 Kafka 切换到使用节点池。
没有更改或滚动更新和资源与之前的资源相同。
更新 Cluster Operator 配置中的
STRIMZI_FEATURE_GATES
环境变量,使其包含+KafkaNodePools
。env: - name: STRIMZI_FEATURE_GATES value: +KafkaNodePools
使用
strimzi.io/node-pools: enabled
注解,在Kafka
资源中启用KafkaNodePools
功能门。使用 ZooKeeper 在集群中节点池的配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster annotations: strimzi.io/node-pools: enabled spec: kafka: version: 3.5.0 replicas: 3 # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false
应用
Kafka
资源:oc apply -f <kafka_configuration_file>
8.4. 配置实体 Operator
使用 Kafka.spec
中的 entityOperator
属性来配置实体 Operator。Entity Operator 用于管理在 Kafka 集群中运行的与 Kafka 相关的实体。它由以下 Operator 组成:
- 管理 Kafka 主题的主题 Operator
- 用于管理 Kafka 用户的用户 Operator
通过配置 Kafka
资源,Cluster Operator 可以部署 Entity Operator,包括一个或多个 Operator。部署后,Operator 会自动配置为处理 Kafka 集群的主题和用户。
每个 operator 只能监控单个命名空间。如需更多信息,请参阅 第 1.2.1 节 “在 OpenShift 命名空间中观察 AMQ Streams 资源”。
entityOperator
属性支持多个子属性:
-
tlsSidecar
-
topicOperator
-
userOperator
-
模板
tlsSidecar
属性包含 TLS sidecar 容器的配置,用于与 ZooKeeper 通信。
template
属性包含 Entity Operator pod 的配置,如标签、注解、关联性和容限。有关配置模板的详情,请参考 第 8.16 节 “自定义 OpenShift 资源”。
topicOperator
属性包含主题 Operator 的配置。当缺少这个选项时,在没有 Topic Operator 的情况下部署 Entity Operator。
userOperator
属性包含 User Operator 的配置。当缺少这个选项时,会在没有 User Operator 的情况下部署 Entity Operator。
有关配置实体 Operator 的属性的更多信息,请参阅 EntityUserOperatorSpec
schema 参考。
启用这两个 Operator 的基本配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... entityOperator: topicOperator: {} userOperator: {}
如果将空对象({}
)用于 topicOperator
和 userOperator
,则所有属性都使用其默认值。
当缺少 topicOperator
和 userOperator
属性时,实体 Operator 不会被部署。
8.4.1. 配置主题 Operator
使用 Kafka.spec.entityOperator
中的 topicOperator
属性来配置 Topic Operator。
如果您使用单向主题管理的预览,则不会使用以下属性,并会被忽略: Kafka.spec.entityOperator.zookeeperSessionTimeoutSeconds
和 Kafka.spec.entityOperator.topicOperator.topicMetadataMaxAttempts
。有关单向主题管理的详情,请参考 第 9.1 节 “主题管理模式”。
支持以下属性:
watchedNamespace
-
主题 Operator 监视
KafkaTopic
资源的 OpenShift 命名空间。default 是部署 Kafka 集群的命名空间。 reconciliationIntervalSeconds
-
定期协调之间的间隔(以秒为单位)。默认
120
。 zookeeperSessionTimeoutSeconds
-
ZooKeeper 会话超时(以秒为单位)。默认
18
。 topicMetadataMaxAttempts
-
从 Kafka 获取主题元数据的尝试次数。每次尝试之间的时间都定义为指数避退。当主题创建可能会因为分区或副本数增加时,请考虑增加这个值。默认
6
。 image
-
image
属性可用于配置要使用的容器镜像。如需更多信息,请参阅有关配置镜像
属性 提供的信息。 资源
-
resources
属性配置分配给 Topic Operator 的资源数量。您可以为内存和
cpu
资源指定请求和限值。请求应该足以确保操作器的稳定性能。 logging
-
logging
属性配置 Topic Operator 的日志记录。如需更多信息,请参阅 主题 Operator 日志记录 上提供的信息。
主题 Operator 配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... entityOperator: # ... topicOperator: watchedNamespace: my-topic-namespace reconciliationIntervalSeconds: 60 resources: requests: cpu: "1" memory: 500Mi limits: cpu: "1" memory: 500Mi # ...
8.4.2. 配置用户 Operator
使用 Kafka.spec.entityOperator
中的 userOperator
属性来配置 User Operator。支持以下属性:
watchedNamespace
-
User Operator 监视
KafkaUser
资源的 OpenShift 命名空间。default 是部署 Kafka 集群的命名空间。 reconciliationIntervalSeconds
-
定期协调之间的间隔(以秒为单位)。默认
120
。 image
-
image
属性可用于配置要使用的容器镜像。如需更多信息,请参阅有关配置镜像
属性 提供的信息。 资源
-
resources
属性配置分配给 User Operator 的资源数量。您可以为内存和
cpu
资源指定请求和限值。请求应该足以确保操作器的稳定性能。 logging
-
logging
属性配置 User Operator 的日志记录。如需更多信息,请参阅 User Operator 日志记录 上提供的信息。 secretPrefix
-
secretPrefix
属性在 KafkaUser 资源创建的所有 Secret 的名称中添加前缀。例如,secretPrefix: kafka-
会将所有 Secret 名称的前缀为kafka-
。因此,名为my-user
的 KafkaUser 会创建一个名为kafka-my-user
的 Secret。
User Operator 配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... zookeeper: # ... entityOperator: # ... userOperator: watchedNamespace: my-user-namespace reconciliationIntervalSeconds: 60 resources: requests: cpu: "1" memory: 500Mi limits: cpu: "1" memory: 500Mi # ...
8.5. 配置 Cluster Operator
使用环境变量配置 Cluster Operator。在 Deployment
配置文件中,指定 Cluster Operator 的容器镜像的环境变量。
AMQ Streams 发行工件提供的 Deployment
配置文件为 install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
。
您可以使用以下环境变量来配置 Cluster Operator。如果您以待机模式运行 Cluster Operator 副本,则需要额外的 环境变量来启用领导选举机制。
STRIMZI_NAMESPACE
以逗号分隔的 Operator 运行的命名空间列表。如果没有设置,则为空字符串,或设置为
*
,Cluster Operator 在所有命名空间中运行。Cluster Operator 部署可能会使用 Downward API 来自动将其设置为部署了 Cluster Operator 的命名空间。
Cluster Operator 命名空间的配置示例
env: - name: STRIMZI_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
- 可选,默认为 120000 ms。定期协调 之间的间隔,以毫秒为单位。
STRIMZI_OPERATION_TIMEOUT_MS
- 可选,默认的 300000 ms。内部操作的超时时间,以毫秒为单位。当在常规 OpenShift 操作中使用 AMQ Streams 的时间超过通常时,增加这个值(例如下载 Docker 镜像的速度较慢)。
STRIMZI_ZOOKEEPER_ADMIN_SESSION_TIMEOUT_MS
-
可选,默认的 10000 ms。Cluster Operator 的 ZooKeeper admin 客户端的会话超时,以毫秒为单位。如果 Cluster Operator 的 ZooKeeper 请求因为超时问题定期失败,请增加这个值。通过
maxSessionTimeout
配置在 ZooKeeper 服务器端设置最大允许会话时间。默认情况下,最大会话超时值为 20 倍,即默认tickTime
(其默认值为 2000)为 40000 ms。如果您需要更高的超时,请更改maxSessionTimeout
ZooKeeper 服务器配置值。 STRIMZI_OPERATIONS_THREAD_POOL_SIZE
- 可选,默认 10。worker 线程池大小,用于各种异步和阻止由 Cluster Operator 运行的操作。
STRIMZI_OPERATOR_NAME
- 可选,默认为 pod 的主机名。在发出 OpenShift 事件时,Operator 名称标识 AMQ Streams 实例。
STRIMZI_OPERATOR_NAMESPACE
运行 Cluster Operator 的命名空间的名称。不要手动配置此变量。使用 Downward API。
env: - name: STRIMZI_OPERATOR_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
STRIMZI_OPERATOR_NAMESPACE_LABELS
可选。运行 AMQ Streams Cluster Operator 的命名空间标签。使用命名空间标签在 网络策略 中配置命名空间选择器。网络策略只允许 AMQ Streams Cluster Operator 从带有这些标签的命名空间中访问操作对象。如果没有设置,则网络策略中的命名空间选择器被配置为允许从 OpenShift 集群中的任何命名空间中访问 Cluster Operator。
env: - name: STRIMZI_OPERATOR_NAMESPACE_LABELS value: label1=value1,label2=value2
STRIMZI_LABELS_EXCLUSION_PATTERN
可选,默认的正则表达式为
^app.kubernetes.io/(?!part-of).*
。用于过滤从主自定义资源传播到其子资源的正则表达式排除模式。标签排除过滤器不适用于模板部分中的标签,如spec.kafka.template.pod.metadata.labels
。env: - name: STRIMZI_LABELS_EXCLUSION_PATTERN value: "^key1.*"
STRIMZI_CUSTOM_{COMPONENT_NAME}_LABELS
可选。一个或多个自定义标签,应用到
{COMPONENT_NAME}
自定义资源创建的所有 pod。Cluster Operator 在创建自定义资源或下一次协调时会标记 pod。标签可应用到以下组件:
-
KAFKA
-
KAFKA_CONNECT
-
KAFKA_CONNECT_BUILD
-
ZOOKEEPER
-
ENTITY_OPERATOR
-
KAFKA_MIRROR_MAKER2
-
KAFKA_MIRROR_MAKER
-
CRUISE_CONTROL
-
KAFKA_BRIDGE
-
KAFKA_EXPORTER
-
STRIMZI_CUSTOM_RESOURCE_SELECTOR
可选。用于过滤 Cluster Operator 处理的自定义资源的标签选择器。Operator 仅在设置了指定标签的自定义资源上运行。Operator 不会看到没有这些标签的资源。标签选择器适用于
Kafka
,KafkaConnect
,KafkaBridge
,KafkaMirrorMaker
, 和KafkaMirrorMaker2
资源。只有在对应的 Kafka 和 Kafka Connect 集群具有匹配的标签时,才会执行KafkaRebalance
和KafkaConnector
资源。env: - name: STRIMZI_CUSTOM_RESOURCE_SELECTOR value: label1=value1,label2=value2
STRIMZI_KAFKA_IMAGES
-
必需。从 Kafka 版本到包含该版本的 Kafka 代理的对应 Docker 镜像的映射。所需的语法为空格或以逗号分隔的 <
version> = <image>
对。例如3.4.0=registry.redhat.io/amq-streams/kafka-34-rhel8:2.5.1, 3.5.0=registry.redhat.io/amq-streams/kafka-35-rhel8:2.5.1
。当指定了属性Kafka.spec.kafka.version
但没有在Kafka
资源的Kafka.spec.kafka.image
时使用这个。 STRIMZI_DEFAULT_KAFKA_INIT_IMAGE
-
可选,默认
registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.5.1
。如果没有将镜像指定为Kafka
资源中的kafka-init-image
,则用作 init 容器的默认镜像名称。init 容器在代理进行初始配置工作之前启动,如机架支持。 STRIMZI_KAFKA_CONNECT_IMAGES
-
必需。从 Kafka 版本映射到那个版本的 Kafka Connect 的对应 Docker 镜像。所需的语法为空格或以逗号分隔的 <
version> = <image>
对。例如3.4.0=registry.redhat.io/amq-streams/kafka-34-rhel8:2.5.1, 3.5.0=registry.redhat.io/amq-streams/kafka-35-rhel8:2.5.1
。当指定KafkaConnect.spec.version
属性但没有KafkaConnect.spec.image
时,会使用它。 STRIMZI_KAFKA_MIRROR_MAKER_IMAGES
-
必需。此版本从 Kafka 版本到 MirrorMaker 的对应 Docker 镜像的映射。所需的语法为空格或以逗号分隔的 <
version> = <image>
对。例如3.4.0=registry.redhat.io/amq-streams/kafka-34-rhel8:2.5.1, 3.5.0=registry.redhat.io/amq-streams/kafka-35-rhel8:2.5.1
。当指定KafkaMirrorMaker.spec.version
属性但没有KafkaMirrorMaker.spec.image
时,会使用它。 STRIMZI_DEFAULT_TOPIC_OPERATOR_IMAGE
-
可选,默认
registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.5.1
。如果没有将镜像指定为Kafka
资源中的Kafka.spec.entityOperator.topicOperator.image
,则部署 Topic Operator 时使用的镜像名称作为默认镜像。 STRIMZI_DEFAULT_USER_OPERATOR_IMAGE
-
可选,默认
registry.redhat.io/amq-streams/strimzi-rhel8-operator:2.5.1
。如果没有将镜像指定为 Kafka 资源中的Kafka.spec.entityOperator.userOperator.image
,则部署 User Operator 时使用的镜像名称
。 STRIMZI_DEFAULT_TLS_SIDECAR_ENTITY_OPERATOR_IMAGE
-
可选,默认
registry.redhat.io/amq-streams/kafka-35-rhel8:2.5.1
。如果没有将镜像指定为 Kafka 资源中的Kafka.spec.entityOperator.tlsSidecar.image
,则用作实体 Operator 的 sidecar 容器时使用的镜像名称
。sidecar 提供 TLS 支持。 STRIMZI_IMAGE_PULL_POLICY
-
可选。应用到 Cluster Operator 管理的所有 pod 中的容器的
ImagePullPolicy
。有效值为Always
、ifNotP
resent 和Never
。如果未指定,则使用 OpenShift 默认值。更改策略将导致所有 Kafka、Kafka Connect 和 Kafka MirrorMaker 集群的滚动更新。 STRIMZI_IMAGE_PULL_SECRETS
-
可选。以逗号分隔的
Secret
名称列表。此处引用的 secret 包含从中拉取容器镜像的容器 registry 的凭证。secret 在 Cluster Operator 创建的所有 pod 的imagePullSecrets
属性中指定。更改此列表会导致所有 Kafka、Kafka Connect 和 Kafka MirrorMaker 集群的滚动更新。 STRIMZI_KUBERNETES_VERSION
可选。覆盖从 API 服务器检测到的 OpenShift 版本信息。
OpenShift 版本覆盖配置示例
env: - name: STRIMZI_KUBERNETES_VERSION value: | major=1 minor=16 gitVersion=v1.16.2 gitCommit=c97fe5036ef3df2967d086711e6c0c405941e14b gitTreeState=clean buildDate=2019-10-15T19:09:08Z goVersion=go1.12.10 compiler=gc platform=linux/amd64
KUBERNETES_SERVICE_DNS_DOMAIN
可选。覆盖默认的 OpenShift DNS 域名后缀。
默认情况下,OpenShift 集群中分配的服务具有使用默认后缀
cluster.local
的 DNS 域名。例如,对于 broker kafka-0 :
<cluster-name>-kafka-0.<cluster-name>-kafka-brokers.<namespace>.svc.cluster.local
DNS 域名添加到用于主机名验证的 Kafka 代理证书中。
如果您在集群中使用不同的 DNS 域名后缀,请将
KUBERNETES_SERVICE_DNS_DOMAIN
环境变量改为您用来与 Kafka 代理建立连接。STRIMZI_CONNECT_BUILD_TIMEOUT_MS
- 可选,默认的 300000 ms。使用额外连接器构建新 Kafka Connect 镜像的超时时间,以毫秒为单位。当使用 AMQ Streams 来构建包含许多连接器的容器镜像或使用较慢的容器 registry 时,请考虑增加这个值。
STRIMZI_NETWORK_POLICY_GENERATION
可选,默认为
true
。资源的网络策略。网络策略允许 Kafka 组件间的连接。将此环境变量设置为
false
以禁用网络策略生成。例如,您可能需要使用自定义网络策略,您可能需要执行此操作。自定义网络策略可让更多地控制组件间的连接。STRIMZI_DNS_CACHE_TTL
-
可选,默认的
30
。在本地 DNS 解析器中缓存成功名称查找的秒数。任何负值都表示缓存永久缓存。zero 意味着不会缓存,这可用于避免因为应用长缓存策略而连接错误。 STRIMZI_POD_SET_RECONCILIATION_ONLY
-
可选,默认为
false
。当设置为true
时,Cluster Operator 只协调StrimziPodSet
资源,以及其它自定义资源(Kafka
、KafkaConnect
等)的任何更改。此模式可用于确保根据需要重新创建 pod,但不会对集群进行其他更改。 STRIMZI_FEATURE_GATES
- 可选。启用或禁用由 功能门控制的功能和功能。
STRIMZI_POD_SECURITY_PROVIDER_CLASS
-
可选。配置可插拔
PodSecurityProvider
类,可用于为 Pod 和容器提供安全上下文配置。
8.5.1. 使用网络策略限制对 Cluster Operator 的访问
使用 STRIMZI_OPERATOR_NAMESPACE_LABELS
环境变量,使用命名空间标签为 Cluster Operator 建立网络策略。
Cluster Operator 可以在与它管理的资源相同的命名空间中运行,也可以在单独的命名空间中运行。默认情况下,STRIMZI_OPERATOR_NAMESPACE
环境变量被配置为使用 Downward API 查找运行 Cluster Operator 的命名空间。如果 Cluster Operator 在与资源相同的命名空间中运行,则 AMQ Streams 只需要本地访问。
如果 Cluster Operator 在单独命名空间中运行,则 OpenShift 集群中的任何命名空间都可以访问 Cluster Operator,除非配置了网络策略。通过添加命名空间标签,对 Cluster Operator 的访问仅限于指定的命名空间。
为 Cluster Operator 部署配置的网络策略
#... env: # ... - name: STRIMZI_OPERATOR_NAMESPACE_LABELS value: label1=value1,label2=value2 #...
8.5.2. 配置 Cluster Operator 的定期协调
使用 STRIMZI_FULL_RECONCILIATION_INTERVAL_MS
变量设置 Cluster Operator 定期协调的时间间隔。将其值替换为所需间隔(以毫秒为单位)。
为 Cluster Operator 部署配置的协调周期
#... env: # ... - name: STRIMZI_FULL_RECONCILIATION_INTERVAL_MS value: "120000" #...
Cluster Operator 对从 OpenShift 集群接收的适用集群资源的所有通知做出反应。如果操作器没有运行,或者因为某种原因没有收到通知,资源将从正在运行的 OpenShift 集群状态不同步。为了正确处理故障转移,Cluster Operator 会执行定期协调过程,以便它可以将资源的状态与当前集群部署进行比较,以便在所有这些部署之间具有一致的状态。
其他资源
8.5.3. 使用领导选举机制运行多个 Cluster Operator 副本
默认 Cluster Operator 配置可让领导选举机制运行 Cluster Operator 的多个并行副本。一个副本被选为活跃领导值,并运行部署的资源。其他副本以待机模式运行。当领导停止或失败时,其中一个备用副本被选为新领导,并开始操作部署的资源。
默认情况下,AMQ Streams 使用单个 Cluster Operator 副本运行,该副本始终是领导副本。当单个 Cluster Operator 副本停止或失败时,OpenShift 会启动新的副本。
运行具有多个副本的 Cluster Operator 并不重要。但是,在出现重大故障导致的大规模中断时,在待机时具有副本非常有用。例如,假设多个 worker 节点或整个可用区失败。故障可能会导致 Cluster Operator pod 和许多 Kafka pod 同时停机。如果后续的 pod 调度导致资源丢失,这可能会在运行单个 Cluster Operator 时延迟操作。
8.5.3.1. 为 Cluster Operator 副本启用领导选举机制
在运行额外的 Cluster Operator 副本时,配置领导选举环境变量。支持以下环境变量:
STRIMZI_LEADER_ELECTION_ENABLED
-
可选,
默认禁用
(默认为 )。启用或禁用领导选举机制,允许额外的 Cluster Operator 副本在待机上运行。
默认禁用领导选举机制。只有在安装时应用此环境变量时才启用。
STRIMZI_LEADER_ELECTION_LEASE_NAME
-
启用领导选举机制时需要。用于领导选举的 OpenShift
Lease
资源的名称。 STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE
启用领导选举机制时需要。创建用于领导选举 OpenShift
Lease
资源的命名空间。您可以使用 Downward API 将其配置为部署 Cluster Operator 的命名空间。env: - name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace
STRIMZI_LEADER_ELECTION_IDENTITY
启用领导选举机制时需要。配置在领导选举过程中使用的给定 Cluster Operator 实例的身份。对于每个 operator 实例,身份必须是唯一的。您可以使用 Downward API 将其配置为部署 Cluster Operator 的 pod 的名称。
env: - name: STRIMZI_LEADER_ELECTION_IDENTITY valueFrom: fieldRef: fieldPath: metadata.name
STRIMZI_LEADER_ELECTION_LEASE_DURATION_MS
- 可选,默认 15000 ms。指定获取租期有效的持续时间。
STRIMZI_LEADER_ELECTION_RENEW_DEADLINE_MS
- 可选,默认的 10000 ms。指定领导应尝试维护领导期。
STRIMZI_LEADER_ELECTION_RETRY_PERIOD_MS
- 可选,默认的 2000 ms。指定领导到租期锁定的更新频率。
8.5.3.2. 配置 Cluster Operator 副本
要以待机模式运行额外的 Cluster Operator 副本,您需要增加副本数并启用领导选举机制。要配置领导选举机制,请使用领导选举环境变量。
要进行所需的更改,请配置位于 install/cluster-operator/
中的以下 Cluster Operator 安装文件:
- 060-Deployment-strimzi-cluster-operator.yaml
- 022-ClusterRole-strimzi-cluster-operator-role.yaml
- 022-RoleBinding-strimzi-cluster-operator.yaml
领导选举具有自己的 ClusterRole
和 RoleBinding
RBAC 资源,这些资源以 Cluster Operator 运行的命名空间为目标,而不是它监视的命名空间。
默认部署配置在与 Cluster Operator 相同的命名空间中创建一个名为 strimzi-cluster-operator
的 Lease
资源。Cluster Operator 使用租期来管理领导选举机制。RBAC 资源提供使用 Lease
资源的权限。如果您使用不同的 Lease
名称或命名空间,请相应地更新 ClusterRole
和 RoleBinding
文件。
先决条件
-
您需要具有权限的帐户来创建和管理
CustomResourceDefinition
和 RBAC (ClusterRole
和RoleBinding
)资源。
流程
编辑用于部署 Cluster Operator 的 Deployment
资源,该资源在 060-Deployment-strimzi-cluster-operator.yaml
文件中定义。
将
replicas
属性从 default (1)更改为与所需副本数匹配的值。增加 Cluster Operator 副本的数量
apiVersion: apps/v1 kind: Deployment metadata: name: strimzi-cluster-operator labels: app: strimzi spec: replicas: 3
检查是否设置了 leader election
env
属性。如果没有设置,请配置它们。
要启用领导选举机制,
STRIMZI_LEADER_ELECTION_ENABLED
必须设置为true
(默认)。在本例中,租期的名称改为
my-strimzi-cluster-operator
。为 Cluster Operator 配置领导选举环境变量
# ... spec containers: - name: strimzi-cluster-operator # ... env: - name: STRIMZI_LEADER_ELECTION_ENABLED value: "true" - name: STRIMZI_LEADER_ELECTION_LEASE_NAME value: "my-strimzi-cluster-operator" - name: STRIMZI_LEADER_ELECTION_LEASE_NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: STRIMZI_LEADER_ELECTION_IDENTITY valueFrom: fieldRef: fieldPath: metadata.name
有关可用环境变量的描述,请参阅 第 8.5.3.1 节 “为 Cluster Operator 副本启用领导选举机制”。
如果您为领导选举机制中使用的
Lease
资源指定了不同的名称或命名空间,请更新 RBAC 资源。(可选)在
022-ClusterRole-strimzi-cluster-operator-role.yaml
文件中编辑ClusterRole
资源。使用
Lease
资源的名称更新resourceNames
。将 ClusterRole 引用更新为租期
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-cluster-operator-leader-election labels: app: strimzi rules: - apiGroups: - coordination.k8s.io resourceNames: - my-strimzi-cluster-operator # ...
(可选)在
022-RoleBinding-strimzi-cluster-operator.yaml
文件中编辑RoleBinding
资源。使用
Lease
资源的名称以及创建它的命名空间更新subjects.name
和subjects.namespace
。将 RoleBinding 引用更新为租期
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: strimzi-cluster-operator-leader-election labels: app: strimzi subjects: - kind: ServiceAccount name: my-strimzi-cluster-operator namespace: myproject # ...
部署 Cluster Operator:
oc create -f install/cluster-operator -n myproject
检查部署的状态:
oc get deployments -n myproject
输出显示部署名称和就绪度
NAME READY UP-TO-DATE AVAILABLE strimzi-cluster-operator 3/3 3 3
READY
显示就绪/预期的副本数。当AVAILABLE
输出显示正确的副本数时,部署可以成功。
8.5.4. 配置 Cluster Operator HTTP 代理设置
如果您在 HTTP 代理后运行 Kafka 集群,您仍然可以在集群内和移出数据。例如,您可以使用连接器运行 Kafka Connect,该连接器从代理外推送和拉取镜像。或者,您可以使用代理与授权服务器连接。
配置 Cluster Operator 部署以指定代理环境变量。Cluster Operator 接受标准代理配置(HTTP_PROXY
、HTTPS_PROXY
和 NO_PROXY
)作为环境变量。代理设置适用于所有 AMQ Streams 容器。
代理地址的格式为 http://<ip_address>:<port_number>。要使用名称和密码设置代理,格式为 http://<username>:<password>@<ip-address>:<port_number>。
先决条件
-
您需要具有权限的帐户来创建和管理
CustomResourceDefinition
和 RBAC (ClusterRole
和RoleBinding
)资源。
流程
要在 Cluster Operator 中添加代理环境变量,请更新其
部署
配置 (install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
)。Cluster Operator 的代理配置示例
apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: # ... - name: "HTTP_PROXY" value: "http://proxy.com" 1 - name: "HTTPS_PROXY" value: "https://proxy.com" 2 - name: "NO_PROXY" value: "internal.com, other.domain.com" 3 # ...
或者,直接编辑
部署
:oc edit deployment strimzi-cluster-operator
如果您更新了 YAML 文件而不是直接编辑
Deployment
,请应用更改:oc create -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
其他资源
8.5.5. 使用 Cluster Operator 配置禁用 FIPS 模式
当在启用了 FIPS 的 OpenShift 集群中运行时,AMQ Streams 会自动切换到 FIPS 模式。通过在 Cluster Operator 的部署配置中将 FIPS_MODE
环境变量设置为 禁用
FIPS 模式。禁用 FIPS 模式后,AMQ Streams 会在 OpenJDK 中为所有组件禁用 FIPS。禁用 FIPS 模式后,AMQ Streams 不兼容 FIPS。AMQ Streams operator 以及所有操作对象的运行方式与在启用了 FIPS 的 OpenShift 集群中运行的方式相同。
流程
要在 Cluster Operator 中禁用 FIPS 模式,更新其
部署
配置install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
) 并增加FIPS_MODE
环境变量。Cluster Operator 的 FIPS 配置示例
apiVersion: apps/v1 kind: Deployment spec: # ... template: spec: serviceAccountName: strimzi-cluster-operator containers: # ... env: # ... - name: "FIPS_MODE" value: "disabled" 1 # ...
- 1
- 禁用 FIPS 模式。
或者,直接编辑
部署
:oc edit deployment strimzi-cluster-operator
如果您更新了 YAML 文件而不是直接编辑
Deployment
,请应用更改:oc apply -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
8.6. 配置 Kafka Connect
更新 KafkaConnect
自定义资源的 spec
属性来配置 Kafka Connect 部署。
使用 Kafka Connect 为 Kafka 集群设置外部数据连接。使用 KafkaConnect
资源的属性来配置 Kafka Connect 部署。
要深入了解 Kafka Connect 集群配置选项,请参阅 AMQ Streams 自定义资源 API 参考。
KafkaConnector 配置
KafkaConnector
资源允许您以 OpenShift 原生的方式创建和管理 Kafka Connect 的连接器实例。
在 Kafka Connect 配置中,您可以通过添加 strimzi.io/use-connector-resources
注解来为 Kafka Connect 集群启用 KafkaConnectors。您还可以添加 构建配置
,以便 AMQ Streams 自动使用您数据连接所需的连接器插件构建容器镜像。Kafka Connect 连接器的外部配置通过 externalConfiguration
属性指定。
要管理连接器,您可以使用 KafkaConnector
自定义资源或 Kafka Connect REST API。KafkaConnector
资源必须部署到它们所链接的 Kafka Connect 集群相同的命名空间中。有关使用这些方法创建、重新配置或删除连接器的更多信息,请参阅 添加连接器。
连接器配置作为 HTTP 请求的一部分传递给 Kafka Connect,并存储在 Kafka 本身中。ConfigMap 和机密是用于存储配置和机密数据的标准 OpenShift 资源。您可以使用 ConfigMap 和 Secret 来配置连接器的特定元素。然后,您可以在 HTTP REST 命令中引用配置值,这样可保持配置独立且更安全。此方法特别适用于机密数据,如用户名、密码或证书。
处理大量信息
您可以调整配置以处理大量信息。如需更多信息,请参阅处理大量信息。
KafkaConnect
自定义资源配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect 1 metadata: name: my-connect-cluster annotations: strimzi.io/use-connector-resources: "true" 2 spec: replicas: 3 3 authentication: 4 type: tls certificateAndKey: certificate: source.crt key: source.key secretName: my-user-source bootstrapServers: my-cluster-kafka-bootstrap:9092 5 tls: 6 trustedCertificates: - secretName: my-cluster-cluster-cert certificate: ca.crt - secretName: my-cluster-cluster-cert certificate: ca2.crt config: 7 group.id: my-connect-cluster offset.storage.topic: my-connect-cluster-offsets config.storage.topic: my-connect-cluster-configs status.storage.topic: my-connect-cluster-status key.converter: org.apache.kafka.connect.json.JsonConverter value.converter: org.apache.kafka.connect.json.JsonConverter key.converter.schemas.enable: true value.converter.schemas.enable: true config.storage.replication.factor: 3 offset.storage.replication.factor: 3 status.storage.replication.factor: 3 build: 8 output: 9 type: docker image: my-registry.io/my-org/my-connect-cluster:latest pushSecret: my-registry-credentials plugins: 10 - name: debezium-postgres-connector artifacts: - type: tgz url: https://repo1.maven.org/maven2/io/debezium/debezium-connector-postgres/2.1.3.Final/debezium-connector-postgres-2.1.3.Final-plugin.tar.gz sha512sum: c4ddc97846de561755dc0b021a62aba656098829c70eb3ade3b817ce06d852ca12ae50c0281cc791a5a131cb7fc21fb15f4b8ee76c6cae5dd07f9c11cb7c6e79 - name: camel-telegram artifacts: - type: tgz url: https://repo.maven.apache.org/maven2/org/apache/camel/kafkaconnector/camel-telegram-kafka-connector/0.11.5/camel-telegram-kafka-connector-0.11.5-package.tar.gz sha512sum: d6d9f45e0d1dbfcc9f6d1c7ca2046168c764389c78bc4b867dab32d24f710bb74ccf2a007d7d7a8af2dfca09d9a52ccbc2831fc715c195a3634cca055185bd91 externalConfiguration: 11 env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: aws-creds key: awsAccessKey - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: aws-creds key: awsSecretAccessKey resources: 12 requests: cpu: "1" memory: 2Gi limits: cpu: "2" memory: 2Gi logging: 13 type: inline loggers: log4j.rootLogger: INFO readinessProbe: 14 initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 metricsConfig: 15 type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: my-config-map key: my-key jvmOptions: 16 "-Xmx": "1g" "-Xms": "1g" image: my-org/my-image:latest 17 rack: topologyKey: topology.kubernetes.io/zone 18 template: 19 pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" connectContainer: 20 env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry 21
- 1
- 使用
KafkaConnect
。 - 2
- 为 Kafka Connect 集群启用 KafkaConnectors。
- 3
- 运行任务的 worker 的副本节点数量。
- 4
- Kafka Connect 集群的身份验证,指定为 mTLS、基于令牌的 OAuth、基于 SASL 的 SCRAM-SHA-256/SCRAM-SHA-512 或 PLAIN。默认情况下,Kafka Connect 使用纯文本连接连接到 Kafka 代理。
- 5
- 用于连接到 Kafka 集群的 bootstrap 服务器。
- 6
- TLS 加密,使用密钥名称,其中 TLS 证书存储为集群的 X.509 格式。如果证书存储在同一 secret 中,则可以多次列出。
- 7
- worker 的 Kafka 连接配置(而不是连接器)。标准 Apache Kafka 配置可能会提供,仅限于不直接由 AMQ Streams 管理的属性。
- 8
- 构建用于自动使用连接器插件构建容器镜像的配置属性。
- 9
- (必需)推送新镜像的容器 registry 的配置。
- 10
- (必需)添加到新容器镜像的连接器插件及其工件列表。每个插件必须配置至少一个
工件
。 - 11
- 使用环境变量的连接器的外部配置,如此处或卷所示。您还可以使用配置供应商插件从外部来源加载配置值。
- 12
- 用于保留支持的资源、当前
cpu
和内存
以及限制的请求,以指定可消耗的最大资源。 - 13
- 指定 Kafka Connect 日志记录器和日志级别直接(
内联
)或通过 ConfigMap 间接(外部
)。自定义 Log4j 配置必须放在 ConfigMap 中的log4j.properties
或log4j2.properties
键下。对于 Kafka Connectlog4j.rootLogger
日志记录器,您可以将日志级别设置为 INFO, ERROR, WARN, TRACE, DEBUG,FATAL 或 OFF。 - 14
- 健康检查以了解何时重启容器(持续)以及容器可以接受流量(就绪状态)。
- 15
- Prometheus 指标,通过引用包含在此示例中 Prometheus JMX 导出器配置的 ConfigMap 启用。您可以使用对
metricsConfig.valueFrom.configMapKeyRef.key
下包含空文件的 ConfigMap 的引用来启用指标。 - 16
- JVM 配置选项,用于优化运行 Kafka Connect 的虚拟机(VM)的性能。
- 17
- ADVANCED OPTION:容器镜像配置,这只在特殊情况下建议使用。
- 18
- SPECIALIZED OPTION:部署的机架感知配置。这是用于在同一位置(而非跨地区)部署的专用选项。如果您希望连接器从最接近的副本而不是领导副本使用,则使用此选项。在某些情况下,使用来自最接近的副本的消耗可以提高网络利用率或降低成本。
topologyKey
必须与包含机架 ID 的节点标签匹配。此配置中使用的示例使用标准topology.kubernetes.io/zone
标签指定区。要从最接近的副本使用,请在 Kafka 代理配置中启用RackAwareReplicaSelector
。 - 19
- 模板自定义。此处的 pod 使用反关联性调度,因此 pod 不会调度到具有相同主机名的节点。
- 20
- 为分布式追踪设置环境变量。
- 21
- 使用 OpenTelemetry 启用分布式追踪。
8.6.1. 配置 Kafka Connect 用户授权
这个步骤描述了如何授权用户对 Kafka Connect 的访问。
当在 Kafka 中使用任何类型的授权时,Kafka Connect 用户需要对消费者组和 Kafka Connect 的内部主题的读/写权限。
消费者组和内部主题的属性由 AMQ Streams 自动配置,也可以在 KafkaConnect
资源的 spec
中明确指定。
KafkaConnect
资源中的配置属性示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: # ... config: group.id: my-connect-cluster 1 offset.storage.topic: my-connect-cluster-offsets 2 config.storage.topic: my-connect-cluster-configs 3 status.storage.topic: my-connect-cluster-status 4 # ... # ...
此流程演示了如何在使用 简单
授权时提供访问权限。
简单授权使用由 Kafka AclAuthorizer
插件处理的 ACL 规则,以提供正确的访问级别。有关将 KafkaUser
资源配置为使用简单授权的更多信息,请参阅 AclRule
模式参考。
先决条件
- 一个 OpenShift 集群
- 正在运行的 Cluster Operator
流程
编辑
KafkaUser
资源中的authorization
属性,为用户提供访问权限。在以下示例中,使用
字面
名称值为 Kafka Connect 主题和消费者组配置访问权限:属性 名称 offset.storage.topic
connect-cluster-offsets
status.storage.topic
connect-cluster-status
config.storage.topic
connect-cluster-configs
group
connect-cluster
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user labels: strimzi.io/cluster: my-cluster spec: # ... authorization: type: simple acls: # access to offset.storage.topic - resource: type: topic name: connect-cluster-offsets patternType: literal operations: - Create - Describe - Read - Write host: "*" # access to status.storage.topic - resource: type: topic name: connect-cluster-status patternType: literal operations: - Create - Describe - Read - Write host: "*" # access to config.storage.topic - resource: type: topic name: connect-cluster-configs patternType: literal operations: - Create - Describe - Read - Write host: "*" # consumer group - resource: type: group name: connect-cluster patternType: literal operations: - Read host: "*"
创建或更新资源。
oc apply -f KAFKA-USER-CONFIG-FILE
8.7. 配置 Kafka MirrorMaker 2
更新 KafkaMirrorMaker2
自定义资源的 spec
属性,以配置 MirrorMaker 2 部署。MirrorMaker 2 使用源集群配置进行数据消耗和目标集群配置进行数据输出。
MirrorMaker 2 基于 Kafka Connect 框架,连接器 管理集群之间的数据传输。
您可以配置 MirrorMaker 2 以定义 Kafka Connect 部署,包括源和目标集群的连接详情,然后运行 MirrorMaker 2 连接器的集合来进行连接。
MirrorMaker 2 支持源和目标集群之间的主题配置同步。您可以在 MirrorMaker 2 配置中指定源主题。MirrorMaker 2 监控源主题。MirrorMaker 2 会检测并将更改传播到源主题到远程主题。更改可能包括自动创建缺少的主题和分区。
在大多数情况下,您写入本地主题并从远程主题读取。虽然对远程主题不阻止写操作,但应该避免使用它们。
配置必须指定:
- 每个 Kafka 集群
- 每个集群的连接信息,包括身份验证
复制流和方向
- 集群到集群
- topic 的主题
要深入了解 Kafka MirrorMaker 2 集群配置选项,请参阅 AMQ Streams 自定义资源 API 参考。
MirrorMaker 2 资源配置与之前的 MirrorMaker 版本不同,它现已弃用。当前不支持旧支持,因此任何资源都必须手动转换为新格式。
默认配置
MirrorMaker 2 为复制因素等属性提供默认配置值。最小配置保持不变,默认值如下:
MirrorMaker 2 的最小配置
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: version: 3.5.0 connectCluster: "my-cluster-target" clusters: - alias: "my-cluster-source" bootstrapServers: my-cluster-source-kafka-bootstrap:9092 - alias: "my-cluster-target" bootstrapServers: my-cluster-target-kafka-bootstrap:9092 mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" sourceConnector: {}
您可以使用 mTLS 或 SASL 身份验证为源和目标集群配置访问控制。此流程演示了如何为源和目标集群使用 TLS 加密和 mTLS 身份验证的配置。
您可以在 KafkaMirrorMaker2
资源中指定您要从源集群复制的主题和消费者组。您可以使用 topicsPattern
和 groupsPattern
属性进行此操作。您可以提供名称列表或使用正则表达式。默认情况下,如果您未设置 topicsPattern
和 groupsPattern
属性,则会复制所有主题和消费者组。您可以使用 ".*"
正则表达式来复制所有主题和消费者组。但是,尝试只指定您需要指定主题和消费者组,以避免在集群中造成不必要的额外负载。
处理大量信息
您可以调整配置以处理大量信息。如需更多信息,请参阅处理大量信息。
KafkaMirrorMaker2
自定义资源配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: version: 3.5.0 1 replicas: 3 2 connectCluster: "my-cluster-target" 3 clusters: 4 - alias: "my-cluster-source" 5 authentication: 6 certificateAndKey: certificate: source.crt key: source.key secretName: my-user-source type: tls bootstrapServers: my-cluster-source-kafka-bootstrap:9092 7 tls: 8 trustedCertificates: - certificate: ca.crt secretName: my-cluster-source-cluster-ca-cert - alias: "my-cluster-target" 9 authentication: 10 certificateAndKey: certificate: target.crt key: target.key secretName: my-user-target type: tls bootstrapServers: my-cluster-target-kafka-bootstrap:9092 11 config: 12 config.storage.replication.factor: 1 offset.storage.replication.factor: 1 status.storage.replication.factor: 1 tls: 13 trustedCertificates: - certificate: ca.crt secretName: my-cluster-target-cluster-ca-cert mirrors: 14 - sourceCluster: "my-cluster-source" 15 targetCluster: "my-cluster-target" 16 sourceConnector: 17 tasksMax: 10 18 autoRestart: 19 enabled: true config: replication.factor: 1 20 offset-syncs.topic.replication.factor: 1 21 sync.topic.acls.enabled: "false" 22 refresh.topics.interval.seconds: 60 23 replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy" 24 heartbeatConnector: 25 autoRestart: enabled: true config: heartbeats.topic.replication.factor: 1 26 replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy" checkpointConnector: 27 autoRestart: enabled: true config: checkpoints.topic.replication.factor: 1 28 refresh.groups.interval.seconds: 600 29 sync.group.offsets.enabled: true 30 sync.group.offsets.interval.seconds: 60 31 emit.checkpoints.interval.seconds: 60 32 replication.policy.class: "org.apache.kafka.connect.mirror.IdentityReplicationPolicy" topicsPattern: "topic1|topic2|topic3" 33 groupsPattern: "group1|group2|group3" 34 resources: 35 requests: cpu: "1" memory: 2Gi limits: cpu: "2" memory: 2Gi logging: 36 type: inline loggers: connect.root.logger.level: INFO readinessProbe: 37 initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 jvmOptions: 38 "-Xmx": "1g" "-Xms": "1g" image: my-org/my-image:latest 39 rack: topologyKey: topology.kubernetes.io/zone 40 template: 41 pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" connectContainer: 42 env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry 43 externalConfiguration: 44 env: - name: AWS_ACCESS_KEY_ID valueFrom: secretKeyRef: name: aws-creds key: awsAccessKey - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: aws-creds key: awsSecretAccessKey
- 1
- Kafka Connect 和 Mirror Maker 2.0 版本,它们始终是相同的。
- 2
- 运行任务的 worker 的副本节点数量。
- 3
- Kafka Connect 的 Kafka 集群别名,它必须 指定目标 Kafka 集群。Kafka Connect 使用 Kafka 集群用于其内部主题。
- 4
- 正在同步的 Kafka 集群的规格。
- 5
- 源 Kafka 集群的集群别名。
- 6
- 源集群的身份验证,指定为 mTLS、基于令牌的 OAuth、基于 SASL 的 SCRAM-SHA-256/SCRAM-SHA-512 或 PLAIN。
- 7
- 用于连接到源 Kafka 集群的 Bootstrap 服务器。
- 8
- TLS 加密,使用密钥名称,其中 TLS 证书存储为源 Kafka 集群的 X.509 格式。如果证书存储在同一 secret 中,则可以多次列出。
- 9
- 目标 Kafka 集群的集群别名。
- 10
- 目标 Kafka 集群的身份验证配置方式与源 Kafka 集群相同。
- 11
- 用于连接到目标 Kafka 集群的 bootstrap 服务器。
- 12
- Kafka Connect 配置。标准 Apache Kafka 配置可能会提供,仅限于不直接由 AMQ Streams 管理的属性。
- 13
- 目标 Kafka 集群的 TLS 加密配置方式与源 Kafka 集群相同。
- 14
- MirrorMaker 2 连接器。
- 15
- MirrorMaker 2 连接器使用的源集群的集群别名。
- 16
- MirrorMaker 2 连接器使用的目标集群的集群别名。
- 17
MirrorSourceConnector
的配置,用于创建远程主题。配置会覆盖
默认配置选项。- 18
- 连接器可创建的最大任务数量。任务处理数据复制并并行运行。如果基础架构支持处理开销,增加这个值可以提高吞吐量。Kafka Connect 在集群成员间分发任务。如果任务数量超过 worker,则 worker 会被分配多个任务。对于 sink 连接器,旨在为每个主题分区消耗一个任务。对于源连接器,可以并行运行的任务数量也可能依赖于外部系统。如果无法实现并行性,则连接器会创建少于最大任务数。
- 19
- 启用自动重启失败的连接器和任务。最多进行 7 个重启尝试,之后必须手动重新启动。
- 20
- 在目标集群中创建的镜像主题的复制因素。
- 21
MirrorSourceConnector
offset-syncs
内部主题的复制因素,用于映射源和目标集群的偏移。- 22
- 启用 ACL 规则同步后,会将 ACL 应用到同步主题。默认值是
true
。此功能与 User Operator 不兼容。如果使用 User Operator,请将此属性设置为false
。 - 23
- 可选设置,用于更改新主题的检查频率。默认值为每 10 分钟进行一次检查。
- 24
- 添加可覆盖远程主题自动重命名的策略。该主题不会用源集群的名称来附加名称,而是保留其原始名称。此可选设置可用于主动/被动备份和数据迁移。必须为所有连接器指定属性。对于双向(active/active)复制,请使用
DefaultReplicationPolicy
类自动重命名远程主题,并为所有连接器指定replication.policy.separator
属性来添加自定义分隔符。 - 25
- 执行连接检查的
MirrorHeartbeatConnector
的配置。配置会覆盖
默认配置选项。 - 26
- 在目标集群中创建的心跳主题的复制因素。
- 27
- 用于跟踪偏移的
MirrorCheckpointConnector
的配置。配置会覆盖
默认配置选项。 - 28
- 在目标集群中创建的检查点主题的复制因素。
- 29
- 可选设置,用于更改新消费者组的检查频率。默认值为每 10 分钟进行一次检查。
- 30
- 用于同步消费者组偏移的可选设置,这对于在主动/被动配置中恢复非常有用。默认不启用同步。
- 31
- 如果启用了使用者组偏移的同步,您可以调整同步的频率。
- 32
- 调整检查偏移跟踪的频率。如果您更改了偏移同步的频率,您可能需要调整这些检查的频率。
- 33
- 定义为以逗号分隔的列表或正则表达式模式的源集群的主题复制。源连接器复制指定的主题。checkpoint 连接器跟踪指定主题的偏移。此处我们按名称请求三个主题。
- 34
- 从以逗号分隔列表或正则表达式模式定义的源集群的消费者组复制。checkpoint 连接器复制指定的消费者组。此处我们按名称请求三个消费者组。
- 35
- 用于保留支持的资源、当前
cpu
和内存
以及限制的请求,以指定可消耗的最大资源。 - 36
- 指定 Kafka Connect 日志记录器和日志级别直接(
内联
)或通过 ConfigMap 间接(外部
)。自定义 Log4j 配置必须放在 ConfigMap 中的log4j.properties
或log4j2.properties
键下。对于 Kafka Connectlog4j.rootLogger
日志记录器,您可以将日志级别设置为 INFO, ERROR, WARN, TRACE, DEBUG,FATAL 或 OFF。 - 37
- 健康检查以了解何时重启容器(持续)以及容器可以接受流量(就绪状态)。
- 38
- JVM 配置选项,用于优化运行 Kafka MirrorMaker 的虚拟机(VM)的性能。
- 39
- ADVANCED OPTION:容器镜像配置,这只在特殊情况下建议使用。
- 40
- SPECIALIZED OPTION:部署的机架感知配置。这是用于在同一位置(而非跨地区)部署的专用选项。如果您希望连接器从最接近的副本而不是领导副本使用,则使用此选项。在某些情况下,使用来自最接近的副本的消耗可以提高网络利用率或降低成本。
topologyKey
必须与包含机架 ID 的节点标签匹配。此配置中使用的示例使用标准topology.kubernetes.io/zone
标签指定区。要从最接近的副本使用,请在 Kafka 代理配置中启用RackAwareReplicaSelector
。 - 41
- 模板自定义。此处的 pod 使用反关联性调度,因此 pod 不会调度到具有相同主机名的节点。
- 42
- 为分布式追踪设置环境变量。
- 43
- 使用 OpenTelemetry 启用分布式追踪。
- 44
- 作为环境变量挂载到 Kafka MirrorMaker 的 OpenShift Secret 的外部配置。您还可以使用配置供应商插件从外部来源加载配置值。
8.7.1. 配置主动/主动或主动/被动模式
您可以在主动/被动或主动/主动集群配置中使用 MirrorMaker 2。
- 主动/主动集群配置
- 主动/主动配置有两个主动集群双向复制数据。应用程序可以使用任一集群。每个集群都可以提供相同的数据。这样,您可以在不同的地理位置提供相同的数据。因为消费者组在两个集群中都活跃,复制主题的使用者偏移不会重新同步到源集群。
- 主动/被动集群配置
- 主动/被动配置具有主动集群将数据复制到被动集群。被动集群保持在待机状态。在出现系统失败时,您可以使用被动集群进行数据恢复。
预期的结构是,生成者和消费者仅连接到活跃集群。每个目标目的地都需要一个 MirrorMaker 2 集群。
8.7.1.1. 双向复制(主动/主动)
MirrorMaker 2 架构支持 主动/主动集群配置中 的双向复制。
每个集群使用 source 和 remote 主题的概念复制其他集群的数据。由于同一主题存储在每个集群中,因此远程主题由 MirrorMaker 2 自动重命名,以代表源集群。原始集群的名称前面是主题名称的前面。
图 8.1. 主题重命名

通过标记原始集群,主题不会复制到该集群。
在配置需要数据聚合的架构时,通过 远程主题 复制的概念非常有用。消费者可以订阅同一集群中的源和目标主题,而无需单独的聚合集群。
8.7.1.2. 单向复制(主动/被动)
MirrorMaker 2 架构支持 主动/被动集群 配置中的单向复制。
您可以使用 主动/被动集群 配置来备份或将数据迁移到另一个集群。在这种情况下,您可能不希望自动重命名远程主题。
您可以通过将 IdentityReplicationPolicy
添加到源连接器配置来覆盖自动重命名。应用此配置后,主题会保留其原始名称。
8.7.2. 配置 MirrorMaker 2 连接器
将 MirrorMaker 2 连接器配置用于编配 Kafka 集群之间的数据同步的内部连接器。
MirrorMaker 2 由以下连接器组成:
MirrorSourceConnector
-
源连接器将主题从源集群复制到目标集群。它还复制 ACL,且是
MirrorCheckpointConnector
才能运行所必需的。 MirrorCheckpointConnector
- checkpoint 连接器会定期跟踪偏移。如果启用,它还在源和目标集群之间同步消费者组偏移。
MirrorHeartbeatConnector
- heartbeat 连接器会定期检查源和目标集群之间的连接。
下表描述了连接器属性以及您配置为使用它们的连接器。
属性 | sourceConnector | checkpointConnector | heartbeatConnector |
---|---|---|---|
| ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ |
| ✓ | ✓ | |
| ✓ | ✓ | |
| ✓ | ✓ | |
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ | ||
| ✓ |
8.7.2.1. 更改消费者组偏移主题的位置
MirrorMaker 2 使用内部主题跟踪消费者组的偏移。
offset-syncs
主题-
offset-syncs
主题映射复制主题元数据的源和目标偏移。 checkpoints
主题-
checkpoints
主题映射源和目标集群中每个消费者组中复制的主题分区的最后提交偏移量。
因为它们被 MirrorMaker 2 内部使用,所以您不会直接与这些主题交互。
MirrorCheckpointConnector
为偏移跟踪发出 检查点。checkpoints
主题的偏移通过配置以预先确定的间隔进行跟踪。这两个主题都允许从故障转移上的正确偏移位置完全恢复复制。
offset-syncs
主题的位置是 源集群
。您可以使用 offset-syncs.topic.location
连接器配置将其更改为 目标集群
。您需要对包含该主题的集群进行读/写访问。使用目标集群作为 offset-syncs
主题的位置,您也可以使用 MirrorMaker 2,即使您只有对源集群的读访问权限。
8.7.2.2. 同步消费者组偏移
__consumer_offsets
主题存储各个消费者组的提交偏移信息。偏移同步会定期将源集群的消费者组的使用者偏移转移到目标集群的使用者偏移量中。
偏移同步在主动/被动配置中特别有用。如果主动集群停机,消费者应用程序可以切换到被动(standby)集群,并从最后一个传输的偏移位置获取。
要使用主题偏移同步,请通过将 sync.group.offsets.enabled
添加到检查点连接器配置来启用同步,并将属性设置为 true
。默认情况下禁用同步。
在源连接器中使用 IdentityReplicationPolicy
时,还必须在检查点连接器配置中进行配置。这样可确保为正确的主题应用镜像的消费者偏移。
消费者偏移仅针对目标集群中未激活的消费者组同步。如果消费者组位于目标集群中,则无法执行同步,并返回 UNKNOWN_MEMBER_ID
错误。
如果启用,则会定期从源集群同步偏移。您可以通过在检查点连接器配置中添加 sync.group.offsets.interval.seconds
和 emit.checkpoints.interval.seconds
来更改频率。属性指定同步消费者组偏移的频率,以及为偏移跟踪发送检查点的频率。这两个属性的默认值为 60 秒。您还可以使用 refresh.groups.interval.seconds
属性更改检查新消费者组的频率,该属性默认为每 10 分钟执行。
由于同步基于时间,因此消费者到被动集群的任何切换都可能会导致一些消息重复。
如果您有使用 Java 编写的应用程序,您可以使用 RemoteClusterUtils.java
工具通过应用同步偏移。实用程序从 checkpoints
主题获取消费者组的远程偏移。
8.7.2.3. 决定使用 heartbeat 连接器的时间
heartbeat 连接器发出心跳来检查源和目标 Kafka 集群之间的连接。内部 心跳
主题从源集群复制,这意味着 heartbeat 连接器必须连接到源集群。heartbeat
主题位于目标集群上,它允许它执行以下操作:
- 识别它要从中镜像数据的所有源集群
- 验证镜像进程的存活度和延迟
这有助于确保进程不会因为任何原因而卡住或已停止。虽然 heartbeat 连接器是监控 Kafka 集群之间的镜像进程的有价值的工具,但并非总是需要使用它。例如,如果您的部署具有低网络延迟或少量主题,您可能需要使用日志消息或其他监控工具来监控镜像过程。如果您决定不使用 heartbeat 连接器,只需从 MirrorMaker 2 配置中省略它。
8.7.2.4. 对齐 MirrorMaker 2 连接器的配置
为确保 MirrorMaker 2 连接器正常工作,请确保在连接器之间保持一致某些配置设置。具体来说,请确保以下属性在所有适用的连接器中具有相同的值:
-
replication.policy.class
-
replication.policy.separator
-
offset-syncs.topic.location
-
topic.filter.class
例如,source、检查点和 heartbeat 连接器的 replication.policy.class
的值必须相同。不匹配或缺失的设置会导致数据复制或偏移同步出现问题,因此必须使用同一设置保持所有相关连接器配置。
8.7.3. 配置 MirrorMaker 2 连接器制作者和消费者
MirrorMaker 2 连接器使用内部生产者和消费者。如果需要,您可以配置这些制作者和消费者来覆盖默认设置。
例如,您可以增加源制作者的 batch.size
,将主题发送到目标 Kafka 集群,以更好地容纳大量信息。
生产者和消费者配置选项取决于 MirrorMaker 2 的实施,并可能随时更改。
下表描述了每个连接器的生产者和消费者,以及您可以添加配置的位置。
类型 | Description | 配置 |
---|---|---|
制作者 | 将主题信息发送到目标 Kafka 集群。在处理大量数据时,请考虑调整此制作者的配置。 |
|
制作者 |
写入 |
|
消费者 | 从源 Kafka 集群检索主题信息。 |
|
类型 | Description | 配置 |
---|---|---|
制作者 | 发送消费者偏移检查点。 |
|
消费者 |
加载 |
|
您可以将 offset-syncs.topic.location
设置为 target
来使用目标 Kafka 集群作为 offset-syncs
主题的位置。
类型 | Description | 配置 |
---|---|---|
制作者 | 发送心跳。 |
|
以下示例演示了如何配置制作者和消费者。
连接器制作者和消费者的配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: version: 3.5.0 # ... mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" sourceConnector: tasksMax: 5 config: producer.override.batch.size: 327680 producer.override.linger.ms: 100 producer.request.timeout.ms: 30000 consumer.fetch.max.bytes: 52428800 # ... checkpointConnector: config: producer.override.request.timeout.ms: 30000 consumer.max.poll.interval.ms: 300000 # ... heartbeatConnector: config: producer.override.request.timeout.ms: 30000 # ...
8.7.4. 指定最大数据复制任务数
连接器创建负责在 Kafka 中移动数据的任务。每个连接器由一个或多个任务组成,它们分布到运行任务的一组 worker pod 中。在复制大量分区或同步大量消费者组的偏移时,增加任务数量可以帮助解决性能问题。
任务并行运行。为 worker 分配一个或多个任务。单个任务由一个 worker pod 处理,因此您不需要多个 worker pod 超过任务。如果有多个任务,worker 会处理多个任务。
您可以使用 tasksMax
属性指定 MirrorMaker 配置中的最大连接器任务数量。在不指定最大任务数量的情况下,默认设置是单个任务。
heartbeat 连接器始终使用单个任务。
为源和检查点连接器启动的任务数量是最大可能任务数和 tasksMax
的值之间的较低值。对于源连接器,可能的最大任务数是从源集群复制的每个分区。对于检查点连接器,可能的最大任务数都是从源集群复制的每个消费者组。在设置最多任务数量时,请考虑分区数量和支持进程的硬件资源。
如果基础架构支持处理开销,增加任务数量可以提高吞吐量和延迟。例如,添加更多任务可减少在有大量分区或消费者组时轮询源集群所需的时间。
当您有大量分区时,为源连接器增加任务数量很有用。
为源连接器增加任务数量
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: # ... mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" sourceConnector: tasksMax: 10 # ...
当您有大量消费者组时,为检查点连接器增加任务数量很有用。
增加检查点连接器的任务数量
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker2 spec: # ... mirrors: - sourceCluster: "my-cluster-source" targetCluster: "my-cluster-target" checkpointConnector: tasksMax: 10 # ...
默认情况下,MirrorMaker 2 每 10 分钟检查新消费者组。您可以调整 refresh.groups.interval.seconds
配置以更改频率。在调整降低时请小心。更频繁的检查可能会对性能造成负面影响。
8.7.4.1. 检查连接器任务操作
如果使用 Prometheus 和 Grafana 监控部署,您可以检查 MirrorMaker 2 性能。AMQ Streams 提供的 MirrorMaker 2 Grafana 仪表板示例显示了与任务和延迟相关的以下指标。
- 任务数量
- 复制延迟
- 偏移同步延迟
8.7.5. 为远程主题同步 ACL 规则
将 MirrorMaker 2 与 AMQ Streams 搭配使用时,可以同步远程主题的 ACL 规则。但是,只有在您没有使用 User Operator 时,此功能才可用。
如果您使用 类型:在没有 User Operator 的情况下进行简单
授权,管理对代理的访问的 ACL 规则也适用于远程主题。这意味着,对源主题具有读取访问权限的用户也可以读取其远程等效内容。
OAuth 2.0 授权不支持以这种方式访问远程主题。
8.7.6. 保护 Kafka MirrorMaker 2 部署
此流程描述了概述保护 MirrorMaker 2 部署所需的配置。
源 Kafka 集群和目标 Kafka 集群需要单独的配置。您还需要单独的用户配置来提供 MirrorMaker 连接到源和目标 Kafka 集群所需的凭证。
对于 Kafka 集群,您可以为 OpenShift 集群内的安全连接指定内部监听程序,以及用于 OpenShift 集群外的连接的外部监听程序。
您可以配置身份验证和授权机制。为源和目标 Kafka 集群实施的安全选项必须与为 MirrorMaker 2 实施的安全选项兼容。
创建集群和用户身份验证凭证后,您可以在 MirrorMaker 配置中指定它们以进行安全连接。
在此过程中,会使用 Cluster Operator 生成的证书,但 您可以通过安装自己的证书 来替换它们。您还可以将监听程序 配置为使用由外部 CA (证书颁发机构)管理的 Kafka 侦听器证书。
开始前
在开始这个过程前,请查看 AMQ Streams 提供的示例配置文件。它们包括使用 mTLS 或 SCRAM-SHA-512 身份验证保护 MirrorMaker 2 部署的示例。示例指定用于在 OpenShift 集群内连接的内部监听程序。
这个示例提供了完整的授权配置,包括 MirrorMaker 2 所需的所有 ACL,以允许对源和目标 Kafka 集群的操作。
先决条件
- AMQ Streams 正在运行
- 源和目标集群的独立命名空间
此流程假设将源和目标集群安装到单独的命名空间,如果要使用 Topic Operator,则需要这样做。主题 Operator 只监视指定命名空间中的单个集群。
通过将集群划分为命名空间,您需要复制集群 secret,以便可以在命名空间外访问它们。您需要引用 MirrorMaker 配置中的 secret。
流程
配置两个
Kafka
资源,一个用于保护源 Kafka 集群,另一个用于保护目标 Kafka 集群。您可以为身份验证和启用授权添加监听程序配置。
在本例中,为带有 TLS 加密和 mTLS 身份验证的 Kafka 集群配置了内部监听程序。启用 Kafka
简单
授权。使用 TLS 加密和 mTLS 身份验证的源 Kafka 集群配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-source-cluster spec: kafka: version: 3.5.0 replicas: 1 listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls authorization: type: simple config: offsets.topic.replication.factor: 1 transaction.state.log.replication.factor: 1 transaction.state.log.min.isr: 1 default.replication.factor: 1 min.insync.replicas: 1 inter.broker.protocol.version: "3.5" storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false zookeeper: replicas: 1 storage: type: persistent-claim size: 100Gi deleteClaim: false entityOperator: topicOperator: {} userOperator: {}
使用 TLS 加密和 mTLS 身份验证的目标 Kafka 集群配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-target-cluster spec: kafka: version: 3.5.0 replicas: 1 listeners: - name: tls port: 9093 type: internal tls: true authentication: type: tls authorization: type: simple config: offsets.topic.replication.factor: 1 transaction.state.log.replication.factor: 1 transaction.state.log.min.isr: 1 default.replication.factor: 1 min.insync.replicas: 1 inter.broker.protocol.version: "3.5" storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false zookeeper: replicas: 1 storage: type: persistent-claim size: 100Gi deleteClaim: false entityOperator: topicOperator: {} userOperator: {}
在单独的命名空间中创建或更新
Kafka
资源。oc apply -f <kafka_configuration_file> -n <namespace>
Cluster Operator 创建监听程序并设置集群和客户端证书颁发机构(CA)证书,以便在 Kafka 集群中启用身份验证。
证书在 secret <
cluster_name> -cluster-ca-cert
中创建。配置两个
KafkaUser
资源,一个用于源 Kafka 集群的用户,另一个用于目标 Kafka 集群的用户。-
配置与对应的源和目标 Kafka 集群相同的身份验证和授权类型。例如,如果您在源 Kafka 集群的
Kafka
配置中使用了tls
验证和simple
授权类型,请在KafkaUser
配置中使用相同的。 配置 MirrorMaker 2 所需的 ACL,以允许对源和目标 Kafka 集群执行操作。
内部 MirrorMaker 连接器和底层 Kafka Connect 框架使用 ACL。
mTLS 验证的源用户配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-source-user labels: strimzi.io/cluster: my-source-cluster spec: authentication: type: tls authorization: type: simple acls: # MirrorSourceConnector - resource: # Not needed if offset-syncs.topic.location=target type: topic name: mm2-offset-syncs.my-target-cluster.internal operations: - Create - DescribeConfigs - Read - Write - resource: # Needed for every topic which is mirrored type: topic name: "*" operations: - DescribeConfigs - Read # MirrorCheckpointConnector - resource: type: cluster operations: - Describe - resource: # Needed for every group for which offsets are synced type: group name: "*" operations: - Describe - resource: # Not needed if offset-syncs.topic.location=target type: topic name: mm2-offset-syncs.my-target-cluster.internal operations: - Read
mTLS 验证的目标用户配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-target-user labels: strimzi.io/cluster: my-target-cluster spec: authentication: type: tls authorization: type: simple acls: # Underlying Kafka Connect internal topics to store configuration, offsets, or status - resource: type: group name: mirrormaker2-cluster operations: - Read - resource: type: topic name: mirrormaker2-cluster-configs operations: - Create - Describe - DescribeConfigs - Read - Write - resource: type: topic name: mirrormaker2-cluster-status operations: - Create - Describe - DescribeConfigs - Read - Write - resource: type: topic name: mirrormaker2-cluster-offsets operations: - Create - Describe - DescribeConfigs - Read - Write # MirrorSourceConnector - resource: # Needed for every topic which is mirrored type: topic name: "*" operations: - Create - Alter - AlterConfigs - Write # MirrorCheckpointConnector - resource: type: cluster operations: - Describe - resource: type: topic name: my-source-cluster.checkpoints.internal operations: - Create - Describe - Read - Write - resource: # Needed for every group for which the offset is synced type: group name: "*" operations: - Read - Describe # MirrorHeartbeatConnector - resource: type: topic name: heartbeats operations: - Create - Describe - Write
注意您可以通过将
type
设置为tls-external
来使用 User Operator 外部发布的证书。如需更多信息,请参阅KafkaUserSpec
模式参考。-
配置与对应的源和目标 Kafka 集群相同的身份验证和授权类型。例如,如果您在源 Kafka 集群的
在您为源和目标 Kafka 集群创建的每个命名空间中创建或更新
KafkaUser
资源。oc apply -f <kafka_user_configuration_file> -n <namespace>
User Operator 根据所选的验证类型创建代表客户端(MirrorMaker)的用户,以及用于客户端身份验证的安全凭证。
User Operator 创建一个名称与
KafkaUser
资源相同的新 secret。secret 包含 mTLS 验证的私钥和公钥。公钥包含在用户证书中,该证书由客户端 CA 签名。使用身份验证详情配置
KafkaMirrorMaker2
资源,以连接到源和目标 Kafka 集群。带有 TLS 加密和 mTLS 身份验证的 MirrorMaker 2 配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker2 metadata: name: my-mirror-maker-2 spec: version: 3.5.0 replicas: 1 connectCluster: "my-target-cluster" clusters: - alias: "my-source-cluster" bootstrapServers: my-source-cluster-kafka-bootstrap:9093 tls: 1 trustedCertificates: - secretName: my-source-cluster-cluster-ca-cert certificate: ca.crt authentication: 2 type: tls certificateAndKey: secretName: my-source-user certificate: user.crt key: user.key - alias: "my-target-cluster" bootstrapServers: my-target-cluster-kafka-bootstrap:9093 tls: 3 trustedCertificates: - secretName: my-target-cluster-cluster-ca-cert certificate: ca.crt authentication: 4 type: tls certificateAndKey: secretName: my-target-user certificate: user.crt key: user.key config: # -1 means it will use the default replication factor configured in the broker config.storage.replication.factor: -1 offset.storage.replication.factor: -1 status.storage.replication.factor: -1 mirrors: - sourceCluster: "my-source-cluster" targetCluster: "my-target-cluster" sourceConnector: config: replication.factor: 1 offset-syncs.topic.replication.factor: 1 sync.topic.acls.enabled: "false" heartbeatConnector: config: heartbeats.topic.replication.factor: 1 checkpointConnector: config: checkpoints.topic.replication.factor: 1 sync.group.offsets.enabled: "true" topicsPattern: "topic1|topic2|topic3" groupsPattern: "group1|group2|group3"
在与目标 Kafka 集群相同的命名空间中创建或更新
KafkaMirrorMaker2
资源。oc apply -f <mirrormaker2_configuration_file> -n <namespace_of_target_cluster>
8.8. 配置 Kafka MirrorMaker (已弃用)
更新 KafkaMirrorMaker
自定义资源的 spec
属性,以配置 Kafka MirrorMaker 部署。
您可以使用 TLS 或 SASL 身份验证为生产者和消费者配置访问控制。此流程演示了如何在消费者和生成器端使用 TLS 加密和 mTLS 身份验证的配置。
要深入了解 Kafka MirrorMaker 集群配置选项,请参阅 AMQ Streams 自定义资源 API 参考。
Kafka MirrorMaker 1 (称为文档中的 MirrorMaker )已在 Apache Kafka 3.0.0 中弃用,并将在 Apache Kafka 4.0.0 中删除。因此,在 AMQ Streams 中还已弃用了用于部署 Kafka MirrorMaker
1 的 KafkaMirrorMaker 自定义资源。当使用 Apache Kafka 4.0.0 时,KafkaMirrorMaker
资源将从 AMQ Streams 中删除。作为替代方法,在 IdentityReplicationPolicy
中使用 KafkaMirrorMaker2
自定义资源。
KafkaMirrorMaker
自定义资源配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaMirrorMaker metadata: name: my-mirror-maker spec: replicas: 3 1 consumer: bootstrapServers: my-source-cluster-kafka-bootstrap:9092 2 groupId: "my-group" 3 numStreams: 2 4 offsetCommitInterval: 120000 5 tls: 6 trustedCertificates: - secretName: my-source-cluster-ca-cert certificate: ca.crt authentication: 7 type: tls certificateAndKey: secretName: my-source-secret certificate: public.crt key: private.key config: 8 max.poll.records: 100 receive.buffer.bytes: 32768 producer: bootstrapServers: my-target-cluster-kafka-bootstrap:9092 abortOnSendFailure: false 9 tls: trustedCertificates: - secretName: my-target-cluster-ca-cert certificate: ca.crt authentication: type: tls certificateAndKey: secretName: my-target-secret certificate: public.crt key: private.key config: compression.type: gzip batch.size: 8192 include: "my-topic|other-topic" 10 resources: 11 requests: cpu: "1" memory: 2Gi limits: cpu: "2" memory: 2Gi logging: 12 type: inline loggers: mirrormaker.root.logger: INFO readinessProbe: 13 initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 metricsConfig: 14 type: jmxPrometheusExporter valueFrom: configMapKeyRef: name: my-config-map key: my-key jvmOptions: 15 "-Xmx": "1g" "-Xms": "1g" image: my-org/my-image:latest 16 template: 17 pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" mirrorMakerContainer: 18 env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: 19 type: opentelemetry
- 1
- 副本节点的数量。
- 2
- 用于消费者和制作者的 Bootstrap 服务器。
- 3
- 消费者的组 ID。
- 4
- 消费者流的数量。
- 5
- 偏移 auto-commit 间隔(以毫秒为单位)。
- 6
- TLS 加密,使用密钥名称,其中 TLS 证书存储为 X.509 格式,用于消费者或生成者。如果证书存储在同一 secret 中,则可以多次列出。
- 7
- 为消费者或生成者(指定为 mTLS、基于令牌的 OAuth、基于 SASL 的 SCRAM-SHA-256/SCRAM-SHA-512 或 PLAIN)进行身份验证。
- 8
- consumer 和 producer 的 Kafka 配置选项。
- 9
- 如果将
abortOnSendFailure
属性设置为true
,则 Kafka MirrorMaker 将退出,容器将按照消息发送失败重启。 - 10
- 从源镜像到目标 Kafka 集群包含的主题列表。
- 11
- 用于保留支持的资源、当前
cpu
和内存
以及限制的请求,以指定可消耗的最大资源。 - 12
- 指定日志记录器和日志级别直接(
内联
)或通过 ConfigMap 间接添加(外部
)。自定义 Log4j 配置必须放在 ConfigMap 中的log4j.properties
或log4j2.properties
键下。MirrorMaker 只有一个日志记录器,名为mirrormaker.root.logger
。您可以将日志级别设置为 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 或 OFF。 - 13
- 健康检查以了解何时重启容器(持续)以及容器可以接受流量(就绪状态)。
- 14
- Prometheus 指标,通过引用包含在此示例中 Prometheus JMX 导出器配置的 ConfigMap 启用。您可以使用对
metricsConfig.valueFrom.configMapKeyRef.key
下包含空文件的 ConfigMap 的引用来启用指标。 - 15
- JVM 配置选项,用于优化运行 Kafka MirrorMaker 的虚拟机(VM)的性能。
- 16
- ADVANCED OPTION:容器镜像配置,这只在特殊情况下建议使用。
- 17
- 模板自定义。此处的 pod 使用反关联性调度,因此 pod 不会调度到具有相同主机名的节点。
- 18
- 为分布式追踪设置环境变量。
- 19
- 使用 OpenTelemetry 启用分布式追踪。警告
将
abortOnSendFailure
属性设置为false
时,生产者会尝试在主题中发送下一个消息。原始消息可能会丢失,因为没有尝试重新发送失败的消息。
8.9. 配置 Kafka Bridge
更新 KafkaBridge
自定义资源的 spec
属性来配置 Kafka Bridge 部署。
为了防止在不同 Kafka Bridge 实例处理客户端消费者请求时出现问题,必须使用基于地址的路由来确保将请求路由到正确的 Kafka Bridge 实例。另外,每个独立的 Kafka Bridge 实例都必须有副本。Kafka Bridge 实例有自己的状态,它不与另一个实例共享。
要深入了解 Kafka Bridge 集群配置选项,请参阅 AMQ Streams 自定义资源 API 参考。
KafkaBridge
自定义资源配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaBridge metadata: name: my-bridge spec: replicas: 3 1 bootstrapServers: <cluster_name>-cluster-kafka-bootstrap:9092 2 tls: 3 trustedCertificates: - secretName: my-cluster-cluster-cert certificate: ca.crt - secretName: my-cluster-cluster-cert certificate: ca2.crt authentication: 4 type: tls certificateAndKey: secretName: my-secret certificate: public.crt key: private.key http: 5 port: 8080 cors: 6 allowedOrigins: "https://strimzi.io" allowedMethods: "GET,POST,PUT,DELETE,OPTIONS,PATCH" consumer: 7 config: auto.offset.reset: earliest producer: 8 config: delivery.timeout.ms: 300000 resources: 9 requests: cpu: "1" memory: 2Gi limits: cpu: "2" memory: 2Gi logging: 10 type: inline loggers: logger.bridge.level: INFO # enabling DEBUG just for send operation logger.send.name: "http.openapi.operation.send" logger.send.level: DEBUG jvmOptions: 11 "-Xmx": "1g" "-Xms": "1g" readinessProbe: 12 initialDelaySeconds: 15 timeoutSeconds: 5 livenessProbe: initialDelaySeconds: 15 timeoutSeconds: 5 image: my-org/my-image:latest 13 template: 14 pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" bridgeContainer: 15 env: - name: OTEL_SERVICE_NAME value: my-otel-service - name: OTEL_EXPORTER_OTLP_ENDPOINT value: "http://otlp-host:4317" tracing: type: opentelemetry 16
- 1
- 副本节点的数量。
- 2
- 用于连接到目标 Kafka 集群的 bootstrap 服务器。使用 Kafka 集群的名称作为 < cluster_name>。
- 3
- TLS 加密,使用密钥名称,其中 TLS 证书存储为源 Kafka 集群的 X.509 格式。如果证书存储在同一 secret 中,则可以多次列出。
- 4
- Kafka Bridge 集群的身份验证,指定为 mTLS、基于令牌的 OAuth、基于 SASL 的 SCRAM-SHA-256/SCRAM-SHA-512 或 PLAIN。默认情况下,Kafka Bridge 在没有身份验证的情况下连接到 Kafka 代理。
- 5
- 对 Kafka 代理的 HTTP 访问。
- 6
- CORS 访问指定所选资源和访问方法。请求中的其他 HTTP 标头描述了允许访问 Kafka 集群的源。
- 7
- 消费者配置选项。
- 8
- 制作者配置选项。
- 9
- 用于保留支持的资源、当前
cpu
和内存
以及限制的请求,以指定可消耗的最大资源。 - 10
- 指定 Kafka Bridge 日志记录器和日志级别直接(
内联
)或通过 ConfigMap 间接(外部
)。自定义 Log4j 配置必须放在 ConfigMap 中的log4j.properties
或log4j2.properties
键下。对于 Kafka Bridge loggers,您可以将日志级别设置为 INFO, ERROR, WARN, TRACE, DEBUG, FATAL 或 OFF。 - 11
- JVM 配置选项,用于优化运行 Kafka Bridge 的虚拟机(VM)的性能。
- 12
- 健康检查以了解何时重启容器(持续)以及容器可以接受流量(就绪状态)。
- 13
- 可选:容器镜像配置,仅在特殊情况下推荐。
- 14
- 模板自定义。此处的 pod 使用反关联性调度,因此 pod 不会调度到具有相同主机名的节点。
- 15
- 为分布式追踪设置环境变量。
- 16
- 使用 OpenTelemetry 启用分布式追踪。
8.10. 配置 Kafka 和 ZooKeeper 存储
作为有状态应用程序,Kafka 和 ZooKeeper 将数据存储在磁盘上。对于这个数据,AMQ Streams 支持三种存储类型:
- Ephemeral (推荐只在开发时使用)
- 持久性
- JBOD (仅限 Kafka )
在配置 Kafka
资源时,您可以指定 Kafka 代理及其对应 ZooKeeper 节点使用的存储类型。您可以使用以下资源中的 storage
属性配置存储类型:
-
Kafka.spec.kafka
-
Kafka.spec.zookeeper
存储类型在 type
字段中配置。
有关存储配置属性的更多信息,请参阅 schema 参考:
部署 Kafka 集群后无法更改存储类型。
8.10.1. 数据存储注意事项
要使 AMQ Streams 正常工作,有效的数据存储基础架构至关重要。我们强烈建议您使用块存储。AMQ Streams 仅测试用于块存储。文件存储(如 NFS)没有被测试,无法保证它可以正常工作。
为您的块存储选择以下选项之一:
- 基于云的块存储解决方案,如 Amazon Elastic Block Store (EBS)
- 使用 本地持久性卷的持久性存储
- 由 光纤通道或 iSCSI等协议访问的存储区域网络(SAN)卷
AMQ Streams 不需要 OpenShift 原始块卷。
8.10.1.1. 文件系统
Kafka 使用文件系统来存储信息。AMQ Streams 与 XFS 和 ext4 文件系统兼容,它们通常与 Kafka 一起使用。在选择和设置文件系统时,请考虑部署的底层架构和要求。
如需更多信息,请参阅 Kafka 文档中的 Filesystem Selection。
8.10.1.2. 磁盘用量
为 Apache Kafka 和 ZooKeeper 使用单独的磁盘。
虽然使用固态驱动器 (SSD) 并不是必须的,但它可以在大型集群中提高 Kafka 的性能,其中数据会异步发送到多个主题,并从多个主题接收。SSD 与 ZooKeeper 特别有效,这需要快速、低延迟数据访问。
您不需要置备复制存储,因为 Kafka 和 ZooKeeper 都有内置数据复制。
8.10.2. 临时存储
临时数据存储是临时的。节点上的所有 pod 共享本地临时存储空间。只要使用它的 pod 正在运行,数据就会保留。当 pod 被删除时,数据会丢失。虽然 pod 可以在高可用性环境中恢复数据。
由于其临时性质,仅推荐使用临时存储进行开发和测试。
临时存储使用 emptyDir
卷来存储数据。当 pod 分配给节点时,会创建一个 emptyDir
卷。您可以使用 sizeLimit
属性为 emptyDir
设置存储总量。
临时存储不适用于单节点 ZooKeeper 集群或 Kafka 主题,复制因子为 1。
要使用临时存储,您可以将 Kafka
或 ZooKeeper
资源中的存储类型配置设置为 临时
。
临时存储配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: ephemeral # ... zookeeper: # ... storage: type: ephemeral # ...
8.10.2.1. Kafka 日志目录的挂载路径
Kafka 代理使用临时卷来作为挂载到以下路径的日志目录:
/var/lib/kafka/data/kafka-logIDX
其中 IDX
是 Kafka 代理 pod 索引。例如 /var/lib/kafka/data/kafka-log0
。
8.10.3. 持久性存储
持久数据存储在系统中断时保留数据。对于使用持久数据存储的 pod,数据会在 pod 失败后保留,并重启。
动态置备框架可创建带有持久性存储的集群。Pod 配置使用持久性卷声明 (PVC) 在持久性卷 (PV) 上发出存储请求。PV 是代表存储卷的存储资源。PV 独立于使用它们的 pod。PVC 请求创建 pod 时所需的存储量。PV 的底层存储基础架构不需要理解。如果 PV 与存储条件匹配,PVC 会绑定到 PV。
由于其永久性质,建议在生产环境中使用持久性存储。
PVC 可以通过指定 StorageClass 来请求不同类型的持久性存储。存储类定义存储配置集和动态置备 PV。如果没有指定存储类,则使用默认存储类。持久性存储选项可能包括 SAN 存储类型或本地持久性卷。
要使用持久性存储,您可以将 Kafka
或 ZooKeeper
资源中的存储类型配置设置为 persistent-claim
。
在生产环境中,建议进行以下配置:
-
对于 Kafka,使用一个或多个
type: persistent-claim
卷配置type: jbod
-
对于 ZooKeeper,配置
type: persistent-claim
持久性存储还具有以下配置选项:
id
(可选)-
存储标识号。对于 JBOD 存储声明中定义的存储卷,这个选项是必须的。默认值为
0。
Size
(必需)- 持久性卷声明的大小,如 "1000Gi"。
类
(可选)-
用于动态卷置备的 OpenShift StorageClass。
存储类
配置包括详细描述卷配置集的参数。 selector
(可选)- 配置以指定特定 PV。提供 key:value 对,代表所选卷的标签。
deleteClaim
(optional)-
布尔值,用于指定在卸载集群时是否删除 PVC。默认为
false
。
只有在支持持久性卷大小的 OpenShift 版本中才支持增加现有 AMQ Streams 集群中的持久性卷大小。要重新定义大小的持久性卷必须使用支持卷扩展的存储类。对于不支持卷扩展的 OpenShift 和存储类的其他版本,您必须在部署集群前决定必要的存储大小。无法减少现有持久性卷的大小。
Kafka 和 ZooKeeper 持久性存储配置示例
# ... spec: kafka: # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false - id: 1 type: persistent-claim size: 100Gi deleteClaim: false - id: 2 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: storage: type: persistent-claim size: 1000Gi # ...
如果没有指定存储类,则使用默认值。以下示例指定了存储类。
使用特定存储类的持久性存储配置示例
# ... storage: type: persistent-claim size: 1Gi class: my-storage-class # ...
使用选择器 (selector
)来指定提供某些功能的标记的持久性卷,如 SSD。
使用选择器的持久性存储配置示例
# ... storage: type: persistent-claim size: 1Gi selector: hdd-type: ssd deleteClaim: true # ...
8.10.3.1. 存储类覆盖
您可以为一个或多个 Kafka 代理或 ZooKeeper 节点指定不同的存储类,而不是使用默认存储类。例如,当存储类仅限于不同的可用区或数据中心时,这非常有用。您可以使用 overrides
字段来实现这一目的。
在本例中,默认存储类名为 my-storage-class
:
使用存储类覆盖的 AMQ Streams 集群示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: labels: app: my-cluster name: my-cluster namespace: myproject spec: # ... kafka: replicas: 3 storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false class: my-storage-class overrides: - broker: 0 class: my-storage-class-zone-1a - broker: 1 class: my-storage-class-zone-1b - broker: 2 class: my-storage-class-zone-1c # ... # ... zookeeper: replicas: 3 storage: deleteClaim: true size: 100Gi type: persistent-claim class: my-storage-class overrides: - broker: 0 class: my-storage-class-zone-1a - broker: 1 class: my-storage-class-zone-1b - broker: 2 class: my-storage-class-zone-1c # ...
由于配置的 overrides
属性,卷使用以下存储类:
-
ZooKeeper 节点 0 的持久性卷使用
my-storage-class-zone-1a
。 -
ZooKeeper 节点 1 的持久性卷使用
my-storage-class-zone-1b
。 -
ZooKeeepr 节点 2 的持久性卷使用
my-storage-class-zone-1c
。 -
Kafka 代理 0 的持久性卷使用
my-storage-class-zone-1a
。 -
Kafka 代理 1 的持久性卷使用
my-storage-class-zone-1b
。 -
Kafka 代理 2 的持久性卷使用
my-storage-class-zone-1c
。
overrides
属性目前仅用于覆盖存储类配置。目前不支持对其他存储配置属性覆盖。目前不支持其他存储配置属性。
8.10.3.2. 持久性存储的 PVC 资源
使用持久性存储时,它会使用以下名称创建 PVC:
data-cluster-name-kafka-idx
-
用于存储 Kafka 代理 pod
idx
数据的卷的 PVC。 data-cluster-name-zookeeper-idx
-
用于为 ZooKeeper 节点 pod
idx
存储数据的卷的 PVC。
8.10.3.3. Kafka 日志目录的挂载路径
Kafka 代理使用持久性卷作为挂载到以下路径的日志目录:
/var/lib/kafka/data/kafka-logIDX
其中 IDX
是 Kafka 代理 pod 索引。例如 /var/lib/kafka/data/kafka-log0
。
8.10.4. 重新调整持久性卷大小
只要存储基础架构支持,就可以调整集群使用的持久性卷而不造成数据丢失的风险。在配置更新后,AMQ Streams 会指示存储基础架构进行更改。使用 persistent-claim 卷的 AMQ Streams 集群支持存储扩展。
只有在每个代理使用多个磁盘时,才能减少存储。在将磁盘中的所有分区移动到同一代理(intra-broker)或同一集群(集群内)中的其他代理后,您可以删除磁盘。
您无法缩小持久性卷的大小,因为它目前在 OpenShift 中不被支持。
先决条件
- 支持调整大小的 OpenShift 集群。
- Cluster Operator 正在运行。
- 使用支持卷扩展的存储类创建的持久性卷的 Kafka 集群。
流程
编辑集群的
Kafka
资源。更改
size
属性,以增加分配给 Kafka 集群、ZooKeeper 集群或两者的持久性卷大小。-
对于 Kafka 集群,更新
spec.kafka.storage
下的size
属性。 -
对于 ZooKeeper 集群,更新
spec.zookeeper.storage
下的size
属性。
将卷大小增加到
2000Gi
的 Kafka 配置apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: persistent-claim size: 2000Gi class: my-storage-class # ... zookeeper: # ...
-
对于 Kafka 集群,更新
创建或更新资源:
oc apply -f <kafka_configuration_file>
OpenShift 增加所选持久性卷的容量,以响应 Cluster Operator 的请求。完成调整大小后,Cluster Operator 会重启所有使用调整大小的持久性卷的 pod。这会自动发生。
验证集群中相关 pod 的存储容量是否已增加:
oc get pv
带有增加存储的 Kafka 代理 pod
NAME CAPACITY CLAIM pvc-0ca459ce-... 2000Gi my-project/data-my-cluster-kafka-2 pvc-6e1810be-... 2000Gi my-project/data-my-cluster-kafka-0 pvc-82dc78c9-... 2000Gi my-project/data-my-cluster-kafka-1
输出显示了与代理 pod 关联的每个 PVC 的名称。
其他资源
- 有关在 OpenShift 中重新定义持久性卷大小的更多信息,请参阅使用 Kubernetes 调整持久卷。
8.10.5. JBOD 存储
您可以将 AMQ Streams 配置为使用 JBOD,这是多个磁盘或卷的数据存储配置。JBOD 是为 Kafka 代理提供增加数据存储的方法。它还可以提高性能。
Kafka 仅支持 JBOD 存储。
JBOD 配置由一个或多个卷描述,每个卷可以是 临时或 持久。JBOD 卷声明的规则和约束与临时存储和持久性存储的规则和约束相同。例如,在置备后,您无法缩小持久性存储卷的大小,或者当类型为 ephemeral
时无法更改 sizeLimit
的值。
要使用 JBOD 存储,您可以将 Kafka
资源中的存储类型配置设置为 jbod
。volumes
属性允许您描述组成 JBOD 存储阵列或配置的磁盘。
JBOD 存储配置示例
# ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false - id: 1 type: persistent-claim size: 100Gi deleteClaim: false # ...
创建 JBOD 卷后无法更改 ID。您可以从 JBOD 配置中添加或删除卷。
8.10.5.1. JBOD 存储的 PVC 资源
当持久性存储用于声明 JBOD 卷时,它会创建一个具有以下名称的 PVC:
data-id-cluster-name-kafka-idx
-
用于存储 Kafka 代理 pod
idx
数据的卷的 PVC。id
是用于存储 Kafka 代理 pod 数据的卷的 ID。
8.10.5.2. Kafka 日志目录的挂载路径
Kafka 代理使用 JBOD 卷作为挂载到以下路径的日志目录:
/var/lib/kafka/data-id/kafka-logidx
其中 id
是用于存储 Kafka 代理 pod idx
数据的卷的 ID。例如 /var/lib/kafka/data-0/kafka-log0
。
8.10.6. 将卷添加到 JBOD 存储
此流程描述了如何将卷添加到配置为使用 JBOD 存储的 Kafka 集群中。它不能应用到配置为使用任何其他存储类型的 Kafka 集群。
当在过去和删除的 id
下添加新卷时,您必须确保之前使用的 PersistentVolumeClaims
已被删除。
先决条件
- 一个 OpenShift 集群
- 正在运行的 Cluster Operator
- 具有 JBOD 存储的 Kafka 集群
流程
编辑
Kafka
资源中的spec.kafka.storage.volumes
属性。将新卷添加到volumes
数组中。例如,使用 id2
添加新卷:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false - id: 1 type: persistent-claim size: 100Gi deleteClaim: false - id: 2 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: # ...
创建或更新资源:
oc apply -f <kafka_configuration_file>
创建新主题或将现有分区重新分配给新磁盘。
提示Cruise Control 是一个重新分配分区的有效工具。要执行 intra-broker 磁盘平衡,您可以在
KafkaRebalance.spec
下将rebalanceDisk
设置为true
。
8.10.7. 从 JBOD 存储中删除卷
此流程描述了如何从配置为使用 JBOD 存储的 Kafka 集群中删除卷。它不能应用到配置为使用任何其他存储类型的 Kafka 集群。JBOD 存储始终必须包含至少一个卷。
为了避免数据丢失,您必须在删除卷前移动所有分区。
先决条件
- 一个 OpenShift 集群
- 正在运行的 Cluster Operator
- 具有两个或多个卷的 JBOD 存储的 Kafka 集群
流程
从您要删除的磁盘中重新分配所有分区。分区中的任何数据仍被分配给要删除的磁盘。
提示您可以使用
kafka-reassign-partitions.sh
工具重新分配分区。编辑
Kafka
资源中的spec.kafka.storage.volumes
属性。从 volumes 阵列中删除一个或多个卷
。例如,使用 ids1
和2
删除卷:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... storage: type: jbod volumes: - id: 0 type: persistent-claim size: 100Gi deleteClaim: false # ... zookeeper: # ...
创建或更新资源:
oc apply -f <kafka_configuration_file>
8.11. 配置 CPU 和内存限值和请求
默认情况下,AMQ Streams Cluster Operator 不会为其部署的操作对象指定 CPU 和内存资源请求和限值。确保足够分配资源对于在 Kafka 中保持稳定性并获得最佳性能至关重要。理想的资源分配取决于您的特定要求和用例。
建议通过 设置适当的请求和限值,为每个容器配置 CPU 和内存资源。
8.12. 配置 pod 调度
为了避免同一 OpenShift 节点上调度的应用程序之间的资源冲突导致性能下降,您可以独立于关键工作负载调度 Kafka pod。这可以通过选择特定节点或专门用于 Kafka 的一组节点来实现。
8.12.1. 指定关联性、容限和拓扑分布限制
使用关联性、容限和拓扑分布约束将 kafka 资源的 pod 调度到节点上。关联性、容限和拓扑分布约束使用以下资源中的 关联性
、tolerations
和 topologySpreadConstraint
属性进行配置:
-
Kafka.spec.kafka.template.pod
-
Kafka.spec.zookeeper.template.pod
-
Kafka.spec.entityOperator.template.pod
-
KafkaConnect.spec.template.pod
-
KafkaBridge.spec.template.pod
-
KafkaMirrorMaker.spec.template.pod
-
KafkaMirrorMaker2.spec.template.pod
关联性
、容限
和 topologySpreadConstraint
属性的格式遵循 OpenShift 规格。关联性配置可以包含不同类型的关联性:
- Pod 关联性和反关联性
- 节点关联性
8.12.1.1. 使用 pod 反关联性以避免关键应用程序共享节点
使用 pod 反关联性来确保关键应用程序永远不会调度到同一磁盘上。在运行 Kafka 集群时,建议使用 pod 反关联性来确保 Kafka 代理不与其他工作负载共享节点,如数据库。
8.12.1.2. 使用节点关联性将工作负载调度到特定的节点上
OpenShift 集群通常由许多不同类型的 worker 节点组成。有些工作负载针对 CPU 重度工作负载(某些用于内存)进行了优化,另一个则针对存储(快速本地 SSD)或网络进行了优化。使用不同节点有助于优化成本和性能。要达到最佳可能的性能,务必要调度 AMQ Streams 组件以使用正确的节点。
OpenShift 使用节点关联性将工作负载调度到特定的节点上。节点关联性允许您为要在其上调度 pod 的节点创建调度约束。约束指定为标签选择器。您可以使用内置节点标签(如 beta.kubernetes.io/instance-type
或自定义标签)来指定该标签,以选择正确的节点。
8.12.1.3. 对专用节点使用节点关联性和容限
使用污点来创建专用节点,然后通过配置节点关联性和容限来在专用节点上调度 Kafka pod。
集群管理员可以将所选 OpenShift 节点标记为污点。具有污点的节点不包括在常规调度中,常规 pod 不会被调度到它们上运行。只有可以容许节点上污点集的服务才能调度到该节点上。此类节点上运行的其他服务是唯一一个系统服务,如日志收集器或软件定义的网络。
在专用节点上运行 Kafka 及其组件会有很多优点。没有其他应用程序在同一节点上运行,这可能会导致距离或消耗 Kafka 所需的资源。从而提高了性能和稳定性。
8.12.2. 配置 pod 反关联性,将每个 Kafka 代理调度到不同的 worker 节点上
许多 Kafka 代理或 ZooKeeper 节点可以在同一 OpenShift worker 节点上运行。如果 worker 节点失败,则它们将同时不可用。要提高可靠性,您可以使用 podAntiAffinity
配置在不同的 OpenShift worker 节点上调度每个 Kafka 代理或 ZooKeeper 节点。
先决条件
- 一个 OpenShift 集群
- 正在运行的 Cluster Operator
流程
编辑指定集群部署的资源中的
affinity
属性。要确保 Kafka 代理或 ZooKeeper 节点没有 worker 节点,请使用strimzi.io/name
标签。将topologyKey
设置为kubernetes.io/hostname
,以指定所选 pod 没有调度到具有相同主机名的节点。这仍然允许同一 worker 节点由单个 Kafka 代理和单个 ZooKeeper 节点共享。例如:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-kafka topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/name operator: In values: - CLUSTER-NAME-zookeeper topologyKey: "kubernetes.io/hostname" # ...
其中
CLUSTER-NAME
是 Kafka 自定义资源的名称。如果您甚至希望确保 Kafka 代理和 ZooKeeper 节点不共享同一 worker 节点,请使用
strimzi.io/cluster
标签。例如:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: strimzi.io/cluster operator: In values: - CLUSTER-NAME topologyKey: "kubernetes.io/hostname" # ...
其中
CLUSTER-NAME
是 Kafka 自定义资源的名称。创建或更新资源。
oc apply -f <kafka_configuration_file>
8.12.3. 在 Kafka 组件中配置 pod 反关联性
Pod 反关联性配置有助于 Kafka 代理的稳定性和性能。通过使用 podAntiAffinity
,OpenShift 不会将 Kafka 代理调度到与其他工作负载相同的节点上。通常,您要避免 Kafka 在与其他网络或存储密集型应用程序(如数据库、存储或其他消息传递平台)相同的 worker 节点上运行。
先决条件
- 一个 OpenShift 集群
- 正在运行的 Cluster Operator
流程
编辑指定集群部署的资源中的
affinity
属性。使用标签指定不应在同一节点上调度的 pod。topologyKey
应设置为kubernetes.io/hostname
,以指定所选 pod 不应调度到具有相同主机名的节点。例如:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: application operator: In values: - postgresql - mongodb topologyKey: "kubernetes.io/hostname" # ... zookeeper: # ...
创建或更新资源。
这可以通过
oc apply
来完成:oc apply -f <kafka_configuration_file>
8.12.4. 在 Kafka 组件中配置节点关联性
先决条件
- 一个 OpenShift 集群
- 正在运行的 Cluster Operator
流程
标记应调度 AMQ Streams 组件的节点。
这可以通过
oc label
来完成:oc label node NAME-OF-NODE node-type=fast-network
或者,也可以重复使用一些现有标签。
编辑指定集群部署的资源中的
affinity
属性。例如:apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: node-type operator: In values: - fast-network # ... zookeeper: # ...
创建或更新资源。
这可以通过
oc apply
来完成:oc apply -f <kafka_configuration_file>
8.12.5. 设置专用节点并在其上调度 pod
先决条件
- 一个 OpenShift 集群
- 正在运行的 Cluster Operator
流程
- 选择应用作专用的节点。
- 确保没有在这些节点上调度工作负载。
在所选节点上设置污点:
这可以通过
oc adm taint
来完成:oc adm taint node NAME-OF-NODE dedicated=Kafka:NoSchedule
另外,还要为所选节点添加标签。
这可以通过
oc label
来完成:oc label node NAME-OF-NODE dedicated=Kafka
编辑指定集群部署的资源中的
关联性
和容限
属性。例如:
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka spec: kafka: # ... template: pod: tolerations: - key: "dedicated" operator: "Equal" value: "Kafka" effect: "NoSchedule" affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: dedicated operator: In values: - Kafka # ... zookeeper: # ...
创建或更新资源。
这可以通过
oc apply
来完成:oc apply -f <kafka_configuration_file>
8.13. 配置日志记录级别
在 Kafka 组件和 AMQ Streams operator 的自定义资源中配置日志级别。您可以在自定义资源的 spec.logging
属性中直接指定日志级别。或者,您可以使用 configMapKeyRef
属性在自定义资源中引用的 ConfigMap 中定义日志属性。
使用 ConfigMap 的优点在于,日志记录属性在一个位置维护,并可以被多个资源访问。您还可以为多个资源重复使用 ConfigMap。如果使用 ConfigMap 为 AMQ Streams Operator 指定日志记录器,您也可以附加日志记录规格来添加过滤器。
您可以在日志记录规格中指定 日志类型
:
-
直接指定日志记录级别时的
内联
-
引用 ConfigMap 时的
外部
内联
日志记录配置示例
spec: # ... logging: type: inline loggers: kafka.root.logger.level: INFO
外部日志记录
配置示例
spec: # ... logging: type: external valueFrom: configMapKeyRef: name: my-config-map key: my-config-map-key
ConfigMap 的 name
和 key
的值是必需的。如果没有设置 name
或 key
,则会使用默认日志记录。
8.13.1. Kafka 组件和 Operator 的日志记录选项
有关为特定 Kafka 组件或 Operator 配置日志记录的更多信息,请参阅以下部分。
Kafka 组件日志记录
Operator 日志记录
8.13.2. 为日志创建 ConfigMap
要使用 ConfigMap 定义日志记录属性,您可以创建 ConfigMap,然后将其引用为资源 spec
中的日志记录定义的一部分。
ConfigMap 必须包含适当的日志记录配置。
-
Kafka 组件、ZooZ 和 Kafka Bridge 的
log4j.properties
-
Topic Operator 和 User Operator 的
log4j2.properties
配置必须放在这些属性下。
在此流程中,ConfigMap 为 Kafka 资源定义根日志记录器。
流程
创建 ConfigMap。
您可以将 ConfigMap 创建为 YAML 文件或从属性文件创建。
带有 Kafka 根日志记录器定义的 ConfigMap 示例:
kind: ConfigMap apiVersion: v1 metadata: name: logging-configmap data: log4j.properties: kafka.root.logger.level="INFO"
如果您使用属性文件,请在命令行中指定该文件:
oc create configmap logging-configmap --from-file=log4j.properties
属性文件定义日志配置:
# Define the logger kafka.root.logger.level="INFO" # ...
在资源的
spec
中定义 外部日志记录,将logging.valueFrom.configMapKeyRef.name
设置为 ConfigMap 的名称,并将logging.valueFrom.configMapKeyRef.key
设置为此 ConfigMap 中的键。spec: # ... logging: type: external valueFrom: configMapKeyRef: name: logging-configmap key: log4j.properties
创建或更新资源。
oc apply -f <kafka_configuration_file>
8.13.3. 配置 Cluster Operator 日志
Cluster Operator 日志记录通过名为 strimzi-cluster-operator
的 ConfigMap
来配置。安装 Cluster Operator 时会创建一个包含日志记录配置的 ConfigMap
。文件的 install/cluster-operator/050-
中描述了此 ConfigMap。您可以通过更改此 ConfigMap
-strimzi-cluster-operator.yamlConfigMap
中的 data.log4j2.properties
值来配置 Cluster Operator 日志记录。
要更新日志记录配置,您可以编辑 050-ConfigMap-strimzi-cluster-operator.yaml
文件,然后运行以下命令:
oc create -f install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml
或者,直接编辑 ConfigMap
:
oc edit configmap strimzi-cluster-operator
使用这个 ConfigMap,您可以控制日志记录的各个方面,包括根日志记录器级别、日志输出格式和不同组件的日志级别。monitorInterval
设置决定了日志记录配置重新加载的频率。您还可以控制 Kafka AdminClient
、ZooKTrustManager
、Netty 和 OkHttp 客户端的日志级别。Netnetty 是 AMQ Streams 用于网络通信的框架,而 OkHttp 是用于发出 HTTP 请求的库。
如果在部署 Cluster Operator 时缺少 ConfigMap
,则使用默认的日志记录值。
如果在部署 Cluster Operator 后意外删除 ConfigMap
,则会使用最近载入的日志配置。创建新的 ConfigMap
以加载新的日志记录配置。
不要从 ConfigMap
中删除 monitorInterval
选项。
8.13.4. 在 AMQ Streams operator 中添加日志记录过滤器
如果您使用 ConfigMap 为 AMQ Streams operator 配置(log4j2)日志记录级别,您还可以定义日志记录过滤器来限制日志中返回的内容。
当您有大量日志信息时,日志记录过滤器很有用。假设您将日志记录器的日志级别设置为 DEBUG (rootLogger.level="DEBUG"
)。日志记录过滤器减少了该级别为日志记录器返回的日志数量,以便您可以专注于特定资源。当设置了过滤器时,只会记录与过滤器匹配的日志消息。
过滤器使用 标记来指定 日志中要包含的内容。您可以为标记指定一个 kind、namespace 和 name。例如,如果 Kafka 集群失败,您可以通过将 kind 指定为 Kafka
来隔离日志,并使用故障集群的命名空间和名称。
本例显示了一个名为 my-kafka-cluster
的 Kafka 集群的标记过滤器。
基本日志记录过滤器配置
rootLogger.level="INFO" appender.console.filter.filter1.type=MarkerFilter 1 appender.console.filter.filter1.onMatch=ACCEPT 2 appender.console.filter.filter1.onMismatch=DENY 3 appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster) 4
您可以创建一个或多个过滤器。在这里,为两个 Kafka 集群过滤日志。
多个日志记录过滤器配置
appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster-1) appender.console.filter.filter2.type=MarkerFilter appender.console.filter.filter2.onMatch=ACCEPT appender.console.filter.filter2.onMismatch=DENY appender.console.filter.filter2.marker=Kafka(my-namespace/my-kafka-cluster-2)
在 Cluster Operator 中添加过滤器
要将过滤器添加到 Cluster Operator 中,请更新其日志记录 ConfigMap YAML 文件(install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml
)。
流程
更新
050-ConfigMap-strimzi-cluster-operator.yaml
文件,将过滤器属性添加到 ConfigMap 中。在本例中,过滤器属性只返回
my-kafka-cluster
Kafka 集群的日志:kind: ConfigMap apiVersion: v1 metadata: name: strimzi-cluster-operator data: log4j2.properties: #... appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=Kafka(my-namespace/my-kafka-cluster)
或者,直接编辑
ConfigMap
:oc edit configmap strimzi-cluster-operator
如果您更新了 YAML 文件而不是直接编辑
ConfigMap
,请通过部署 ConfigMap 来应用更改:oc create -f install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml
在主题 Operator 或 User Operator 中添加过滤器
要在主题 Operator 或 User Operator 中添加过滤器,请创建或编辑日志记录 ConfigMap。
在此过程中,使用 Topic Operator 的过滤器创建日志记录 ConfigMap。用户 Operator 使用相同的方法。
流程
创建 ConfigMap。
您可以将 ConfigMap 创建为 YAML 文件或从属性文件创建。
在本例中,过滤器属性只返回
my-topic
主题的日志:kind: ConfigMap apiVersion: v1 metadata: name: logging-configmap data: log4j2.properties: rootLogger.level="INFO" appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=KafkaTopic(my-namespace/my-topic)
如果您使用属性文件,请在命令行中指定该文件:
oc create configmap logging-configmap --from-file=log4j2.properties
属性文件定义日志配置:
# Define the logger rootLogger.level="INFO" # Set the filters appender.console.filter.filter1.type=MarkerFilter appender.console.filter.filter1.onMatch=ACCEPT appender.console.filter.filter1.onMismatch=DENY appender.console.filter.filter1.marker=KafkaTopic(my-namespace/my-topic) # ...
在资源的
spec
中定义 外部日志记录,将logging.valueFrom.configMapKeyRef.name
设置为 ConfigMap 的名称,并将logging.valueFrom.configMapKeyRef.key
设置为此 ConfigMap 中的键。对于主题 Operator,日志记录在
Kafka
资源的topicOperator
配置中指定。spec: # ... entityOperator: topicOperator: logging: type: external valueFrom: configMapKeyRef: name: logging-configmap key: log4j2.properties
- 通过部署 Cluster Operator 来应用更改:
create -f install/cluster-operator -n my-cluster-operator-namespace
8.14. 使用 ConfigMap 添加配置
使用 ConfigMap
资源在 AMQ Streams 部署中添加特定的配置。ConfigMap 使用键值对来存储非机密数据。添加到 ConfigMap 的配置数据在一个位置维护,并可在组件间重复使用。
ConfigMap 只能存储以下类型的配置数据:
- 日志记录配置
- 指标配置
- Kafka 连接连接器的外部配置
您不能将 ConfigMap 用于其他配置区域。
在配置组件时,您可以使用 configMapKeyRef
属性添加对 ConfigMap 的引用。
例如,您可以使用 configMapKeyRef
引用为日志记录提供配置的 ConfigMap。您可以使用 ConfigMap 传递一个 Log4j 配置文件。您可以添加对 日志记录配置
的引用。
日志的 ConfigMap 示例
spec: # ... logging: type: external valueFrom: configMapKeyRef: name: my-config-map key: my-config-map-key
要将 ConfigMap 用于指标配置,您可以以同样的方式添加对组件的 metricsConfig
配置的引用。
externalConfiguration
属性从挂载到 pod 的 ConfigMap (或 Secret)中的数据作为环境变量或卷提供。您可以将外部配置数据用于 Kafka Connect 使用的连接器。数据可能与外部数据源相关,提供连接器与该数据源通信所需的值。
例如,您可以使用 configMapKeyRef
属性将 ConfigMap 中的配置数据作为环境变量传递。
提供环境变量值的 ConfigMap 示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: # ... externalConfiguration: env: - name: MY_ENVIRONMENT_VARIABLE valueFrom: configMapKeyRef: name: my-config-map key: my-key
如果您使用外部管理的 ConfigMap,请使用配置供应商加载 ConfigMap 中的数据。
8.14.1. 命名自定义 ConfigMap
AMQ Streams 在部署到 OpenShift 时 创建自己的 ConfigMap 和其他资源。ConfigMap 包含运行组件所需的数据。不得编辑 AMQ Streams 创建的 ConfigMap。
确保您创建的任何自定义 ConfigMap 的名称都与这些默认 ConfigMap 的名称相同。如果它们具有相同的名称,则它们将被覆盖。例如,如果您的 ConfigMap 与 Kafka 集群的 ConfigMap 的名称相同,则在对 Kafka 集群有更新时会覆盖它。
其他资源
- Kafka 集群资源列表 (包括 ConfigMap)
- 日志记录配置
-
metricsConfig
-
ExternalConfiguration
模式参考 - 从外部来源加载配置值
8.15. 从外部来源加载配置值
使用配置提供程序从外部来源加载配置数据。供应商独立于 AMQ Streams 运行。您可以使用它们为所有 Kafka 组件加载配置数据,包括制作者和消费者。您可以在组件的配置中引用外部源并提供访问权限。供应商在不需要重启 Kafka 组件或提取文件的情况下加载数据,即使引用新的外部源。例如,使用 provider 为 Kafka Connect 连接器配置提供凭证。该配置必须包含对外部源的任何访问权限。
8.15.1. 启用配置供应商
您可以使用组件的 spec
配置中的 config.providers
属性启用一个或多个配置供应商。
启用配置供应商的示例配置
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect annotations: strimzi.io/use-connector-resources: "true" spec: # ... config: # ... config.providers: env config.providers.env.class: io.strimzi.kafka.EnvVarConfigProvider # ...
- KubernetesSecretConfigProvider
- 从 OpenShift 机密加载配置数据。您可以在存储配置数据的 secret 中指定 secret 的名称和密钥。此提供程序可用于存储敏感配置数据,如密码或其他用户凭据。
- KubernetesConfigMapConfigProvider
- 从 OpenShift 配置映射加载配置数据。您可以在保存配置数据的配置映射中指定配置映射的名称和密钥。此提供程序可用于存储非敏感配置数据。
- EnvVarConfigProvider
- 从环境变量加载配置数据。您可以指定存储数据的环境变量的名称。此提供程序可用于配置容器中运行的应用程序,例如从从 secret 映射的环境变量加载证书或 JAAS 配置。
- FileConfigProvider
- 从文件中加载配置数据。您可以指定存储数据的文件的路径。此提供程序可用于从挂载到容器中的文件中加载配置数据。
- DirectoryConfigProvider
- 从目录中的文件加载配置数据。您可以指定存储配置文件的目录路径。此提供程序可用于加载多个配置文件并将配置数据整理到单独的文件中。
要使用作为 OpenShift Configuration Provider 插件一部分的 KubernetesSecretConfigProvider
和 KubernetesConfigMapConfigProvider
,您必须为包含配置文件的命名空间设置访问权限。
您可以在不设置访问权限的情况下使用其他供应商。您可以通过执行以下操作为 Kafka Connect 或 MirrorMaker 2 提供连接器配置:
- 将配置映射或 secret 挂载到 Kafka Connect pod 中作为环境变量或卷
-
在 Kafka Connect 或 MirrorMaker 2 配置中启用
EnvVarConfigProvider
、FileConfigProvider
或DirectoryConfigProvider
-
使用
KafkaConnect
或KafkaMirrorMaker2
资源spec
中的externalConfiguration
属性传递连接器配置
使用供应商有助于防止通过 Kafka Connect REST 接口传递受限信息。您可以使用以下场景使用此方法:
- 使用连接器用来连接和与数据源通信的值挂载环境变量
- 使用用于配置 Kafka 连接连接器的值挂载属性文件
- 将文件挂载到包含 TLS 信任存储的值和连接器使用的密钥存储值的目录中
在为连接器使用新的 Secret
或 ConfigMap
时,需要重启,这可能会破坏其他连接器。
8.15.2. 从 secret 或配置映射加载配置值
使用 KubernetesSecretConfigProvider
从 secret 或 KubernetesConfigMapConfigProvider
提供配置属性,以便从配置映射中提供配置属性。
在此过程中,配置映射为连接器提供配置属性。属性指定为配置映射的键值。配置映射作为卷挂载到 Kafka Connect pod 中。
先决条件
- Kafka 集群正在运行。
- Cluster Operator 正在运行。
- 您有一个包含连接器配置的配置映射。
带有连接器属性的配置映射示例
apiVersion: v1 kind: ConfigMap metadata: name: my-connector-configuration data: option1: value1 option2: value2
流程
配置
KafkaConnect
资源。-
启用
KubernetesConfigMapConfigProvider
此处显示的规格支持从配置映射和 secret 加载值。
使用配置映射和 secret 的 Kafka Connect 配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect annotations: strimzi.io/use-connector-resources: "true" spec: # ... config: # ... config.providers: secrets,configmaps 1 config.providers.configmaps.class: io.strimzi.kafka.KubernetesConfigMapConfigProvider 2 config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider 3 # ...
-
启用
创建或更新资源以启用供应商。
oc apply -f <kafka_connect_configuration_file>
创建一个允许访问外部配置映射中值的角色。
从配置映射中访问值的角色示例
apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: connector-configuration-role rules: - apiGroups: [""] resources: ["configmaps"] resourceNames: ["my-connector-configuration"] verbs: ["get"] # ...
规则授予访问
my-connector-configuration
配置映射的角色权限。创建角色绑定,以允许访问包含配置映射的命名空间。
访问包含配置映射的命名空间的角色绑定示例
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: connector-configuration-role-binding subjects: - kind: ServiceAccount name: my-connect-connect namespace: my-project roleRef: kind: Role name: connector-configuration-role apiGroup: rbac.authorization.k8s.io # ...
角色绑定授予访问
my-project
命名空间的角色权限。服务帐户必须是 Kafka Connect 部署使用的相同。服务帐户名称为 <
cluster_name>-connect
,其中 <cluster_name
> 是KafkaConnect
自定义资源的名称。在连接器配置中引用配置映射。
引用配置映射的连接器配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-connector labels: strimzi.io/cluster: my-connect spec: # ... config: option: ${configmaps:my-project/my-connector-configuration:option1} # ... # ...
占位符结构是
configmaps:<path_and_file_name>:<property>
。KubernetesConfigMapConfigProvider
从外部配置映射读取并提取option1
属性值。
8.15.3. 从环境变量加载配置值
使用 EnvVarConfigProvider
将配置属性作为环境变量提供。环境变量可以包含配置映射或 secret 的值。
在此过程中,环境变量为连接器提供与 Amazon AWS 通信的配置属性。连接器必须能够读取 AWS_ACCESS_KEY_ID
和 AWS_SECRET_ACCESS_KEY
。环境变量的值派生自挂载到 Kafka Connect pod 的 secret。
用户定义的环境变量的名称不能以 KAFKA_
或 STRIMZI_
开头。
先决条件
- Kafka 集群正在运行。
- Cluster Operator 正在运行。
- 您有一个包含连接器配置的 secret。
带有环境变量值的 secret 示例
apiVersion: v1 kind: Secret metadata: name: aws-creds type: Opaque data: awsAccessKey: QUtJQVhYWFhYWFhYWFhYWFg= awsSecretAccessKey: Ylhsd1lYTnpkMjl5WkE=
流程
配置
KafkaConnect
资源。-
启用
EnvVarConfigProvider
-
使用
externalConfiguration
属性指定环境变量。
使用外部环境变量的 Kafka 连接配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect annotations: strimzi.io/use-connector-resources: "true" spec: # ... config: # ... config.providers: env 1 config.providers.env.class: io.strimzi.kafka.EnvVarConfigProvider 2 # ... externalConfiguration: env: - name: AWS_ACCESS_KEY_ID 3 valueFrom: secretKeyRef: name: aws-creds 4 key: awsAccessKey 5 - name: AWS_SECRET_ACCESS_KEY valueFrom: secretKeyRef: name: aws-creds key: awsSecretAccessKey # ...
注意secretKeyRef
属性引用 secret 中的密钥。如果您使用配置映射而不是 secret,请使用configMapKeyRef
属性。-
启用
创建或更新资源以启用供应商。
oc apply -f <kafka_connect_configuration_file>
在连接器配置中引用环境变量。
引用环境变量的连接器配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-connector labels: strimzi.io/cluster: my-connect spec: # ... config: option: ${env:AWS_ACCESS_KEY_ID} option: ${env:AWS_SECRET_ACCESS_KEY} # ... # ...
占位符结构是
env:<environment_variable_name>
。EnvVarConfigProvider
从挂载的 secret 中读取并提取环境变量值。
8.15.4. 从目录中的文件加载配置值
使用 FileConfigProvider
从目录中的文件提供配置属性。文件可以是配置映射或 secret。
在此过程中,文件为连接器提供配置属性。数据库用户名和密码被指定为 secret 的属性。secret 作为一个卷挂载到 Kafka Connect pod。卷挂载到路径 /opt/kafka/external-configuration/<volume-name
> 上。
先决条件
- Kafka 集群正在运行。
- Cluster Operator 正在运行。
- 您有一个包含连接器配置的 secret。
带有数据库属性的 secret 示例
apiVersion: v1 kind: Secret metadata: name: mysecret type: Opaque stringData: connector.properties: |- 1 dbUsername: my-username 2 dbPassword: my-password
流程
配置
KafkaConnect
资源。-
启用
FileConfigProvider
-
使用
externalConfiguration
属性指定该文件。
使用外部属性文件的 Kafka 连接配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: # ... config: config.providers: file 1 config.providers.file.class: org.apache.kafka.common.config.provider.FileConfigProvider 2 #... externalConfiguration: volumes: - name: connector-config 3 secret: secretName: mysecret 4
-
启用
创建或更新资源以启用供应商。
oc apply -f <kafka_connect_configuration_file>
将连接器配置中的文件属性引用为占位符。
引用该文件的连接器配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector labels: strimzi.io/cluster: my-connect-cluster spec: class: io.debezium.connector.mysql.MySqlConnector tasksMax: 2 config: database.hostname: 192.168.99.1 database.port: "3306" database.user: "${file:/opt/kafka/external-configuration/connector-config/mysecret:dbUsername}" database.password: "${file:/opt/kafka/external-configuration/connector-config/mysecret:dbPassword}" database.server.id: "184054" #...
占位符结构是
文件:<path_and_file_name>:<property>
。FileConfigProvider
从挂载的 secret 中读取并提取数据库 username 和 password 属性值。
8.15.5. 从目录中的多个文件加载配置值
使用 DirectoryConfigProvider
从目录中的多个文件中提供配置属性。文件可以是配置映射或 secret。
在此过程中,secret 为连接器提供 TLS 密钥存储和信任存储用户凭证。凭据位于单独的文件中。secret 作为卷挂载到 Kafka Connect pod 中。卷挂载到路径 /opt/kafka/external-configuration/<volume-name
> 上。
先决条件
- Kafka 集群正在运行。
- Cluster Operator 正在运行。
- 您有一个包含用户凭证的 secret。
使用用户凭证的 secret 示例
apiVersion: v1 kind: Secret metadata: name: my-user labels: strimzi.io/kind: KafkaUser strimzi.io/cluster: my-cluster type: Opaque data: ca.crt: <public_key> # Public key of the clients CA user.crt: <user_certificate> # Public key of the user user.key: <user_private_key> # Private key of the user user.p12: <store> # PKCS #12 store for user certificates and keys user.password: <password_for_store> # Protects the PKCS #12 store
my-user
secret 为连接器提供密钥存储凭据(user.crt
和 user.key
)。
在部署 Kafka 集群时生成的 <cluster_name>-cluster-ca-cert
secret 提供集群 CA 证书作为信任存储凭证(ca.crt
)。
流程
配置
KafkaConnect
资源。-
启用
DirectoryConfigProvider
-
使用
externalConfiguration
属性指定文件。
使用外部属性文件的 Kafka 连接配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnect metadata: name: my-connect spec: # ... config: config.providers: directory 1 config.providers.directory.class: org.apache.kafka.common.config.provider.DirectoryConfigProvider 2 #... externalConfiguration: volumes: 3 - name: cluster-ca 4 secret: secretName: my-cluster-cluster-ca-cert 5 - name: my-user secret: secretName: my-user 6
-
启用
创建或更新资源以启用供应商。
oc apply -f <kafka_connect_configuration_file>
将连接器配置中的文件属性引用为占位符。
引用文件的连接器配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaConnector metadata: name: my-source-connector labels: strimzi.io/cluster: my-connect-cluster spec: class: io.debezium.connector.mysql.MySqlConnector tasksMax: 2 config: # ... database.history.producer.security.protocol: SSL database.history.producer.ssl.truststore.type: PEM database.history.producer.ssl.truststore.certificates: "${directory:/opt/kafka/external-configuration/cluster-ca:ca.crt}" database.history.producer.ssl.keystore.type: PEM database.history.producer.ssl.keystore.certificate.chain: "${directory:/opt/kafka/external-configuration/my-user:user.crt}" database.history.producer.ssl.keystore.key: "${directory:/opt/kafka/external-configuration/my-user:user.key}" #...
占位符结构是
directory:<path>:<file_name>
。DirectoryConfigProvider
从挂载的 secret 中读取并提取凭证。
8.16. 自定义 OpenShift 资源
AMQ Streams 部署会创建 OpenShift 资源,如 Deployment
、Pod
和 Service
资源。这些资源由 AMQ Streams operator 管理。只有负责管理特定 OpenShift 资源的操作器才能更改该资源。如果您尝试手动更改操作器管理的 OpenShift 资源,Operator 将还原您的更改。
如果要执行某些任务,更改 Operator 管理的 OpenShift 资源会很有用,例如:
-
添加自定义标签或注解,以控制 Istio 或其他服务如何处理
Pod
-
管理如何为集群创建
Loadbalancer
-type 服务
要更改 OpenShift 资源,您可以使用各种 AMQ Streams 自定义资源的 spec
部分中的 template
属性。
以下是您可以应用更改的自定义资源列表:
-
Kafka.spec.kafka
-
Kafka.spec.zookeeper
-
Kafka.spec.entityOperator
-
Kafka.spec.kafkaExporter
-
Kafka.spec.cruiseControl
-
KafkaNodePool.spec
-
KafkaConnect.spec
-
KafkaMirrorMaker.spec
-
KafkaMirrorMaker2.spec
-
KafkaBridge.spec
-
KafkaUser.spec
有关这些属性的更多信息,请参阅 AMQ Streams 自定义资源 API 参考。
AMQ Streams 自定义资源 API 参考提供了有关可自定义字段的更多详情。
在以下示例中,template
属性用于修改 Kafka 代理的 pod 中的标签。
模板自定义示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster labels: app: my-cluster spec: kafka: # ... template: pod: metadata: labels: mylabel: myvalue # ...
8.16.1. 自定义镜像拉取策略
AMQ Streams 允许您自定义 Cluster Operator 部署的所有 pod 中容器的镜像拉取策略。镜像拉取策略使用 Cluster Operator 部署中的环境变量 STRIMZI_IMAGE_PULL_POLICY
进行配置。STRIMZI_IMAGE_PULL_POLICY
环境变量可以设置为三个不同的值:
Always
- 每次 pod 启动或重启时,容器镜像都会从 registry 中拉取。
IfNotPresent
- 只有在容器镜像之前没有拉取时才从 registry 中拉取容器镜像。
Never
- 容器镜像从 registry 中拉取。
目前,镜像拉取策略一次只能为所有 Kafka、Kafka Connect 和 Kafka MirrorMaker 集群自定义。更改策略将导致所有 Kafka、Kafka Connect 和 Kafka MirrorMaker 集群的滚动更新。
其他资源
- 中断.
8.16.2. 应用终止宽限期
应用终止宽限期,为 Kafka 集群提供足够时间来完全关闭。
使用 terminationGracePeriodSeconds
属性指定时间。将属性添加到 Kafka
自定义资源的 template.pod
配置中。
您添加的时间将取决于 Kafka 集群的大小。终止宽限期的 OpenShift 默认为 30 秒。如果您发现集群没有完全关闭,您可以提高终止宽限期。
每次 pod 重启时都会应用终止宽限期。当 OpenShift 发送一个 术语 (termination)信号到容器集中运行的进程时,周期开始。周期应反映在终止 pod 停止前将终止 pod 的进程传输到另一个 pod 所需的时间。在周期结束后,kill 信号将停止 pod 中仍在运行的任何进程。
以下示例为 Kafka
自定义资源添加 120 秒的终止宽限期。您还可以在其他 Kafka 组件的自定义资源中指定配置。
终止宽限期配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... template: pod: terminationGracePeriodSeconds: 120 # ... # ...
第 9 章 使用主题 Operator 管理 Kafka 主题
KafkaTopic
资源配置主题,包括分区和复制因素设置。当使用 KafkaTopic
创建、修改或删除主题时,主题 Operator 可确保这些更改反映在 Kafka 集群中。
如需有关 KafkaTopic
资源的更多信息,请参阅 KafkaTopic
模式参考。
9.1. 主题管理模式
KafkaTopic
资源负责管理 Kafka 集群中的单个主题。Topic Operator 提供了两种管理 KafkaTopic
资源和 Kafka 主题的模式:
- 双向模式
- 双向模式需要 ZooKeeper 用于集群管理。在 KRaft 模式中使用 AMQ Streams 不兼容。
- (预览)Unidirectional 模式
- 单向模式不需要 ZooKeeper 进行集群管理。它在 KRaft 模式中使用 AMQ Streams 兼容。
单向主题管理作为技术预览提供。默认情况下,不启用单向主题管理,因此您必须 启用 UnidirectionalTopicOperator
功能门 才能使用它。
9.1.1. 双向主题管理
在双向模式中,主题 Operator 运行如下:
-
当创建、删除或更改
KafkaTopic
时,主题 Operator 会在 Kafka 主题上执行对应的操作。 -
同样,当在 Kafka 集群中创建、删除或更改主题时,主题 Operator 会在
KafkaTopic
资源上执行对应的操作。
尝试坚持管理主题的方法,可以通过 KafkaTopic
资源或在 Kafka 中直接进行。避免在给定主题的两个方法间进行频繁切换。
9.1.2. (预览)Unidirectional 主题管理
在单向模式中,主题 Operator 运行如下:
-
当创建、删除或更改
KafkaTopic
时,主题 Operator 会在 Kafka 主题上执行对应的操作。
如果在 Kafka 集群中直接创建、删除或修改一个主题,且没有对应的 KafkaTopic
资源,则 Topic Operator 不会管理该主题。Topic Operator 只管理与 KafkaTopic
资源关联的 Kafka 主题,不会影响在 Kafka 集群中独立管理的主题。如果 Kafka 主题存在 KafkaTopic
,则会恢复资源外所做的任何配置更改。
9.2. 主题命名约定
KafkaTopic
资源包括主题的名称,以及一个标识它所属的 Kafka 集群名称的标签。
标识 Kafka 集群用于主题处理的标签
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: topic-name-1 labels: strimzi.io/cluster: my-cluster spec: topicName: topic-name-1
该标签提供 Kafka
资源的集群名称。主题 Operator 使用该标签作为确定要管理的 KafkaTopic
资源的机制。如果标签与 Kafka 集群不匹配,则 Topic Operator 无法看到 KafkaTopic
,且不会创建主题。
Kafka 和 OpenShift 都有自己的命名验证规则,Kafka 主题名称在 OpenShift 中可能不是有效的资源名称。如果可能,请尝试并坚持适合两者的命名约定。
请考虑以下指南:
- 使用反映主题性质的主题名称
- 很简洁,并在 63 个字符下保留名称
- 使用所有小写和连字符
- 避免特殊字符、空格或符号
KafkaTopic
资源允许您使用 metadata.name
字段指定 Kafka 主题名称。但是,如果所需的 Kafka 主题名称不是有效的 OpenShift 资源名称,您可以使用 spec.topicName
属性来指定实际名称。spec.topicName
字段是可选的,当不存在时,Kafka 主题名称默认为主题的 metadata.name
。创建主题时,无法稍后更改主题名称。
提供有效 Kafka 主题名称的示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic-1 1 spec: topicName: My.Topic.1 2 # ...
如果多个 KafkaTopic
资源引用同一 Kafka 主题,则首先创建的资源被视为管理该主题的资源。更新较新的资源的状态以指示冲突,并且它们的 Ready
状态更改为 False
。
如果 Kafka 客户端应用程序(如 Kafka Streams)自动创建带有无效 OpenShift 资源名称的主题,则主题 Operator 会在双向模式中使用时生成一个有效的 metadata.name
。它替换无效字符,并将哈希附加到名称中。但是,此行为不适用于(预览)单向模式。
替换无效主题名称的示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic---c55e57fe2546a33f9e603caf57165db4072e827e # ...
如需有关集群中标识符和名称要求的更多信息,请参阅 OpenShift 文档 对象名称和 ID。
9.3. 处理主题的更改
主题 Operator 如何处理对主题的更改取决于 主题管理的模式。
-
对于双向主题管理,配置更改会在 Kafka 主题和
KafkaTopic
资源之间同步。不兼容的更改会优先选择 Kafka 配置,并相应地调整KafkaTopic
资源。 -
对于单向主题管理(当前为预览),配置更改仅进入一个方向:从
KafkaTopic
资源到 Kafka 主题。对KafkaTopic
资源外管理的 Kafka 主题的任何更改都会被恢复。
9.3.1. 双向主题管理的主题存储
对于双向主题管理,当没有单一数据源时,主题 Operator 能够处理对主题的更改。KafkaTopic
资源和 Kafka 主题可以独立修改,其中实时观察更改可能并不总是可行,特别是在 Topic Operator 无法正常工作时。为了解决这个问题,主题 Operator 维护一个主题存储,用于存储有关每个主题的主题配置信息。它将 Kafka 集群和 OpenShift 的状态与主题存储进行比较,以确定同步所需的更改。此评估在启动期间和定期的间隔发生,而主题 Operator 处于活跃状态时。
例如,如果主题 Operator 不活跃,并且在重启后会创建一个名为 my-topic 的新 KafkaTopic
,则主题 Operator 会识别主题存储中没有 my-topic。它识别在最后一次操作后创建的 KafkaTopic
。因此,主题 Operator 生成对应的 Kafka 主题,并将元数据保存在主题存储中。
主题存储可让 Topic Operator 管理在 Kafka 主题和 KafkaTopic
资源中更改主题配置的情况,只要更改兼容。当对 KafkaTopic
自定义资源更新或更改 Kafka 主题配置时,主题存储会在与 Kafka 集群协调后更新,只要更改兼容。
主题存储 基于 Kafka Streams 键值机制,它使用 Kafka 主题来保留状态。主题元数据缓存在内存中,并在主题 Operator 中本地访问。应用到本地内存缓存的操作更新会被保留到磁盘上的备份主题存储中。主题存储会与 Kafka 主题或 OpenShift KafkaTopic
自定义资源的更新同步。操作通过以这种方式设置的主题存储快速处理,但应该崩溃内存缓存崩溃,它会自动从持久性存储中重新填充。
内部主题支持处理主题存储中的主题元数据。
__strimzi_store_topic
- 用于存储主题元数据的输入主题
__strimzi-topic-operator-kstreams-topic-store-changelog
- 保留紧凑主题存储值的日志
不要删除这些主题,因为它们对于 Topic Operator 的运行至关重要。
9.3.2. 将主题元数据从 ZooKeeper 迁移到主题存储
在之前的 AMQ Streams 版本中,主题元数据存储在 ZooKeeper 中。主题存储会删除这个要求,将元数据带到 Kafka 集群,并受 Topic Operator 控制。
当升级到 AMQ Streams 2.5 时,到主题存储的主题 Operator 控制是无缝的。元数据是从 ZooKeeper 查找并迁移,旧存储被删除。
9.3.3. 降级到使用 ZooKeeper 存储主题元数据的 AMQ Streams 版本
如果您要恢复到早于 1.7 的 AMQ Streams 版本,它使用 ZooKeeper 作为主题元数据存储,您仍会将 Cluster Operator 降级到之前的版本,然后将 Kafka 代理和客户端应用程序降级到以前的 Kafka 版本作为标准。
但是,还必须使用 kafka-topics
命令删除为主题存储创建的主题,指定 Kafka 集群的 bootstrap 地址。例如:
oc run kafka-admin -ti --image=registry.redhat.io/amq-streams/kafka-35-rhel8:2.5.1 --rm=true --restart=Never -- ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi-topic-operator-kstreams-topic-store-changelog --delete && ./bin/kafka-topics.sh --bootstrap-server localhost:9092 --topic __strimzi_store_topic --delete
该命令必须与用于访问 Kafka 集群的监听程序和身份验证类型对应。
主题 Operator 将从 Kafka 中的主题状态重建 ZooKeeper 主题元数据。
9.3.4. 自动创建主题
应用程序可以在 Kafka 集群中触发自动创建主题。默认情况下,Kafka 代理配置 auto.create.topics.enable
被设置为 true
,允许代理在应用程序尝试从不存在的主题生成或消耗时自动创建主题。应用程序也可能使用 Kafka AdminClient
自动创建主题。当应用程序与 KafkaTopic
资源一起部署时,在主题 Operator 可以响应 KafkaTopic
前,集群中的自动主题创建可能会发生。
对于双向主题管理,主题 Operator 会同步主题和 KafkaTopic
资源之间的更改。
如果您正在尝试单向主题管理预览,这可能意味着最初为应用部署创建的主题最初创建有默认主题配置。如果主题 Operator 会尝试根据应用程序部署中包含的 KafkaTopic
资源规格重新配置主题,则操作可能会失败,因为不允许对配置进行所需的更改。例如,如果更改意味着减少主题分区的数量。因此,在使用单向主题管理时,建议在 Kafka 集群配置中禁用 auto.create.topics.enable
。
9.4. 配置 Kafka 主题
使用 KafkaTopic
资源的属性来配置 Kafka 主题。对 KafkaTopic
中主题配置所做的更改会被传播到 Kafka。
您可以使用 oc apply
创建或修改主题,oc delete
删除现有的主题。
例如:
-
oc apply -f <topic_config_file>
-
oc delete KafkaTopic <topic_name>
要能够删除主题,必须在 Kafka 资源的 spec.kafka.config
中将 delete.topic.enable
设置为 true
(默认)。
此流程演示了如何创建包含 10 个分区和 2 个副本的主题。
该流程与主题管理的双向和(预览)单向模式相同。
开始前
KafkaTopic 资源不允许以下更改:
-
重命名
spec.topicName
中定义的主题。将检测到spec.topicName
和status.topicName
不匹配。 -
使用
spec.partitions
( Kafka 不支持)减少分区数量。 -
修改
spec.replicas
中指定的副本数量。
增加带有键的主题的 spec.partitions
将更改记录分区,这可能会导致问题,特别是在主题使用语义分区时。
先决条件
- 正在运行的 Kafka 集群使用 mTLS 身份验证和 TLS 加密配置 Kafka 代理监听程序。
- 正在运行的主题 Operator (通常使用 Entity Operator 部署)。
-
要删除主题,
delete.topic.enable=true
(默认)在Kafka
资源的spec.kafka.config
中。
流程
配置
KafkaTopic
资源。Kafka 主题配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2
提示修改主题时,您可以使用
oc get kafkatopic my-topic-1 -o yaml
获取资源的当前版本。在 OpenShift 中创建
KafkaTopic
资源。oc apply -f <topic_config_file>
等待主题的就绪状态更改为
True
:oc get kafkatopics -o wide -w -n <namespace>
Kafka 主题状态
NAME CLUSTER PARTITIONS REPLICATION FACTOR READY my-topic-1 my-cluster 10 3 True my-topic-2 my-cluster 10 3 my-topic-3 my-cluster 10 3 True
当
READY
输出显示为True
时,主题创建成功。如果
READY
列留空,请从资源 YAML 或 Topic Operator 日志中获取有关状态的更多详细信息。状态信息提供有关当前状态原因的详细信息。
oc get kafkatopics my-topic-2 -o yaml
有关具有
NotReady
状态的主题详情# ... status: conditions: - lastTransitionTime: "2022-06-13T10:14:43.351550Z" message: Number of partitions cannot be decreased reason: PartitionDecreaseException status: "True" type: NotReady
在本例中,主题未就绪的原因是,原始分区数量在
KafkaTopic
配置中被减少。Kafka 不支持此功能。重置主题配置后,status 会显示主题已就绪。
oc get kafkatopics my-topic-2 -o wide -w -n <namespace>
主题的状态更新
NAME CLUSTER PARTITIONS REPLICATION FACTOR READY my-topic-2 my-cluster 10 3 True
获取详情不显示任何信息
oc get kafkatopics my-topic-2 -o yaml
有关具有
READY
状态的主题详情# ... status: conditions: - lastTransitionTime: '2022-06-13T10:15:03.761084Z' status: 'True' type: Ready
9.5. 为复制和分区数量配置主题
由主题 Operator 管理的主题的建议配置是 3 的主题复制因素,最少为 2 个同步副本。
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic labels: strimzi.io/cluster: my-cluster spec: partitions: 10 1 replicas: 3 2 config: min.insync.replicas: 2 3 #...
in-sync 副本与生成者应用程序的 acks
配置一起使用。acks
配置决定了在确认消息被成功收到之前必须复制到的后续分区数量。双向主题 Operator 使用 acks=all
运行,用于其内部主题,其中消息必须被所有同步的副本确认。
当通过添加或删除代理来扩展 Kafka 集群时,复制因素配置不会被更改,且不会自动重新分配副本。但是,您可以使用 kafka-reassign-partitions.sh
工具更改复制因素,并手动将副本重新分配给代理。
另外,虽然 AMQ Streams 的 Cruise Control 集成无法更改主题的复制因素,但为重新平衡 Kafka 生成的优化提议包括传输分区副本和更改分区领导的命令。
9.6. (预览)管理 KafkaTopic 资源,而不影响 Kafka 主题
此流程描述了如何当前通过 KafkaTopic
资源管理的 Kafka 主题转换为非管理的主题。此功能在各种情况下非常有用。例如,您可能想要更新 KafkaTopic
资源的 metadata.name
。您只能通过删除原始 KafkaTopic
资源并重新创建新资源来完成此操作。
通过使用 strimzi.io/managed=false
注解 KafkaTopic
资源,这表示 Topic Operator 应该不再管理该特定主题。这可让您在更改资源的配置或其他管理任务时保留 Kafka 主题。
如果您使用单向主题管理,您可以执行此任务。
单向主题管理作为技术预览提供。默认情况下,不启用单向主题管理,因此您必须 启用 UnidirectionalTopicOperator
功能门 才能使用它。
流程
在 OpenShift 中注解
KafkaTopic
资源,将strimzi.io/managed
设置为false
:oc annotate kafkatopic my-topic-1 strimzi.io/managed=false
在
KafkaTopic
资源中指定主题的metadata.name
,本例中为my-topic-1
。检查
KafkaTopic
资源的状态,以确保请求成功:oc get kafkatopics my-topic-1 -o yaml
具有
Ready
状态的主题示例apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 124 name: my-topic-1 finalizer: strimzi.io/topic-operator labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2 # ... status: observedGeneration: 124 1 topicName: my-topic-1 conditions: - type: Ready status: True lastTransitionTime: 20230301T103000Z
- 1
- 资源成功协调意味着主题不再管理。
metadata.generation
(部署的当前版本)的值必须与 status.observedGeneration (资源的最新协调)匹配
。现在,您可以在不影响管理的 Kafka 主题的情况下更改
KafkaTopic
资源。例如,要更改
metadata.name
,请执行以下操作:删除原始
KafkTopic
资源:oc delete kafkatopic <kafka_topic_name>
-
重新创建具有不同
metadata.name
的KafkTopic
资源,但使用spec.topicName
来引用由原始管理的相同主题
-
如果您没有删除原始
KafkaTopic
资源,并且您希望再次恢复管理 Kafka 主题,请将strimzi.io/managed
注解设置为true
或删除注解。
9.7. (预览)为现有 Kafka 主题启用主题管理
此流程描述了如何为当前没有通过 KafkaTopic
资源管理的主题启用主题管理。您可以通过创建匹配的 KafkaTopic
资源来实现此目的。
如果您使用单向主题管理,您可以执行此任务。
单向主题管理作为技术预览提供。默认情况下,不启用单向主题管理,因此您必须 启用 UnidirectionalTopicOperator
功能门 才能使用它。
流程
使用与 Kafka 主题相同的
metadata.name
创建KafkaTopic
资源。或者,如果 Kafka 中的主题名称不是法律 OpenShift 资源名称,则使用
spec.topicName
。Kafka 主题配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2
在本例中,Kafka 主题名为
my-topic-1
。主题 Operator 检查主题是否由另一个
KafkaTopic
资源管理。如果是,旧的资源具有优先权,并在新资源状态中返回资源冲突错误。应用
KafkaTopic
资源:oc apply -f <topic_configuration_file>
等待 Operator 更新 Kafka 中的主题。
Operator 使用具有相同名称的
KafkaTopic
的spec
更新 Kafka 主题。检查
KafkaTopic
资源的状态,以确保请求成功:oc get kafkatopics my-topic-1 -o yaml
具有
Ready
状态的主题示例apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 1 name: my-topic-1 labels: strimzi.io/cluster: my-cluster spec: partitions: 10 replicas: 2 # ... status: observedGeneration: 1 1 topicName: my-topic-1 conditions: - type: Ready status: True lastTransitionTime: 20230301T103000Z
- 1
- 对资源成功协调意味着主题现已被管理。
metadata.generation
(部署的当前版本)的值必须与 status.observedGeneration (资源的最新协调)匹配
。
9.8. (预览)删除受管主题
单向主题管理支持通过 KafkaTopic
资源删除通过 OpenShift 终结器管理的主题。这由 STRIMZI_USE_FINALIZERS
Topic Operator 环境变量控制。默认情况下,这被设置为 true
,但如果您不想 主题 Operator 来添加终结器,则可以在主题 Operator env
配置中将其设置为 false
。
单向主题管理作为技术预览提供。默认情况下,不启用单向主题管理,因此您必须 启用 UnidirectionalTopicOperator
功能门 才能使用它。
终结器(finalizers)可确保按顺序控制地删除 KafkaTopic
资源。Topic Operator 的终结器添加到 KafkaTopic
资源的元数据中:
控制删除主题的终结器
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 1 name: my-topic-1 finalizer: strimzi.io/topic-operator labels: strimzi.io/cluster: my-cluster
在本例中,为主题 my-topic-1
添加了终结器。finalizer 会阻止主题被完全删除,直到最终化过程完成为止。如果使用 oc delete kafkatopic my-topic-1
删除主题,则会在元数据中添加时间戳:
删除时的终结器时间戳
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaTopic metadata: generation: 1 name: my-topic-1 finalizer: strimzi.io/topic-operator labels: strimzi.io/cluster: my-cluster deletionTimestamp: 20230301T000000.000
资源仍然存在。如果删除失败,则会在资源的状态中显示。
当成功执行最终任务时,终结器会从元数据中删除,并且资源会被完全删除。
终结器还阻止相关资源被删除。如果单向主题 Operator 没有运行,则无法删除 metadata.finalizer
。因此,在 Operator 重启前,尝试删除包含 KafkaTopic
资源的命名空间不会完成,或者删除终结器(例如,使用 oc edit
)。
第 10 章 使用 User Operator 管理 Kafka 用户
当使用 KafkaUser
资源创建、修改或删除用户时,User Operator 可确保这些更改反映在 Kafka 集群中。
有关 KafkaUser
资源的更多信息,请参阅 KafkaUser
模式参考。
10.1. 配置 Kafka 用户
使用 KafkaUser
资源的属性来配置 Kafka 用户。
您可以使用 oc apply
创建或修改用户,oc delete
删除现有用户。
例如:
-
oc apply -f <user_config_file>
-
oc delete KafkaUser <user_name>
用户代表 Kafka 客户端。配置 Kafka 用户时,您可以启用客户端访问 Kafka 所需的用户身份验证和授权机制。使用的机制必须与等同的 Kafka
配置匹配。有关使用 Kafka
和 KafkaUser
资源保护对 Kafka 代理的访问的更多信息,请参阅 保护对 Kafka 代理的访问。
先决条件
- 正在运行的 Kafka 集群使用 mTLS 身份验证和 TLS 加密配置 Kafka 代理监听程序。
- 正在运行的 User Operator (通常使用 Entity Operator 部署)。
流程
配置
KafkaUser
资源。这个示例使用 ACL 指定 mTLS 身份验证和授权。
Kafka 用户配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: KafkaUser metadata: name: my-user-1 labels: strimzi.io/cluster: my-cluster spec: authentication: type: tls authorization: type: simple acls: # Example consumer Acls for topic my-topic using consumer group my-group - resource: type: topic name: my-topic patternType: literal operations: - Describe - Read host: "*" - resource: type: group name: my-group patternType: literal operations: - Read host: "*" # Example Producer Acls for topic my-topic - resource: type: topic name: my-topic patternType: literal operations: - Create - Describe - Write host: "*"
在 OpenShift 中创建
KafkaUser
资源。oc apply -f <user_config_file>
等待用户的就绪状态更改为
True
:oc get kafkausers -o wide -w -n <namespace>
Kafka 用户体验
NAME CLUSTER AUTHENTICATION AUTHORIZATION READY my-user-1 my-cluster tls simple True my-user-2 my-cluster tls simple my-user-3 my-cluster tls simple True
当
READY
输出显示为True
时,用户创建成功。如果
READY
列留空,请从资源 YAML 或 User Operator 日志中获取有关状态的更多详细信息。消息提供有关当前状态的原因的详细信息。
oc get kafkausers my-user-2 -o yaml
具有
NotReady
状态的用户详情# ... status: conditions: - lastTransitionTime: "2022-06-10T10:07:37.238065Z" message: Simple authorization ACL rules are configured but not supported in the Kafka cluster configuration. reason: InvalidResourceException status: "True" type: NotReady
在本例中,用户未就绪的原因是,在
Kafka
配置中没有启用简单的授权。用于简单授权的 Kafka 配置
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... authorization: type: simple
更新 Kafka 配置后,状态会显示用户已就绪。
oc get kafkausers my-user-2 -o wide -w -n <namespace>
用户的状态更新
NAME CLUSTER AUTHENTICATION AUTHORIZATION READY my-user-2 my-cluster tls simple True
获取详情不显示任何消息。
oc get kafkausers my-user-2 -o yaml
具有
READY
状态的用户详情# ... status: conditions: - lastTransitionTime: "2022-06-10T10:33:40.166846Z" status: "True" type: Ready
第 11 章 使用红帽构建的 Apicurio Registry 验证模式
对于 AMQ Streams,也可以使用红帽构建的 Apicurio Registry。
Apicurio Registry 是一个数据存储,用于在 API 和事件驱动的构架中共享标准事件模式和 API 设计。您可以使用 Apicurio Registry 将数据的结构与客户端应用程序分离,并使用 REST 接口在运行时共享和管理您的数据类型和 API 描述。
Apicurio Registry 存储用于序列化和反序列化消息的模式,然后可以从客户端应用程序引用这些消息,以确保它们发送和接收的信息与这些模式兼容。Apicurio Registry 为 Kafka 生成者和消费者应用程序提供 Kafka 客户端序列化器/反序列化器。Kafka 制作者应用程序使用 serializers 对符合特定事件模式的信息进行编码。Kafka 消费者应用程序使用反序列化器,它根据特定的模式 ID 验证信息是否被序列化使用正确的模式。
您可以使应用程序使用 registry 中的模式。这样可确保一致的模式使用,并有助于防止运行时出现数据错误。
其他资源
- Red Hat build of Apicurio Registry 产品文档
- 红帽构建的 Apicurio Registry 基于 GitHub: Apicurio/apicurio-registry上提供的 Apicurio Registry 构建
第 12 章 与红帽构建的 Debezium 集成以更改数据捕获
红帽构建的 Debezium 是一个分布式更改数据捕获平台。它捕获数据库中的行级更改,创建更改事件记录,并将记录流传输到 Kafka 主题。Debezium 基于 Apache Kafka 构建。您可以将红帽构建的 Debezium 与 AMQ Streams 一起部署并集成。部署 AMQ Streams 后,您可以通过 Kafka Connect 将 Debezium 部署为连接器配置。Debezium 将更改事件记录传递到 OpenShift 上的 AMQ Streams。应用程序可以读取 这些更改事件流,并按发生更改事件的顺序访问更改事件。
Debezium 具有多个用途,包括:
- 数据复制
- 更新缓存和搜索索引
- 简化单体式应用程序
- 数据集成
- 启用流查询
要捕获数据库更改,请使用 Debezium 数据库连接器部署 Kafka Connect。您可以配置 KafkaConnector
资源来定义连接器实例。
有关将红帽构建的 Debezium 与 AMQ Streams 一起部署的更多信息,请参阅产品文档。文档包括 Debezium 入门指南,指导您完成设置数据库更新事件记录所需的服务和连接器。
第 13 章 设置 Kafka 集群的客户端访问权限
部署 AMQ Streams 后,您可以设置对 Kafka 集群的客户端访问。要验证部署,您可以部署示例制作者和消费者客户端。否则,创建在 OpenShift 集群内部或外部提供客户端访问的监听程序。
13.1. 部署客户端示例
部署示例制作者和消费者客户端,以发送和接收消息。您可以使用这些客户端来验证 AMQ Streams 的部署。
先决条件
- Kafka 集群可用于客户端。
流程
部署 Kafka producer。
oc run kafka-producer -ti --image=registry.redhat.io/amq-streams/kafka-35-rhel8:2.5.1 --rm=true --restart=Never -- bin/kafka-console-producer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic
- 在运行制作者的控制台中键入一条消息。
- 按 Enter 来发送邮件。
部署 Kafka 使用者。
oc run kafka-consumer -ti --image=registry.redhat.io/amq-streams/kafka-35-rhel8:2.5.1 --rm=true --restart=Never -- bin/kafka-console-consumer.sh --bootstrap-server cluster-name-kafka-bootstrap:9092 --topic my-topic --from-beginning
- 确认您在使用者控制台中看到传入的信息。
13.2. 配置监听程序以连接到 Kafka 代理
使用监听程序进行与 Kafka 代理的客户端连接。AMQ Streams 提供了一个通用的 GenericKafkaListener
模式,它带有通过 Kafka
资源配置监听程序的属性。GenericKafkaListener
提供了灵活的监听程序配置方法。您可以指定属性来配置 内部监听程序 以在 OpenShift 集群内连接,或 外部监听程序 用于在 OpenShift 集群外部连接。
指定在监听器配置中公开 Kafka 的 连接类型
。选择的类型取决于您的要求,以及您的环境和基础架构。支持以下监听程序类型:
- 内部监听程序
-
在同一 OpenShift 集群内连接的
内部
-
cluster-ip
使用针对每个代理的ClusterIP
服务公开 Kafka
-
在同一 OpenShift 集群内连接的
- 外部监听程序
-
NodePort
使用 OpenShift 节点上的端口 -
LoadBalancer
使用负载均衡器服务 -
ingress
使用 KubernetesIngress
和 Ingress NGINX Controller for Kubernetes (仅限 Kubernetes) -
route
使用 OpenShiftRoute
和默认的 HAProxy 路由器(仅限 OpenShift)
-
不要在 OpenShift 上使用 ingress
,改为使用 route
类型。Ingress NGINX Controller 仅适用于 Kubernetes。路由类型
只在 OpenShift 中被支持。
内部
类型的监听程序配置使用无头服务和提供给代理 pod 的 DNS 名称。您可能需要将 OpenShift 网络加入到外部网络。在这种情况下,您可以配置 内部
类型监听程序(使用 useServiceDnsDomain
属性),以便不使用 OpenShift 服务 DNS 域(通常为 .cluster.local
)。您还可以配置基于每个代理的 ClusterIP
服务的 Kafka 集群的 cluster-ip
类型。当您无法通过无头服务路由或者您希望纳入自定义访问机制时,这个选项是一个实用的选项。例如,您可以在为特定 Ingress 控制器或 OpenShift 网关 API 构建自己的类型的外部监听程序时使用此监听程序。
外部监听程序从需要不同身份验证机制的网络处理对 Kafka 集群的访问。您可以使用指定的连接机制(如 loadbalancer 或 route)为 OpenShift 环境外部访问配置外部监听程序。例如,负载均衡器可能不适用于某些基础架构,如裸机,节点端口提供更好的选项。
每个监听器都定义为 Kafka
资源中的一个数组。
侦听器配置示例
apiVersion: kafka.strimzi.io/v1beta2 kind: Kafka metadata: name: my-cluster spec: kafka: # ... listeners: - name: plain port: 9092 type: internal tls: false configuration: useServiceDnsDomain: true - name: tls port: 9093 type: internal tls: true authentication: type: tls - name: external port: 9094 type: route tls: true configuration: brokerCertChainAndKey: secretName: my-secret certificate: my-certificate.crt key: my-key.key # ...
您可以根据需要配置多个监听程序,只要它们的名称和端口是唯一的。您还可以使用身份验证为安全连接配置监听程序。
如果要了解更多有关每种连接类型的 pros 和 cons,请参阅在 Strimzi 中访问 Apache Kafka。
如果您在使用外部监听程序时需要扩展 Kafka 集群,可能会触发所有 Kafka 代理的滚动更新。这取决于配置。
13.3. 使用监听程序设置对 Kafka 集群的客户端访问
使用 Kafka 集群的地址,您可以提供对同一 OpenShift 集群中的客户端的访问权限;或者,为不同 OpenShift 命名空间或外部 OpenShift 上的客户端提供外部访问。此流程演示了如何配置从 OpenShift 外部或从另一个 OpenShift 集群配置对 Kafka 集群的客户端访问。
Kafka 侦听器提供对 Kafka 集群的访问。客户端访问使用以下配置进行保护:
-
为 Kafka 集群配置了外部监听程序,它启用了 TLS 加密和 mTLS 身份验证,并启用了 Kafka
简单
授权。 -
为客户端创建一个
KafkaUser
,它带有 mTLS 身份验证,以及为简单
授权定义的访问控制列表(ACL)。
您可以将监听程序配置为使用 mutual tls
、scram-sha-512
或