我正在aws上运行一个kops-kubernetes集群,试图让kubernetes-kafka示例与一个弹性负载平衡器一起工作。以下是两位经纪人的外部服务部分:
kind: Service
apiVersion: v1
metadata:
name: outside-0
namespace: kafka
spec:
selector:
app: kafka
kafka-broker-id: "0"
ports:
- protocol: TCP
targetPort: 9094
port: 32400
nodePort: 32400
type: NodePort
---
kind: Service
apiVersion: v1
metadata:
name: outside-1
namespace: kafka
spec:
selector:
app: kafka
kafka-broker-id: "1"
ports:
- protocol: TCP
targetPort: 9094
port: 32401
nodePort: 32401
type: NodePort
下面是我试图通过elb(实际的fqdn替换为 my.copmany.com
).
apiVersion: v1
kind: Service
metadata:
name: kafka-0
annotations:
dns.alpha.kubernetes.io/external: kafka-0.kafka.my.company.com
spec:
type: LoadBalancer
ports:
- port: 32400
name: outside
targetPort: 32400
selector:
app: outside-0
---
apiVersion: v1
kind: Service
metadata:
name: kafka-1
annotations:
dns.alpha.kubernetes.io/external: kafka-1.kafka.my.company.com
spec:
type: LoadBalancer
ports:
- port: 32401
name: outside
targetPort: 32401
selector:
app: outside-1
查看aws elb控制台,可以看到3个示例中的0个可用于每个kafka elb代理和生产 kafka-1.kafka.my.company.com:9094
使用kafka命令行客户端超时。你怎么能 outside-0
nodeport服务将通过 kafka-0
负载均衡器服务?或者有没有其他方法可以考虑?
4条答案
按热度按时间kdfy810k1#
目标端口设置不正确,您必须使用容器端口,节点端口将自动分配。配置如下所示:
外部端口可以是任何您想要的,例如,您可以使用9094,与容器的端口相同,并且它可以是所有服务的相同端口,因为您使用不同的elb。只要确保选择器设置正确,这应该可以正常工作。
pw9qyyiw2#
根据文档(kuebrnetes服务类型):
loadbalancer:使用云提供商的负载均衡器对外公开服务。外部负载平衡器将路由到的nodeport和clusterip服务将自动创建。
您不应该为nodeport和loadbalancer类型定义单独的服务,而应该仅为
LoadBalancer
与nodePort
指定(请测试并尝试添加/删除某些选项,因为我没有可以测试此选项的环境):kubernetes集群应该配置awsapi访问。
kubelet
,kube-apiserver
,kube-controller-manager/cloud-controller-manager
有云配置选项。v8wbuo2f3#
kakfa对需要直接访问服务器的客户机非常挑剔,服务器是主题的领导者。为此,我做了以下工作:
1) 设置configmap以基于pod的序号值动态重写adverted.listeners的值
2) 为每个kafka pod创建一个负载均衡器服务。更改选择器以匹配您的Kafka吊舱id。
jckbn6z74#
这些kubernetes配置看起来是正确的。但是,如果aws控制台显示“3个示例中的0个可用”,则通常意味着您未通过elb healthcheck。如果没有一个健康的后端示例可将数据发送到,elb将丢弃任何通信量,这将解释对kafka的调用超时的原因。
nodeport服务的一个简单的elb healthcheck就是ssh来查看示例本身是否是活动的,因为该示例上的kube代理实际上是将流量转发到正确的示例的。如果您在elb上只运行一个侦听器,那么您实际上可以在healthcheck中检查该端口(我经常为每个elb运行一堆nodeport侦听器,而不是为每个nodeport服务运行一个侦听器,以节省资金。)