如何在Kubernetes上为Kafka-connect创建连接器?

时间:2020-02-01 09:57:58

标签: kubernetes apache-kafka apache-kafka-connect

我正在使用Kafka-connect Helm图表在分布式模式下在Google Kubernetes Engine(GKE)上部署cp-kafka-connect

具有代理和Zookeeper的可运行的Kafka集群已经在同一GKE集群上运行。我知道可以通过向http://localhost:8083/connectors端点发送发布请求来创建连接器。 但是,Kafka-connect容器进入RUNNING状态,然后开始加载jar文件,直到所有jar文件加载完毕,上述端点才无法访问。

我正在寻找一种自动执行以下步骤的方法:手动exec吊舱,检查端点是否准备就绪,然后发送发布请求。我有一个Shell脚本,该脚本具有到该端点的一堆curl -X POST请求以创建连接器,并且还具有这些连接器的配置文件,这些文件在独立模式下可以正常工作(使用此confluent blog中的Confluent平台显示)

现在只有两种创建连接器的方法:

  1. 以某种方式确定容器实际准备就绪的时间(端点开始侦听的时间),然后运行包含curl请求的shell脚本
  2. 或者像在独立模式下一样使用配置文件(例如:$ <path/to/CLI>/confluent local load connector_name -- -d /connector-config.json

以上哪种方法更好?

第二种方法(配置文件)甚至可以在分布式模式下使用吗?

  • 如果 是: 该怎么做?
  • 如果 否: :如何成功完成第一种方法中说明的操作?

编辑: 关于他的github issue(由于下面的@ cricket_007的回答),我添加了以下内容,作为容器命令和端点准备就绪后创建的连接器:

...
command:
  - /bin/bash
  - -c
  - |
    /etc/confluent/docker/run &
    echo "Waiting for Kafka Connect to start listening on kafka-connect  "
    while : ; do
      curl_status=`curl -s -o /dev/null -w %{http_code} http://localhost:8083/connectors`
      echo -e `date` " Kafka Connect listener HTTP state: " $curl_status " (waiting for 200)"
      if [ $curl_status -eq 200 ] ; then
        break
      fi
      sleep 5
    done
    echo -e "\n--\n+> Creating Kafka Connector(s)"
    /tmp/scripts/create-connectors.sh
    sleep infinity
...

/tmp/scripts/create-connectors.sh是一个外部安装的脚本,其中包含使用CURL到Kafka-connect API的一堆POST请求。

1 个答案:

答案 0 :(得分:1)

React-Router不与远程Connect集群(例如Kubernetes中的一个集群)交互。

请参阅Kafka Connect REST API

您将像在集群中运行的任何其他RESTful api一样连接到它(例如,通过Nodeport或Ingress / API网关)

上述端点不可访问。

Localhost是您要在其中键入命令的物理计算机,而不是远程GKE群集

以某种方式确定何时实际准备好容器

Kubernetes健康检查对此负责

const PrivateRoute = ({ component: Component, ...rest }) => {

  const [auth, setAuth] = useState(false);

  useEffect(() => {}, [auth])

  useEffect(() => {
    // send jwt to API to see if it's valid
    let token = localStorage.getItem("token");
    if (token) {
      fetch("/protected", {
        method: "POST",
        headers: {
          'Accept': 'application/json',
          'Content-Type': 'application/json'
        },
        body: JSON.stringify({ token })
      })
      .then((res) => {
        return res.json()
      })
      .then((json) => {
        if (json.success) {
          setAuth(true);
        }
      })
      .catch((err) => {
        setAuth(false);
        localStorage.removeItem("token");
      });
    }

  }, [])

  return (<Route {...rest}
    render={(props) => {
      return auth ? <Component {...props} /> : <Redirect to="/login" />
    }} />)
  }
}

只有两种创建连接器的方式

那不是事实。您可以在集群中另外运行Landoop的Kafka Connect UI或Confluent Control Center来指向并单击。

但是,如果您有本地配置文件,还可以编写代码以与API交互

或者尝试看看您是否可以针对此问题进行公关

https://github.com/confluentinc/cp-docker-images/issues/467