首页 > 其他分享 >Debezium系列之:在 Kubernetes 上部署 Debezium

Debezium系列之:在 Kubernetes 上部署 Debezium

时间:2023-09-11 10:01:55浏览次数:43  
标签:Kubernetes 部署 Kafka -- 连接器 Debezium debezium



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

  • 一、概述
  • 二、先决条件
  • 三、为数据库创建Secrets
  • 四、部署Apache Kafka
  • 五、部署数据源
  • 六、部署 Debezium 连接器
  • 七、创建 Debezium 连接器
  • 八、验证部署


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

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

  • Debezium专栏

一、概述

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

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

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

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

minikube addons enable registry

二、先决条件

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

kubectl create ns debezium-example

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

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

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

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

现在,安装 Strimzi operator本身:

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

三、为数据库创建Secrets

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

我们先创建 Secret 对象:

$ cat << EOF | kubectl create -n debezium-example -f -
apiVersion: v1
kind: Secret
metadata:
  name: debezium-secret
  namespace: debezium-example
type: Opaque
data:
  username: ZGViZXppdW0=
  password: ZGJ6
EOF

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

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

$ cat << EOF | kubectl create -n debezium-example -f -
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: connector-configuration-role
  namespace: debezium-example
rules:
- apiGroups: [""]
  resources: ["secrets"]
  resourceNames: ["debezium-secret"]
  verbs: ["get"]
EOF

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

cat << EOF | kubectl create -n debezium-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 形式。稍后,我们将创建名为 debezium-connect-cluster 的 Kafka Connect 集群,因此我们在这里使用 debezium-connect-cluster-connect 作为 subject.name。

四、部署Apache Kafka

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

$ cat << EOF | kubectl create -n debezium-example -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: Kafka
metadata:
  name: debezium-cluster
spec:
  kafka:
    replicas: 1
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: tls
      - name: external
        port: 9094
        type: nodeport
        tls: false
    storage:
      type: jbod
      volumes:
      - id: 0
        type: persistent-claim
        size: 100Gi
        deleteClaim: false
    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
  zookeeper:
    replicas: 1
    storage:
      type: persistent-claim
      size: 100Gi
      deleteClaim: false
  entityOperator:
    topicOperator: {}
    userOperator: {}
EOF

等待它准备好:

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

五、部署数据源

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

$ cat << EOF | kubectl create -n debezium-example -f -
apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  ports:
  - port: 3306
  selector:
    app: mysql
  clusterIP: None
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: mysql
spec:
  selector:
    matchLabels:
      app: mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - image: quay.io/debezium/example-mysql:2.3
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: debezium
        - name: MYSQL_USER
          value: mysqluser
        - name: MYSQL_PASSWORD
          value: mysqlpw
        ports:
        - containerPort: 3306
          name: mysql
EOF

六、部署 Debezium 连接器

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

$ cat << EOF | kubectl create -n debezium-example -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: debezium-connect-cluster
  annotations:
    strimzi.io/use-connector-resources: "true"
spec:
  version: 3.1.0
  replicas: 1
  bootstrapServers: debezium-cluster-kafka-bootstrap:9092
  config:
    config.providers: secrets
    config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider
    group.id: connect-cluster
    offset.storage.topic: connect-cluster-offsets
    config.storage.topic: connect-cluster-configs
    status.storage.topic: connect-cluster-status
    # -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
  build:
    output:
      type: docker
      image: 10.110.154.103/debezium-connect-mysql:latest
    plugins:
      - name: debezium-mysql-connector
        artifacts:
          - type: tgz
            url: https://repo1.maven.org/maven2/io/debezium/debezium-connector-mysql/{debezium-version}/debezium-connector-mysql-{debezium-version}-plugin.tar.gz
EOF

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

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

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

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

$ cat << EOF | kubectl create -n debezium-example -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnect
metadata:
  name: debezium-connect-cluster
  annotations:
    strimzi.io/use-connector-resources: "true"
spec:
  version: 3.1.0
  image: 10.110.154.103/debezium-connect-mysql:latest
  replicas: 1
  bootstrapServers: debezium-cluster-kafka-bootstrap:9092
  config:
    config.providers: secrets
    config.providers.secrets.class: io.strimzi.kafka.KubernetesSecretConfigProvider
    group.id: connect-cluster
    offset.storage.topic: connect-cluster-offsets
    config.storage.topic: connect-cluster-configs
    status.storage.topic: connect-cluster-status
    # -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
EOF

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

七、创建 Debezium 连接器

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

$ cat << EOF | kubectl create -n debezium-example -f -
apiVersion: kafka.strimzi.io/v1beta2
kind: KafkaConnector
metadata:
  name: debezium-connector-mysql
  labels:
    strimzi.io/cluster: debezium-connect-cluster
spec:
  class: io.debezium.connector.mysql.MySqlConnector
  tasksMax: 1
  config:
    tasks.max: 1
    database.hostname: mysql
    database.port: 3306
    database.user: ${secrets:debezium-example/debezium-secret:username}
    database.password: ${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

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

八、验证部署

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

kubectl run -n debezium-example -it --rm 
 --image=quay.io/debezium/tooling:1.2  
 --restart=Never watcher 
 -- kcat -b debezium-cluster-kafka-bootstrap:9092 
 -C -o beginning -t mysql.inventory.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": "[email protected]"
    },
    "after": {
      "id": 1001,
      "first_name": "Sally Marie",
      "last_name": "Thomas",
      "email": "[email protected]"
    },
    "source": {
      "version": "{debezium-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
  }
}


标签:Kubernetes,部署,Kafka,--,连接器,Debezium,debezium
From: https://blog.51cto.com/u_12080573/7432216

相关文章

  • Debezium系列之:获取Oracle JDBC驱动程序和XStream API文件
    Debezium系列之:获取OracleJDBC驱动程序和XStreamAPI文件一、背景二、详细步骤1.下载OracleClient包2.解压缩3.复制ojdbc8.jar和xstreams.jar文件4.创建环境变量三、XStream连接器属性一、背景DebeziumOracle连接器需要OracleJDBC驱动程序(ojdbc8.jar)才能连接到Oracl......
  • Debezium系列之:Debezium logging
    Debezium系列之:Debeziumlogging一、概述二、日志记录概念三、了解默认日志记录配置四、配置日志记录1.通过配置记录器设置日志记录级别2.使用KafkaConnectRESTAPI动态设置日志记录级别3.使用映射的诊断上下文设置日志记录级别五、配置Debezium容器镜像中的日志级别Debezi......
  • Debezium系列之:发布Debezium 2.3.0.Final
    Debezium系列之:发布Debezium2.3.0.Final一、重大变化1.PostgreSQL/MySQL安全连接更改2.JDBC存储编码更改二、新功能和改进1.DebeziumServer支持K8s2.新的通知子系统3.新的可扩展信号子系统4.JMX信号和通知集成5.新的JDBC存储子系统6.PostgreSQL流式传输的恰好一次传送7.......
  • Debezium系列之:Debezium 通知
    Debezium系列之:Debezium通知一、概述二、Debezium通知格式三、可用的通知四、启用Debezium通知五、访问DebeziumJMX通知六、自定义通知渠道七、配置自定义通知渠道八、Debezium核心模块依赖项九、部署自定义通知渠道十、配置连接器以使用自定义通知通道一、概述Debezium......
  • Kubernetes 部署
    Kubernetes部署在k8s上进行部署前,首先需要了解一个基本概念DeploymentDeployment(部署)。在k8s中,通过发布Deployment,可以创建应用程序(dockerimage)的实例(dockercontainer),这个实例会被包含在称为Pod的概念中,Pod是k8s中最小可管理单元。在k8s集群中发布Depl......
  • 14、liunx环境下部署分布式压测集群
    一、java环境安装与配置官网下载jdk-15.0.1_linux-x64_bin.tar.gz,上传到liunx服务器(官网跳转)解压文件:tar-xzfjdk-15.0.1_linux-x64_bin.tar.gz,生成文件夹jdk-15.0.1在/usr/目录下创建java文件夹,将jdk-15.0.1移动到java文件夹下注意:移动文件夹需要处于文件存在位......
  • debezium报错:no longer available on the server. Reconfigure the connector to use
    debezium报错:nolongeravailableontheserver.Reconfiguretheconnectortouseasnapshotwhenneede完整报错如下:-“trace”:"io.debezium.DebeziumException:TheconnectoristryingtoreadbinlogstartingatSourceInfo[currentGtid=null,currentBinlogFilename......
  • debezium报错:Caused by: io.debezium.DebeziumException:whose schema isn‘t known t
    debezium报错:Causedby:io.debezium.DebeziumException:whoseschemaisn’tknowntothisconnector“trace”:"org.apache.kafka.connect.errors.ConnectException:Anexceptionoccurredinthechangeeventproducer.Thisconnectorwillbestopped.Causedby:io.......
  • Ingress企业实战:部署高可靠性Ingress篇
    什么是Ingress当你在Kubernetes集群中运行多个应用程序时,每个应用程序都有自己的服务。为了让外部用户访问这些应用程序,就好像他们访问网站一样,我们需要一种方法来管理流量的分配和路由。这就是Ingress的作用。想象一下,您的Kubernetes集群就像一个大型的公寓楼,每个公寓是一个应用......
  • Tomcat 部署项目的两个步骤
    1、把项目放到tomcat的webapps文件夹下2、在server.xml中加上该项目文件夹 ......