所以我的目标是以分布式的方式建立一个由几个卡夫卡经纪人组成的集群。但我看不出有什么办法能让经纪人们互相了解。
据我所知,每个代理在配置中都需要一个单独的ID,如果我从kubernetes启动容器,就不能保证或配置这个ID?
他们还需要拥有相同的advertised_host吗?
是否有任何参数需要更改才能使节点彼此发现?
在Dockerfile的末尾使用脚本进行这样的配置是否可行?和/或共享音量?
我目前正在尝试使用spotify/kafka-图像,它有一个预先配置的zookeeper+kafka组合,在香草库伯内特斯。
发布于 2015-08-26 10:00:39
我的解决方案是使用,使用IP作为ID:修剪点,然后得到一个唯一的ID,这个ID在容器之外也可以用于其他容器。
使用一个服务,您可以访问多个容器的IP(请参阅我在这里的答案,关于如何做到这一点:什么是最好的方式让库本斯豆荚相互沟通? )
所以,如果你使用if作为唯一的ID,你也可以得到它们的ID。唯一的问题是,ID不是连续的,也不是从0开始的,但是动物园管理员/ kafka似乎并不介意。
编辑1:
后续关注的问题是配置Zoo门将:
每个ZK节点都需要知道其他节点。Kubernetes发现服务知道服务中的节点,因此我们的想法是使用ZK节点启动服务。
此服务需要在创建动物园管理员舱的ReplicationController (RC)之前启动。
然后,ZK容器的启动脚本需要:
KUBERNETES_SERVICE_HOST
环境变量。然后将查找服务描述的端点。URL="http(s)://$USERNAME:$PASSWORD@${KUBERNETES_SERVICE_HOST/api/v1/namespaces/${NAMESPACE}/endpoints/${SERVICE_NAME}"
其中NAMESPACE
是default
,除非您更改了它,如果您将服务动物园管理员命名为SERVICE_NAME
,则SERVICE_NAME
将是动物园管理员。
在那里,您可以得到构成服务的容器的描述,它们的ip位于"ip“字段中。你可以:
curl -s $URL | grep '\"ip\"' | awk '{print $2}' | awk -F\" '{print $2}'
以获取服务部门的IP列表。这样,使用上面定义的ID在节点上填充zoo.cfg
您可能需要用户名和密码才能到达像google容器引擎这样的服务的端点。这些需要放在一个秘密卷中(参见文档此处:http://kubernetes.io/v1.0/docs/user-guide/secrets.html )
您还需要在Google上使用curl -s --insecure
,除非您经历了将CA证书添加到您的荚中的麻烦
基本上将卷添加到容器中,并从文件中查找值。(与文档所说的相反,当base64编码时,不要将\n放在用户名或密码的末尾:它只会使您的生活变得更加复杂。)
编辑2:
在Kafka节点上需要做的另一件事是获取IP和主机名,并将它们放在/etc/host文件中。Kafka似乎需要通过主机名来了解节点,默认情况下,这些节点不是在服务节点中设置的。
编辑3:
经过大量的尝试和思考,使用IP作为ID可能不是很大:这取决于您如何配置存储。对于任何类型的分布式服务,如Zoo门将、kafka、mongo、hdfs,您可能想要使用emptyDir类型的存储,所以它只是在该节点上(安装远程存储类型会使分发这些服务的目的落空!)emptyDir将放松对同一节点上的数据,因此使用节点ID (节点IP)作为ID似乎更符合逻辑,因为在同一节点上重新启动的pod将获得数据。这样就避免了数据的潜在损坏(如果一个新节点开始在实际不为空的dir中写入,谁知道会发生什么),也可以使用Kafka,为主题分配一个broker.id,如果代理id更改,动物园管理员不会更新主题broker.id,主题看起来是可用的,但指向错误的broker.id,这就一团糟了。
到目前为止,我还没有找到如何获得节点IP,但我认为可以通过查找服务荚名称和部署在其上的节点来在API中查找。
编辑4
要获得节点IP,您可以从端点API /api/v1/ == /default/endpoint/如前所述中获得名称。然后,您可以使用/api/v1/命名空间/default/pods/从荚名称中获取节点IP。
PS:这是由Kubernetes回购中的示例(这里是rethinkdb的示例:https://github.com/kubernetes/kubernetes/tree/master/examples/rethinkdb )引起的。
发布于 2016-03-15 23:05:14
看看https://github.com/CloudTrackInc/kubernetes-kafka,它允许在kubernetes中启动Kafka,并支持缩放它和自动扩展。
发布于 2017-09-20 09:14:59
这在我的搜索中很显眼,但是包含了相当过时的信息。要用更现代的解决方案更新这一点,您应该使用StatefulSet部署,它将生成具有整数计数器而不是名称中的散列的荚,例如。卡夫卡-控制器-0。
当然,这就是主机名,因此使用awk提取一个固定的、不变的代理ID很简单:
hostname | awk -F'-' '{print $3}'
目前卡夫卡最流行的容器有一个代理ID命令。
https://stackoverflow.com/questions/32140025
复制相似问题