在Kubernete开云体育官方注册网址s上部署Debezium

开云体育官方注册网址Debezium可以轻松部署Kubernetes,一个开源容器管理平台。部署利用Strimzi项目,旨在简化Apache Kafka在Kubernetes上的部署自定义资源

对于测试部署,可以使用minikube,它会在本地机器上启动Kubernetes集群。看到minikube文档有关如何在您的机器上安装minikube的详细信息。如果您想在minikube上完全测试本文档中开云体育官方注册网址描述的Debezium部署,则需要在minikube上设置一个不安全的容器映像注册表。要做到这一点,您需要启动minikube——insecure-registry国旗:

$ minikube start—不安全的注册表“10.0.0.0/24”

10.0.0.1是默认的服务集群IP,因此这个设置允许在整个集群内提取映像。看到minikube文档欲知详情。您还需要启用注册表minikube插件:

$ minikube插件启用注册表

先决条件

为了保持容器与集群上的其他工作负载分离,可以为Debezium创建一个专用的名称空间。开云体育官方注册网址在本文档的其余部分中,开云体育官方注册网址debezium-example命名空间将被使用:

$ kubectl创建ns debezu开云体育官方注册网址 -example

部署Strimzi操作符

如上所述,对于Debezium部署,我们将使用Strim开云体育官方注册网址zi,它管理Kubernetes上的Kafka部署。请参阅Strimzi部署文档有关如何在Kubernetes集群上部署Strimzi的详细信息。

安装Strimzi最简单的方法是通过操作员生命周期管理器(洞螈)。如果您的集群上还没有安装OLM,您可以通过运行以下命令安装它:

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

现在,安装Strimzi操作符本身:

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

为数据库创建秘密开云体育电动老虎机

稍后,在部署Debezium Kafka连接器时,开云体育官方注册网址我们将需要为连接器提供用户名和密码,以便能够连接到数据库。开云体育电动老虎机出于安全原因,最好不要直接提供凭据,而是将它们保存在单独的安全位置。Kubernetes提供了秘密对象用于此目的。除了创建秘密对象本身,我们还必须创建一个角色和角色绑定,以便Kafka可以访问凭据。

让我们创建秘密对象:

$ cat << EOF | kubectl create -n 开云体育官方注册网址debezu -example -f - apiVersion: v1 kind: Secret metadata: name: debezu - Secret namespace: debezu -example type: Opaque data: username: ZGViZXppdW0= password: ZGJ6

用户名而且密码包含base64编码的凭证(开云体育官方注册网址/dbz)用于连接到MySQL数据库,我们将在后面部署。开云体育电动老虎机

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

$ cat << EOF | kubectl create -n 开云体育官方注册网址debezu -example -f - apiVersion: rbac.authorization.k8s。io/v1 kind:角色元数据:name: connector-configuration-role namespace: debeium -e开云体育官方注册网址xample rules:—apiGroups: ["" "] resources: ["secrets"] resourceNames: [" debeium -secret"] verbs: ["get"] EOF

我们还必须将这个角色绑定到Kafka Connect集群服务帐户上,这样Kafka Connect才能访问这个秘密:

$ cat << EOF | kubectl create -n 开云体育官方注册网址debezu -example -f - apiVersion: rbac.authorization.k8s。io/v1 kind: RoleBinding metadata: name: connector-configuration-role-binding namespace: 开云体育官方注册网址debezium-example subjects:—kind: ServiceAccount name: debezium-connect-cluster-connect namespace: debezium-example roleRef: kind: Role name: connector-configuration-role apiGroup: rbac.authorization.k8s。io EOF

一旦我们部署Kafka Connect,服务帐户将由Strimzi创建。服务帐户的名称采用表单KafkaConnectName-connect美元.稍后,我们将创建Kafka Connect集群命名开云体育官方注册网址debezium-connect-cluster因此我们使用开云体育官方注册网址debezium-connect-cluster-connect这里作为subjects.name

部署Apache Kafka

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

$ cat << EOF | kubectl create -n 开云体育官方注册网址debezu -example -f - apiVersion: kafka.strimzi。io / v1beta2:卡夫卡元数据:名称:debezium-cluster开云体育官方注册网址规范:卡夫卡:副本:1听众:-名称:普通端口:9092类型:内部tls:错:名称:tls端口:9093类型:内部tls:真正的身份验证:类型:tls -名称:外部端口:9094类型:nodeport tls:错误的存储:类型:文件卷:- id: 0类型:persistent-claim大小:100 gi deleteClaim:错误的配置: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 zookeeper: replicas: 1 storage: type:持久化-claim size: 100Gi deletecclaim: false entityOperator: topicOperator: {} userOperator: {} EOF
  • 等到它准备好了:

$ kubectl wait kafka/开云体育官方注册网址 debian -cluster——for=condition=Ready——timeout=300s -n debian -example

部署数据源

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

$ cat << EOF | kubectl create -n 开云体育官方注册网址debezium-example -f - apiVersion: v1 kind:服务元数据:name: mysql spec: ports: - port: 3306 selector: app: mysql clusterIP: None——apiVersion: apps/v1 kind:部署元数据:name: mysql spec: selector: matchLabels: app: mysql strategy: type:重建模板:元数据:labels: app: mysql spec: containers: - image: quay.io/debezium/example-mysql:2.1 name: mysql env: - name: MYSQL_ROOT_PASSWORD值:debezium- name: MYSQL_USER值:mysqluser - name: MYSQL_PASSWORD value: mysqlpw ports:—containerPort: 3306 name: mysql EOF

部署Debezium连接开云体育官方注册网址器

要部署Debezium连开云体育官方注册网址接器,在实例化实际连接器本身之前,您需要部署一个Kafka Connect集群,其中包含所需的连接器插件。作为第一步,必须为Kafka Connect创建一个带有插件的容器映像。如果已经构建了容器映像,并且在注册表中可用,则可以跳过此步骤。本文以MySQL连接器为例进行说明。

创建Kafka连接集群

同样,我们将使用Strimzi创建Kafka Connect集群。Strimzi还可以用于为我们构建和推送所需的容器映像。类中可以直接提供构建容器映像的指令,并且可以将这两个任务合并在一起KafkaConnect对象规范:

$ cat << EOF | kubectl create -n 开云体育官方注册网址debezu -example -f - apiVersion: kafka.strimzi。io/v1beta2 kind: KafkaConnect元数据:name: debezu 开云体育官方注册网址-connect-cluster注释:strimzi。io/use-connector-resources: "true" spec: version: 3.1.0 replicas: 1 bootstrapServers: 开云体育官方注册网址debezum -cluster-kafka-bootstrap:9092 config: config。config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider组。id: connect-cluster offset.storage.topic: connect-cluster-offsets config.storage.topic: connect-cluster-configs status.storage.topic: connect-cluster-status # 1意味着它将使用默认的复制因子中配置代理config.storage.replication.factor: 1 offset.storage.replication.factor: 1 status.storage.replication.factor: 1建立:输出:类型:码头工人形象:10.110.154.103 / debezium-connect-mysql:最新插件:-名称:debezium-mysql-connector构件:-类型:tgz url:开云体育官方注册网址https://repo1.maven.org/maven2/io/开云体育官方注册网址debezium/debezium-connector-mysql/ {debezium-version} / debezium-connector-mysql - {debezium-version} -plugin.tar.gz EOF

需要替换注册表的IP地址10.110.154.103在注册表中,您可以推送图像。如果您在minikube上使用注册表插件运行它,您可以将映像推入minikube内部注册表。注册表的IP地址可以通过运行

$ kubectl -n kube-system获取svc注册表-o jsonpath='{.spec.clusterIP}'

为了简单起见,我们跳过了下载工件的校验和验证。方法指定其校验和,以确保工件已正确下载sha512sum属性。看到Strimzi文档欲知详情。

如果您已经在本地或远程注册中心(如quay。io或DockerHub),你可以使用这个简化版本:

$ cat << EOF | kubectl create -n 开云体育官方注册网址debezu -example -f - apiVersion: kafka.strimzi。io/v1beta2 kind: KafkaConnect元数据:name: debezu 开云体育官方注册网址-connect-cluster注释:strimzi。io/use-connector-resources: "true" spec: version: 3.1.0 image: 10.110.154.103/开云体育官方注册网址 debian -connect-mysql:latest replicas: 1 bootstrapServers: debian -cluster-kafka-bootstrap:9092 config: config. execonfig.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider组。id: connect-cluster offset.storage.topic: connect-cluster-offset config.storage.topic: connect-cluster-configs status.storage.topic: connect-cluster-status # -1表示它将使用代理中配置的默认复制因子

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

创建Debezium连开云体育官方注册网址接器

要创建Debezium连开云体育官方注册网址接器,只需要创建一个KafkaConnector使用适当的配置,MySQL在这种情况下:

$ cat << EOF | kubectl create -n 开云体育官方注册网址debezu -example -f - apiVersion: kafka.strimzi。io/v1beta2 kind: KafkaConnector元数据:name: debezu 开云体育官方注册网址-connector-mysql labels: strimzi。io. debezu .开云体育官方注册网址connector.mysql. mysqlconnector tasksMax: 1配置:任务。最大值:1个数开云体育电动老虎机据库。主机名:mysql数据库。开云体育电动老虎机端口:3306数据库。开云体育电动老虎机用户:${secrets:deb开云体育官方注册网址ezium-example/debezium-secret:use开云体育电动老虎机rname}数据库。密码: ${secrets:debezium-example/debezium-secret:password} database.server.id: 184054 topic.prefix: mysql database.include.list: inventory schema.history.internal.kafka.bootstrap.servers: debezium-cluster-kafka-bootstrap:9092 schema.history.internal.kafka.topic: schema-changes.inventory EOF

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

验证部署结果

为了验证一切正常,你可以开始观看mysql.inventory.customers卡夫卡的话题:

$ kubectl run -n 开云体育官方注册网址debezium-example -it——rm——image=quay.io/debezium/ tools:1.2——restart=Never watcher——kcat -b debezium-cluster-kafka-bootstrap:9092 -C -o beginning -t mysql.库存.customers

连接MySQL数据库:开云体育电动老虎机

$ kubectl run -n 开云体育官方注册网址debezium-example -it——rm——image=mysql:8.0——restart=Never——env MYSQL_ROOT_PASSWORD=debezium mysqlterm——mysql -hmysql -P3306 -uroot -pdebezium

有什么变化吗客户表:

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

你现在应该能够观察到Kafka主题的变化事件:

{…"payload": {"before": {"id": 1001, "first_name": "Sally", "last_name": "Thomas", "email": "sally.thomas@acme.com"}, "after": {"id": 1001, "first_name": "Sally Marie", "last_name": "Thomas", "email": "sally.thomas@acme.com"}, "source": {"version": "{debezi开云体育官方注册网址e -version}", "connector": "mysql", "name": "mysql", "ts_ms": 1646300467000, "snapshot": "false", "db": "inventory", "sequence": null, "table": "customers", "server_id": 223344, "gtid": null, "file": "mysql-bin "。000003", "pos": 401, "row": 0, "thread": null, "query": null}, "op": "u", "ts_ms": 1646300467746, "transaction": null}}