第 5 章 使用 AMQ Streams Operator
使用 AMQ Streams 操作器来管理您的 Kafka 集群,以及 Kafka 主题和用户。
5.1. 使用 Cluster Operator
Cluster Operator 用于部署 Kafka 集群和其他 Kafka 组件。
Cluster Operator 使用 YAML 安装文件进行部署。
在 OpenShift 中,Kafka Connect 部署可以纳入 Source2Image 功能,以提供添加额外连接器的便捷方式。
5.1.1. Cluster Operator 配置
您可以使用支持的环境变量及其日志记录配置来配置 Cluster Operator。
环境变量与用于部署 Cluster Operator 镜像的容器配置相关。有关 镜像
配置的详情请参考 第 13.1.6 节 “image
”。
STRIMZI_NAMESPACE
Operator 应操作的命名空间的逗号分隔列表。如果没有设置、设置为空字符串或设置为
*
,Cluster Operator 将在所有命名空间中运行。Cluster Operator 部署可能会使用 OpenShift 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_OPERATIONS_THREAD_POOL_SIZE
- 可选,默认为 10 worker 线程池大小,用于集群 Operator 运行的各种异步和阻止操作。
STRIMZI_OPERATOR_NAMESPACE
运行 AMQ Streams Cluster Operator 的命名空间的名称。不要手动配置这个变量。使用 OpenShift 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 集群的任何命名空间访问 AMQ Streams Cluster Operator。
env: - name: STRIMZI_OPERATOR_NAMESPACE_LABELS value: label1=value1,label2=value2
STRIMZI_CUSTOM_RESOURCE_SELECTOR
可选。指定标签选择器,用于过滤操作器处理的自定义资源。Operator 仅在设置了指定标签的自定义资源上运行。没有这些标签的资源不会被 Operator 看到。标签选择器适用于
Kafka、Kafka
Connect
、KafkaConnectS2I
、KafkaBridge
、KafkaMirrorMaker
和KafkaMirrorMaker2
资源。只有在对应的Kafka 和 Kafka Connect 集群具有匹配的标签时,才会执行 Kafka
资源。Rebalance
和 KafkaConnectorenv: - name: STRIMZI_CUSTOM_RESOURCE_SELECTOR value: label1=value1,label2=value2
STRIMZI_LABELS_EXCLUSION_PATTERN
可选,默认的 regex 模式是
^app.kubernetes.io/(?!part-of)*
。指定 regex 排除模式,用于将标签传播从主自定义资源过滤到其子资源。排除过滤器的标签不会应用到模板部分中的标签,如spec.kafka.template.pod.metadata.labels
。env: - name: STRIMZI_LABELS_EXCLUSION_PATTERN value: "^key1.*"
STRIMZI_KAFKA_IMAGES
-
必需。这提供了从 Kafka 版本到相应 Docker 镜像的映射,其中包含该版本的 Kafka 代理。所需语法为空格或用逗号分开的
<version>=<image>
对。例如2.7.0=registry.redhat.io/amq7/amq-streams-kafka-27-rhel7:1.8.0, 2.8.0=registry.redhat.io/amq7/amq-streams-kafka-28-rhel7:1.8.0
。当指定Kafka.spec.kafka.version
属性但没有指定 Kafka资源
中的Kafka.spec.kafka.image
时会使用此方法。 STRIMZI_DEFAULT_KAFKA_INIT_IMAGE
-
可选,默认
registry.redhat.io/amq7/amq-streams-rhel7-operator:1.8.0
。如果没有将镜像指定为Kafka
资源中的 kafka-init-image,则在代理之前启动的 init 容器的镜像名称(即机架支持)没有指定为kafka-init-image
。 STRIMZI_KAFKA_CONNECT_IMAGES
-
必需。这提供了从 Kafka 版本到相应 Docker 镜像的映射,其中包含该版本的 Kafka 连接。所需语法为空格或用逗号分开的
<version>=<image>
对。例如2.7.0=registry.redhat.io/amq7/amq-streams-kafka-27-rhel7:1.8.0, 2.8.0=registry.redhat.io/amq7/amq-streams-kafka-28-rhel7:1.8.0
。这在指定KafkaConnect.spec.version
属性而不是KafkaConnect.spec.image
时使用。 STRIMZI_KAFKA_CONNECT_S2I_IMAGES
-
必需。这提供了从 Kafka 版本到相应 Docker 镜像的映射,其中包含该版本的 Kafka 连接。所需语法为空格或用逗号分开的
<version>=<image>
对。例如2.7.0=registry.redhat.io/amq7/amq-streams-kafka-27-rhel7:1.8.0, 2.8.0=registry.redhat.io/amq7/amq-streams-kafka-28-rhel7:1.8.0
。这在指定KafkaConnectS2I.spec.version
属性而不是KafkaConnectS2I.spec.image
时使用。 STRIMZI_KAFKA_MIRROR_MAKER_IMAGES
-
必需。这提供了从 Kafka 版本到相应 Docker 镜像的映射,其中包含该版本的 Kafka 镜像制作器。所需语法为空格或用逗号分开的
<version>=<image>
对。例如2.7.0=registry.redhat.io/amq7/amq-streams-kafka-27-rhel7:1.8.0, 2.8.0=registry.redhat.io/amq7/amq-streams-kafka-28-rhel7:1.8.0
。这在指定KafkaMirrorMaker.spec.version
属性而不是KafkaMirrorMaker.spec.image
时使用。 STRIMZI_DEFAULT_TOPIC_OPERATOR_IMAGE
-
可选,默认
registry.redhat.io/amq7/amq-streams-rhel7-operator:1.8.0
。部署主题 Operator 时要使用的镜像名称,如果没有将镜像指定为 Kafka资源
中的Kafka.spec.entityOperator.topicOperator.image
。 STRIMZI_DEFAULT_USER_OPERATOR_IMAGE
-
可选,默认
registry.redhat.io/amq7/amq-streams-rhel7-operator:1.8.0
。在部署用户 operator 时要使用的镜像名称,如果没有在 Kafka 资源中指定为Kafka.spec.entityOperator.userOperator.image
镜像名称。
STRIMZI_DEFAULT_TLS_SIDECAR_ENTITY_OPERATOR_IMAGE
-
可选,默认
registry.redhat.io/amq7/amq-streams-kafka-28-rhel7:1.8.0
。在部署 sidecar 容器时用作默认的镜像名称,该容器为 Entity Operator 提供 TLS 支持,如果没有将镜像指定为 Kafka资源
中的Kafka.spec.entityOperator.tlsSidecar.image
。 STRIMZI_IMAGE_PULL_POLICY
-
可选。
ImagePullPolicy
,它将应用到由 AMQ Streams Cluster Operator 管理的所有 pod 中的容器。有效值有Always
、ifNotPresent
和Never
。如果未指定,则将使用 OpenShift 的默认值。更改策略会导致所有 Kafka、Kafka Connect 和 Kafka MirrorMaker 集群滚动更新。 STRIMZI_IMAGE_PULL_SECRETS
-
可选。以逗号分隔的
Secret
名称列表。此处引用的 secret 包含从中提取容器镜像的容器注册表的凭据。secret 在imagePullSecrets
字段中用于 Cluster Operator 创建的所有Pod
。更改此列表会导致所有 Kafka、Kafka Connect 和 Kafka MirrorMaker 集群进行滚动更新。 STRIMZI_KUBERNETES_VERSION
可选。覆盖从 API 服务器检测到的 Kubernetes 版本信息。
Kubernetes 版本覆盖的配置示例
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 集群中分配的服务的 DNS 域名使用默认的后缀
cluster.local
。例如,对于代理 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 构建包含多个连接器的容器镜像或使用速度较慢的容器注册表时,应增加这个值。
STRIMZI_FEATURE_GATES
- 可选。启用或禁用由功能门控制的功能和功能。有关每个功能门的详情请参考 第 5.1.1.1 节 “功能门”。
5.1.1.1. 功能门
AMQ Streams 操作器支持 功能门来 启用或禁用某些功能。启用功能门会更改相关 Operator 的行为,并将该功能引入您的 AMQ Streams 部署。
功能门的默认状态为 enabled 或 disabled。要修改功能门的默认状态,请在操作器的配置中使用 STRIMZI_FEATURE_GATES
环境变量。您可以使用这个环境变量修改多个功能门。
功能门有三个成熟度阶段:
- alpha - 通常默认禁用
- Beta - 通常默认启用
- 正式发行(GA)- 通常默认启用
Alpha 阶段功能可能实验性或不稳定,可能会有所变化,或者没有经过足够的测试以供生产环境使用。测试版阶段功能经过了良好的测试,其功能不太可能改变。GA 阶段的功能是稳定的,未来不应改变。如果 alpha 和 beta 阶段功能不有用,则会删除它们。
功能门可能会在到达 GA 时被删除。这意味着该功能已合并到 AMQ Streams 核心功能中,无法再禁用。
功能门 | alpha | Beta | GA |
---|---|---|---|
| 1.8 | - | - |
| 1.8 | - | - |
配置功能门
您可以使用操作器配置中的 STRIMZI_FEATURE_GATES
环境变量来配置功能门。指定以逗号分隔的功能门名称和前缀列表。+
前缀启用功能门,而 -
前缀可禁用它。
启用 FeatureGate1 并禁用
的功能门配置示例FeatureGate
2
env: - name: STRIMZI_FEATURE_GATES value: +FeatureGate1,-FeatureGate2
5.1.1.1.1. control plane 侦听程序功能门
使用 ControlPlaneListener
功能门更改 Kafka 集群中用于代理间通信的通信路径。
OpenShift 控制平面管理在工作程序节点上运行的工作负载。Kubernetes API 服务器和控制器管理器等服务在 control plane 上运行。OpenShift 数据平面向容器(包括 CPU、内存、网络和存储)提供资源。
在 AMQ Streams 中,control plane 流量由维护 Kafka 集群所需状态的控制器连接组成。数据平面流量主要由领导代理和后续代理之间的数据复制组成。
当禁用 ControlPlaneListener
功能门时,control plane 和数据平面流量会通过端口 9091 上的相同内部监听程序。这是引入功能门前的默认行为。
当启用 ControlPlaneListener
时,control plane 流量通过端口 9090 上的专用 control plane 侦听 程序进行。数据平面流量在端口 9091 上继续使用内部监听程序。
使用 control plane 侦听器可能会提高性能,因为重要的控制器连接(如分区领导更改)不会因为代理间数据复制而延迟。
启用 control plane 侦听程序功能门
ControlPlaneListener
功能门处于 alpha 阶段,默认状态为 disabled。要启用它,请在 Cluster Operator 配置中的 STRIMZI_FEATURE_GATES
环境变量中指定 +ControlPlaneListener
。
在以下情况下必须禁用此功能门:
- 从 AMQ Streams 1.7 及更早版本升级
- 降级到 AMQ Streams 1.7 及更早版本
ControlPlaneListener
功能门是在 AMQ Streams 1.8 中引入的,它应该在进入 beta 阶段前保留在 alpha 阶段。
5.1.1.1.2. 服务帐户补丁功能门
默认情况下,Cluster Operator 不会更新服务帐户。要允许 Cluster Operator 应用更新,请启用 ServiceAccountPatching
功能门。
将 +ServiceAccountPatching
添加到 Cluster Operator 配置中的 STRIMZI_FEATURE_GATES
环境变量中。
功能门当前处于 alpha 阶段并默认禁用。启用功能门后,Cluster Operator 会在每次协调中对服务帐户配置应用更新。例如,您可以在已创建操作对象后更改服务帐户标签和注解。
ServiceAccountPatching
功能门是在 AMQ Streams 1.8 中引入的,它应该会一直处于多个发行版本的 alpha 阶段,然后进入 beta 阶段并默认启用。
5.1.1.2. 通过 ConfigMap 日志记录配置
Cluster Operator 的日志记录由 strimzi-cluster-operator
ConfigMap
配置。
安装 Cluster Operator 时会创建一个包含日志配置的 ConfigMap
。此 ConfigMap
在文件 install/cluster-operator/050-ConfigMap-strimzi-cluster-operator.yaml
中描述。您可以通过更改此 ConfigMap
中的 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
选项中设置一个时间(以秒为单位)。
如果在部署 Cluster Operator 时缺少 ConfigMap
,则会使用默认的日志记录值。
如果在部署 Cluster Operator 后意外删除 ConfigMap
,则会使用最新载入的日志配置。创建新 ConfigMap 以
加载新的日志配置。
不要从 ConfigMap 中删除 monitorInterval
选项。
5.1.1.3. 使用网络策略限制 Cluster Operator 访问
Cluster Operator 可以和它管理的资源在同一命名空间中运行,也可以在单独的命名空间中运行。默认情况下,STRIMZI_OPERATOR_NAMESPACE
环境变量被配置为使用 OpenShift Downward API 来查找 Cluster Operator 在哪个命名空间中运行。如果 Cluster Operator 在与资源相同的命名空间中运行,则只需要本地访问权限,并且 AMQ Streams 允许。
如果 Cluster Operator 在一个独立的命名空间中运行,则 OpenShift 集群中的任何命名空间都可以访问 Cluster Operator,除非配置了网络策略。使用可选的 STRIMZI_OPERATOR_NAMESPACE_LABELS
环境变量,使用命名空间标签为 Cluster Operator 建立网络策略。通过添加命名空间标签,Cluster Operator 的访问权限仅限于指定的命名空间。
为 Cluster Operator 部署配置网络策略
#... env: # ... - name: STRIMZI_OPERATOR_NAMESPACE_LABELS value: label1=value1,label2=value2 #...
5.1.1.4. 定期协调
虽然 Cluster Operator 会响应从 OpenShift 集群收到所需集群资源的所有通知,但如果操作器没有运行,或者因任何原因未收到通知,则所需的资源将与正在运行的 OpenShift 集群的状态保持同步。
为了正确处理故障切换,由 Cluster Operator 执行定期协调过程,以便它可以将所需资源的状态与当前集群部署进行比较,以便在所有这些部署中保持一致状态。您可以使用 [STRIMZI_FULL_RECONCILIATION_INTERVAL_MS] 变量为定期协调设置时间间隔。
5.1.2. 调配基于角色的访问控制(RBAC)
要使 Cluster Operator 正常工作,需要在 OpenShift 集群中与资源(如 Kafka、Kafka
Connect
等)以及受管资源(如 ConfigMap、Pod、
Deployment
、
StatefulSet 和
Services
)交互。这种权限在 OpenShift 基于角色的访问控制(RBAC)资源中描述:
-
ServiceAccount
, -
角色
和ClusterRole
, -
role
binding 和ClusterRoleBinding
。
除了使用 ClusterRoleBinding
在其自身 ServiceAccount
中运行外,Cluster Operator 还为需要访问 OpenShift 资源的组件管理一些 RBAC 资源。
OpenShift 还包含特权升级保护,可防止在一个 ServiceAccount
下操作的组件授予授予授权 ServiceAccount 没有的其他
特权。因为 Cluster Operator 必须能够创建 ServiceAccount
sClusterRoleBindings
,以及它管理的资源所需的 RoleBindings
,所以 Cluster Operator 还必须具有相同的权限。
5.1.2.1. 委派的权限
当 Cluster Operator 为所需的 Kafka
资源部署资源时,它还会创建 ServiceAccount、
RoleBindings
和 ClusterRoleBindings
,如下所示:
Kafka 代理 pod 使用一个名为
cluster-name-kafka
的ServiceAccount
-
使用机架功能时,
strimzi-cluster-name-kafka-init
ClusterRoleBinding
用来通过ClusterRole
(名为strimzi-kafka-broker
)对集群中的节点授予这个ServiceAccount
访问权限 - 如果没有使用机架功能,且集群没有通过 nodeport 公开,则不会创建绑定
-
使用机架功能时,
-
ZooKeeper pod 使用名为
cluster-name-zookeeper
的ServiceAccount
Entity Operator pod 使用名为
cluster-name-entity-operator
的ServiceAccount
-
Topic Operator 生成带有状态信息的 OpenShift 事件,因此
ServiceAccount
绑定到名为strimzi-entity-operator
的ClusterRole
,它通过strimzi-entity-operator
RoleBinding
授予此访问权限
-
Topic Operator 生成带有状态信息的 OpenShift 事件,因此
-
KafkaConnect 和
资源的 pod 使用名为KafkaConnect
S2Icluster-name-cluster-connect
的ServiceAccount
-
KafkaMirrorMaker
的 pod 使用名为cluster-name-mirror-maker
的ServiceAccount
-
KafkaMirrorMaker2
的 pod 使用名为cluster-name-mirrormaker2
的ServiceAccount
-
KafkaBridge
的 pod 使用名为cluster-name-bridge
的ServiceAccount
5.1.2.2. ServiceAccount
Cluster Operator 最好使用 ServiceAccount
运行:
Cluster Operator 的 ServiceAccount
示例
apiVersion: v1 kind: ServiceAccount metadata: name: strimzi-cluster-operator labels: app: strimzi
然后,Operator 的 Deployment
需要在其 spec.template.spec.serviceAccountName 中指定
:
Cluster Operator 部署
的部分示例
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: # ...
注意 12 行,其中 strimzi-cluster-operator
ServiceAccount
指定为 serviceAccountName
。
5.1.2.3. ClusterRoles
Cluster Operator 需要使用 提供所需资源访问的 ClusterRole
运行。根据 OpenShift 集群设置,可能需要集群管理员来创建 ClusterRole。
集群管理员权限只在创建 ClusterRole 时需要
。Cluster Operator 不会在集群管理员帐户下运行。
ClusterRole 遵循最小
权限, 仅包含 Cluster Operator 运行 Kafka、Kafka Connect 和 ZooKeeper 集群所需的权限。第一组分配的权限允许 Cluster Operator 管理 OpenShift 资源,如 StatefulSets
、Deployment
、Pod
和 ConfigMap。
Cluster Operator 使用 ClusterRole 在命名空间范围的资源级别和集群范围的资源级别授予权限:
具有 Cluster Operator 资源命名空间资源的 ClusterRole
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-cluster-operator-namespaced labels: app: strimzi rules: - 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: - "kafka.strimzi.io" resources: # The cluster operator runs the KafkaAssemblyOperator, which needs to access and manage Kafka resources - kafkas - kafkas/status # The cluster operator runs the KafkaConnectAssemblyOperator, which needs to access and manage KafkaConnect resources - kafkaconnects - kafkaconnects/status # The cluster operator runs the KafkaConnectS2IAssemblyOperator, which needs to access and manage KafkaConnectS2I resources - kafkaconnects2is - kafkaconnects2is/status # The cluster operator runs the KafkaConnectorAssemblyOperator, which needs to access and manage KafkaConnector resources - kafkaconnectors - kafkaconnectors/status # The cluster operator runs the KafkaMirrorMakerAssemblyOperator, which needs to access and manage KafkaMirrorMaker resources - kafkamirrormakers - kafkamirrormakers/status # The cluster operator runs the KafkaBridgeAssemblyOperator, which needs to access and manage BridgeMaker resources - kafkabridges - kafkabridges/status # The cluster operator runs the KafkaMirrorMaker2AssemblyOperator, which needs to access and manage KafkaMirrorMaker2 resources - kafkamirrormaker2s - kafkamirrormaker2s/status # The cluster operator runs the KafkaRebalanceAssemblyOperator, which needs to access and manage KafkaRebalance resources - kafkarebalances - kafkarebalances/status verbs: - get - list - watch - create - delete - patch - update - apiGroups: # The cluster operator needs the extensions api as the operator supports Kubernetes version 1.11+ # apps/v1 was introduced in Kubernetes 1.14 - "extensions" resources: # The cluster operator needs to access and manage deployments to run deployment based Strimzi components - deployments - deployments/scale # The cluster operator needs to access replica sets to manage Strimzi components and to determine error states - replicasets # The cluster operator needs to access and manage replication controllers to manage replicasets - replicationcontrollers # 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: - "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: - "" resources: # The cluster operator needs to be able to create events and delegate permissions to do so - events verbs: - create - apiGroups: # OpenShift S2I requirements - apps.openshift.io resources: - deploymentconfigs - deploymentconfigs/scale - deploymentconfigs/status - deploymentconfigs/finalizers verbs: - get - list - watch - create - delete - patch - update - apiGroups: # OpenShift S2I requirements - build.openshift.io resources: - buildconfigs - buildconfigs/instantiate - builds verbs: - get - list - watch - create - delete - patch - update - apiGroups: # OpenShift S2I requirements - image.openshift.io resources: - imagestreams - imagestreams/status 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: - 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
The strimzi-kafka-broker
ClusterRole
代表 Kafka pod 中 init 容器所需的访问权限,用于机架功能。如 委派的特权 部分所述,Cluster Operator 还需要此角色才能委派此访问权限。
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
The strimzi-topic-operator
ClusterRole
代表 Topic Operator 所需的访问权限。如 委派的特权 部分所述,Cluster 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
The strimzi-kafka-client
ClusterRole
代表组件所需的访问,这些客户端使用客户端机架感知能力。如 委派的特权 部分所述,Cluster Operator 还需要此角色才能委派此访问权限。
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
5.1.2.4. ClusterRoleBindings
对于包含集群范围资源的 ClusterRole
,Operator 需要 Cluster
和RoleBindings
RoleBindings 将其
相关联。
ClusterRole 与其
sServiceAccount
: ClusterRoleBinding
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
委派 所需的 ClusterRole
还需要 ClusterRoleBinding
:
Kafka 代理的 Cluster Operator 的 Cluster RoleBinding
示例
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
和
用于 Kafka 客户端识别的 Cluster Operator 的 Cluster RoleBinding
示例
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
仅 包含有命名空间资源的 ClusterRole
只会使用 RoleBindings
绑定。
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
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
5.1.3. 使用默认代理设置配置 Cluster Operator
如果您在 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。
先决条件
此流程需要使用 OpenShift 用户帐户,该帐户可以创建自定义 ResourceDefinition、
ClusterRole 和
ClusterRoleBinding。
在 OpenShift 集群中使用 Role Base Access Control(RBAC)通常意味着只有 system:admin
等 OpenShift 集群管理员才有创建、编辑和删除这些资源的权限。
流程
要向 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 # ...
或者,直接编辑
Deployment
:oc edit deployment strimzi-cluster-operator
如果您更新了 YAML 文件而不是直接编辑
Deployment
,请应用更改:oc create -f install/cluster-operator/060-Deployment-strimzi-cluster-operator.yaml
其它资源