我正在亚马逊网络服务上运行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命令行客户端超时生成到kafka-1.kafka.my.company.com:9094
。如何通过kafka-0
LoadBalancer服务公开outside-0
NodePort服务?或者是否有其他方法可以考虑?
发布于 2018-02-08 16:38:36
Kakfa对于需要直接访问服务器的客户端非常挑剔,因为服务器是主题的领导者。为了实现这一点,我做了以下工作:
1)设置configmap,根据pod的序数值动态覆盖advertised.listeners的值
POD_ID=${HOSTNAME##*-}
kafka-server-start.sh server.properties \
--override advertised.listeners=INSIDE://`hostname -f`:9092,OUTSIDE://kafka-${POD_ID}.kafka.my.company.com:9094 \
--override broker.id=${POD_ID} \
--override listeners=INSIDE://:9092,OUTSIDE://:9094
2)为每个Kafka实例创建一个LoadBalancer服务。更改选择器以匹配您的kafka-pod-id。
apiVersion: v1
kind: Service
metadata:
name: kafka-0
annotations:
dns.alpha.kubernetes.io/external: kafka-0.kafka.my.company.com
spec:
externalTrafficPolicy: Local
type: LoadBalancer
ports:
- port: 9094
name: outside
targetPort: 9094
selector:
app: kafka
kafka-pod-id: "0"
---
apiVersion: v1
kind: Service
metadata:
name: kafka-1
annotations:
dns.alpha.kubernetes.io/external: kafka-1.kafka.my.company.com
spec:
externalTrafficPolicy: Local
type: LoadBalancer
ports:
- port: 9094
name: outside
targetPort: 9094
selector:
app: kafka
kafka-pod-id: "1"
发布于 2018-02-06 01:30:28
这些Kubernetes配置看起来是正确的。然而,如果AWS控制台显示“3个实例中有0个可用”,这通常意味着您没有通过ELB运行状况检查。如果没有健康的后端实例可用来发送数据,ELB将丢弃任何流量,这将解释调用Kafka超时的原因。
对于nodeport服务,一个简单的ELB健康检查只需使用SSH来查看实例本身是否处于活动状态,因为该实例上的kube-proxy实际上会将流量转发到正确的实例。如果您只在ELB上运行一个侦听器,那么您可以在健康检查中实际检查该端口。(为了省钱,我经常为每个ELB运行一组nodeport侦听器,而不是每个nodeport服务运行一个。)
发布于 2018-02-04 20:14:08
根据文档(Kuebrnetes Service Types):
LoadBalancer:使用云提供商的负载均衡器对外公开服务。自动创建外部负载均衡器将路由到的NodePort和ClusterIP服务。
您不应该为NodePort和LoadBalancer类型定义单独的服务,而应该只为指定了nodePort
的LoadBalancer
定义服务(请测试并尝试添加/删除一些选项,因为我没有可以在其上测试的环境):
apiVersion: v1
kind: Service
metadata:
name: kafka-0
spec:
type: LoadBalancer
ports:
- port: 32400
name: kafka
nodePort: 32400
selector:
app: kafka
kafka-broker-id: "0"
---
apiVersion: v1
kind: Service
metadata:
name: kafka-1
spec:
type: LoadBalancer
ports:
- port: 32401
name: kafka
nodePort: 32401
selector:
app: kafka
kafka-broker-id: "1"
kubelet
、kube-apiserver
、kube-controller-manager/cloud-controller-manager
都有云配置选项。https://stackoverflow.com/questions/48533548
复制相似问题