0


Debezium系列之:在 Kubernetes 上部署 Debezium

这Debezium系列之:在 Kubernetes 上部署 Debezium

K8s相关知识可以阅读博主以下几篇技术博客:

  • K8s系列之:搭建高可用K8s v1.23.5集群详细步骤,3个master节点,3个Node节点
  • K8s系列之:Pod的基本用法
  • k8s系列之:kubectl子命令详解一
  • k8s系列之:kubectl子命令详解二
  • 更多K8s知识点详见博主K8s系列文章

更多Debezium内容请阅读博主Debezium专栏,博主会持续更新Debezium专栏:

  • Debezium专栏

一、概述

Debezium 可以轻松部署在开源容器管理平台 Kubernetes 上。该部署利用了 Strimzi 项目,该项目旨在通过自定义资源简化 Kubernetes 上 Apache Kafka 的部署。

为了测试您的部署,您可以使用 minikube,它会在本地计算机上启动 Kubernetes 集群。如果您想在 minikube 上完全测试本文档中描述的 Debezium 部署,则需要在 minikube 上设置不安全的容器映像注册表。为此,您需要使用 --insecure-registry 标志启动 minikube:

  1. $ minikube start --insecure-registry "10.0.0.0/24"

10.0.0.1 是默认的服务集群 IP,因此此设置允许在整个集群内拉取镜像。您还需要启用注册表 minikube 插件:

  1. minikube addons enable registry

二、先决条件

为了使容器与集群上的其他工作负载分开,请为 Debezium 创建专用命名空间。在本文档的其余部分中,将使用 debezium-example 命名空间:

  1. kubectl create ns debezium-example

部署 Strimzi Operator
如上所述,对于 Debezium 部署,我们将使用 Strimzi,它管理 Kubernetes 上的 Kafka 部署。

部署minikube详细步骤可以参考博主下面这篇技术博客:

  • minikube从入门到精通系列之一:部署minikube详细步骤

安装 Strimzi 最简单的方法是通过 Operator Lifecycle Manager (OLM)。如果您的集群上尚未安装 OLM,可以通过运行以下命令来安装它:

  1. curl -sL https://github.com/operator-framework/operator-lifecycle-manager/releases/download/v0.20.0/install.sh |bash -s v0.20.0

现在,安装 Strimzi operator本身:

  1. kubectl create -f https://operatorhub.io/install/strimzi-kafka-operator.yaml

三、为数据库创建Secrets

稍后,在部署 Debezium Kafka 连接器时,我们需要提供连接器的用户名和密码才能连接到数据库。出于安全原因,最好不要直接提供凭据,而是将它们保存在单独的安全位置。 Kubernetes 为此提供了 Secret 对象。除了创建 Secret 对象本身之外,我们还必须创建一个角色和角色绑定,以便 Kafka 可以访问凭证。

我们先创建 Secret 对象:

  1. $ cat<<EOF| kubectl create -n debezium-example -f -
  2. apiVersion: v1
  3. kind: Secret
  4. metadata:
  5. name: debezium-secret
  6. namespace: debezium-example
  7. type: Opaque
  8. data:
  9. username: ZGViZXppdW0=
  10. password: ZGJ6
  11. EOF

用户名和密码包含用于连接 MySQL 数据库的 Base64 编码凭据 (debezium/dbz),我们稍后将部署该数据库。

现在,我们可以创建一个角色,它引用上一步中创建的秘密:

  1. $ cat<<EOF| kubectl create -n debezium-example -f -
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: Role
  4. metadata:
  5. name: connector-configuration-role
  6. namespace: debezium-example
  7. rules:
  8. - apiGroups: [""]
  9. resources: ["secrets"]
  10. resourceNames: ["debezium-secret"]
  11. verbs: ["get"]
  12. EOF

我们还必须将此角色绑定到 Kafka Connect 集群服务帐户,以便 Kafka Connect 可以访问密钥:

  1. cat<<EOF| kubectl create -n debezium-example -f -
  2. apiVersion: rbac.authorization.k8s.io/v1
  3. kind: RoleBinding
  4. metadata:
  5. name: connector-configuration-role-binding
  6. namespace: debezium-example
  7. subjects:
  8. - kind: ServiceAccount
  9. name: debezium-connect-cluster-connect
  10. namespace: debezium-example
  11. roleRef:
  12. kind: Role
  13. name: connector-configuration-role
  14. apiGroup: rbac.authorization.k8s.io
  15. EOF

一旦我们部署 Kafka Connect,服务帐户将由 Strimzi 创建。服务帐户的名称采用 $KafkaConnectName-connect 形式。稍后,我们将创建名为 debezium-connect-cluster 的 Kafka Connect 集群,因此我们在这里使用 debezium-connect-cluster-connect 作为 subject.name。

四、部署Apache Kafka

接下来,部署一个(单节点)Kafka 集群:

  1. $ cat<<EOF| kubectl create -n debezium-example -f -
  2. apiVersion: kafka.strimzi.io/v1beta2
  3. kind: Kafka
  4. metadata:
  5. name: debezium-cluster
  6. spec:
  7. kafka:
  8. replicas: 1
  9. listeners:
  10. - name: plain
  11. port: 9092
  12. type: internal
  13. tls: false
  14. - name: tls
  15. port: 9093
  16. type: internal
  17. tls: true
  18. authentication:
  19. type: tls
  20. - name: external
  21. port: 9094
  22. type: nodeport
  23. tls: false
  24. storage:
  25. type: jbod
  26. volumes:
  27. - id: 0
  28. type: persistent-claim
  29. size: 100Gi
  30. deleteClaim: false
  31. config:
  32. offsets.topic.replication.factor: 1
  33. transaction.state.log.replication.factor: 1
  34. transaction.state.log.min.isr: 1
  35. default.replication.factor: 1
  36. min.insync.replicas: 1
  37. zookeeper:
  38. replicas: 1
  39. storage:
  40. type: persistent-claim
  41. size: 100Gi
  42. deleteClaim: false
  43. entityOperator:
  44. topicOperator: {}
  45. userOperator: {}
  46. EOF

等待它准备好:

  1. $ kubectl wait kafka/debezium-cluster --for=condition=Ready --timeout=300s -n debezium-example

五、部署数据源

下面将使用MySQL作为数据源。除了使用 MySQL 运行 pod 之外,还需要一个适当的服务来指向带有 DB 本身的 pod。它可以被创建,例如如下:

  1. $ cat<<EOF| kubectl create -n debezium-example -f -
  2. apiVersion: v1
  3. kind: Service
  4. metadata:
  5. name: mysql
  6. spec:
  7. ports:
  8. - port: 3306
  9. selector:
  10. app: mysql
  11. clusterIP: None
  12. ---
  13. apiVersion: apps/v1
  14. kind: Deployment
  15. metadata:
  16. name: mysql
  17. spec:
  18. selector:
  19. matchLabels:
  20. app: mysql
  21. strategy:
  22. type: Recreate
  23. template:
  24. metadata:
  25. labels:
  26. app: mysql
  27. spec:
  28. containers:
  29. - image: quay.io/debezium/example-mysql:2.3
  30. name: mysql
  31. env:
  32. - name: MYSQL_ROOT_PASSWORD
  33. value: debezium
  34. - name: MYSQL_USER
  35. value: mysqluser
  36. - name: MYSQL_PASSWORD
  37. value: mysqlpw
  38. ports:
  39. - containerPort: 3306
  40. name: mysql
  41. EOF

六、部署 Debezium 连接器

要部署 Debezium 连接器,您需要在实例化实际连接器本身之前部署具有所需连接器插件的 Kafka Connect 集群。第一步,必须创建带有插件的 Kafka Connect 容器映像。如果您已经构建了容器镜像并在注册表中可用,则可以跳过此步骤。本文档以MySQL连接器为例。

  1. $ cat<<EOF| kubectl create -n debezium-example -f -
  2. apiVersion: kafka.strimzi.io/v1beta2
  3. kind: KafkaConnect
  4. metadata:
  5. name: debezium-connect-cluster
  6. annotations:
  7. strimzi.io/use-connector-resources: "true"
  8. spec:
  9. version: 3.1.0
  10. replicas: 1
  11. bootstrapServers: debezium-cluster-kafka-bootstrap:9092
  12. config:
  13. config.providers: secrets
  14. config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider
  15. group.id: connect-cluster
  16. offset.storage.topic: connect-cluster-offsets
  17. config.storage.topic: connect-cluster-configs
  18. status.storage.topic: connect-cluster-status
  19. # -1 means it will use the default replication factor configured in the broker
  20. config.storage.replication.factor: -1
  21. offset.storage.replication.factor: -1
  22. status.storage.replication.factor: -1
  23. build:
  24. output:
  25. type: docker
  26. image: 10.110.154.103/debezium-connect-mysql:latest
  27. plugins:
  28. - name: debezium-mysql-connector
  29. artifacts:
  30. - type: tgz
  31. url: https://repo1.maven.org/maven2/io/debezium/debezium-connector-mysql/{debezium-version}/debezium-connector-mysql-{debezium-version}-plugin.tar.gz
  32. EOF

您必须将registry的IP地址10.110.154.103替换为可以推送镜像的registry。如果您使用注册表插件在 minikube 上运行它,您可以将映像推送到内部 minikube 注册表中。注册表的 IP 地址可以通过以下方式获得:通过运行

  1. kubectl -n kube-system get svc registry -o jsonpath='{.spec.clusterIP}'

为简单起见,我们跳过了下载工件的校验和验证。如果您想确保工件已正确下载,请通过 sha512sum 属性指定其校验和。

如果您在本地或远程注册表(例如 quay.io 或 DockerHub)中已经有合适的容器映像,则可以使用此简化版本:

  1. $ cat<<EOF| kubectl create -n debezium-example -f -
  2. apiVersion: kafka.strimzi.io/v1beta2
  3. kind: KafkaConnect
  4. metadata:
  5. name: debezium-connect-cluster
  6. annotations:
  7. strimzi.io/use-connector-resources: "true"
  8. spec:
  9. version: 3.1.0
  10. image: 10.110.154.103/debezium-connect-mysql:latest
  11. replicas: 1
  12. bootstrapServers: debezium-cluster-kafka-bootstrap:9092
  13. config:
  14. config.providers: secrets
  15. config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider
  16. group.id: connect-cluster
  17. offset.storage.topic: connect-cluster-offsets
  18. config.storage.topic: connect-cluster-configs
  19. status.storage.topic: connect-cluster-status
  20. # -1 means it will use the default replication factor configured in the broker
  21. config.storage.replication.factor: -1
  22. offset.storage.replication.factor: -1
  23. status.storage.replication.factor: -1
  24. EOF

另请注意,我们已经配置了 Strimzi 秘密提供程序。这个秘密提供者将为这个 Kafka Connect 集群创建一个服务帐户(我们已经将其绑定到适当的角色),并允许 Kafka Connect 访问我们的 Secret 对象。

七、创建 Debezium 连接器

要创建 Debezium 连接器,您只需创建具有适当配置的 KafkaConnector,在本例中为 MySQL:

  1. $ cat<<EOF| kubectl create -n debezium-example -f -
  2. apiVersion: kafka.strimzi.io/v1beta2
  3. kind: KafkaConnector
  4. metadata:
  5. name: debezium-connector-mysql
  6. labels:
  7. strimzi.io/cluster: debezium-connect-cluster
  8. spec:
  9. class: io.debezium.connector.mysql.MySqlConnector
  10. tasksMax: 1
  11. config:
  12. tasks.max: 1
  13. database.hostname: mysql
  14. database.port: 3306
  15. database.user: ${secrets:debezium-example/debezium-secret:username}
  16. database.password: ${secrets:debezium-example/debezium-secret:password}
  17. database.server.id: 184054
  18. topic.prefix: mysql
  19. database.include.list: inventory
  20. schema.history.internal.kafka.bootstrap.servers: debezium-cluster-kafka-bootstrap:9092
  21. schema.history.internal.kafka.topic: schema-changes.inventory
  22. EOF

您可以注意到,我们在连接器配置中没有使用纯文本用户名和密码,而是引用我们之前创建的 Secret 对象。

八、验证部署

要验证一切正常,您可以例如开始观察mysql.inventory.customers Kafka Topic:

  1. kubectl run -n debezium-example -it --rm
  2. --image=quay.io/debezium/tooling:1.2
  3. --restart=Never watcher
  4. -- kcat -b debezium-cluster-kafka-bootstrap:9092
  5. -C -o beginning -t mysql.inventory.customers

连接MySQL数据库:

  1. kubectl run -n debezium-example -it --rm
  2. --image=mysql:8.0 --restart=Never
  3. --env MYSQL_ROOT_PASSWORD=debezium mysqlterm
  4. -- mysql -hmysql -P3306 -uroot -pdebezium

在客户表中做一些更改:

  1. sql>update customers set first_name="Sally Marie"where id=1001;

您现在应该能够观察 Kafka 主题上的更改事件:

  1. {...
  2. "payload":{"before":{"id":1001,
  3. "first_name":"Sally",
  4. "last_name":"Thomas",
  5. "email":"sally.thomas@acme.com"},
  6. "after":{"id":1001,
  7. "first_name":"Sally Marie",
  8. "last_name":"Thomas",
  9. "email":"sally.thomas@acme.com"},
  10. "source":{"version":"{debezium-version}",
  11. "connector":"mysql",
  12. "name":"mysql",
  13. "ts_ms":1646300467000,
  14. "snapshot":"false",
  15. "db":"inventory",
  16. "sequence": null,
  17. "table":"customers",
  18. "server_id":223344,
  19. "gtid": null,
  20. "file":"mysql-bin.000003",
  21. "pos":401,
  22. "row":0,
  23. "thread": null,
  24. "query": null
  25. },
  26. "op":"u",
  27. "ts_ms":1646300467746,
  28. "transaction": null
  29. }}

本文转载自: https://blog.csdn.net/zhengzaifeidelushang/article/details/131410024
版权归原作者 最笨的羊羊 所有, 如有侵权,请联系我们删除。

“Debezium系列之:在 Kubernetes 上部署 Debezium”的评论:

还没有评论