通过aws上的elb公开kubernetes上的单个kafka代理

8xiog9wr  于 2021-06-07  发布在  Kafka
关注(0)|答案(4)|浏览(456)

我正在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 负载均衡器服务?或者有没有其他方法可以考虑?

kdfy810k

kdfy810k1#

目标端口设置不正确,您必须使用容器端口,节点端口将自动分配。配置如下所示:

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: 9094
    name: outside
    targetPort: 9094
  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: 9094
    name: outside
    targetPort: 9094
  selector:
    app: outside-1

外部端口可以是任何您想要的,例如,您可以使用9094,与容器的端口相同,并且它可以是所有服务的相同端口,因为您使用不同的elb。只要确保选择器设置正确,这应该可以正常工作。

pw9qyyiw

pw9qyyiw2#

根据文档(kuebrnetes服务类型):
loadbalancer:使用云提供商的负载均衡器对外公开服务。外部负载平衡器将路由到的nodeport和clusterip服务将自动创建。
您不应该为nodeport和loadbalancer类型定义单独的服务,而应该仅为 LoadBalancernodePort 指定(请测试并尝试添加/删除某些选项,因为我没有可以测试此选项的环境):

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"

kubernetes集群应该配置awsapi访问。 kubelet , kube-apiserver , kube-controller-manager/cloud-controller-manager 有云配置选项。

v8wbuo2f

v8wbuo2f3#

kakfa对需要直接访问服务器的客户机非常挑剔,服务器是主题的领导者。为此,我做了以下工作:
1) 设置configmap以基于pod的序号值动态重写adverted.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 pod创建一个负载均衡器服务。更改选择器以匹配您的Kafka吊舱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"
jckbn6z7

jckbn6z74#

这些kubernetes配置看起来是正确的。但是,如果aws控制台显示“3个示例中的0个可用”,则通常意味着您未通过elb healthcheck。如果没有一个健康的后端示例可将数据发送到,elb将丢弃任何通信量,这将解释对kafka的调用超时的原因。
nodeport服务的一个简单的elb healthcheck就是ssh来查看示例本身是否是活动的,因为该示例上的kube代理实际上是将流量转发到正确的示例的。如果您在elb上只运行一个侦听器,那么您实际上可以在healthcheck中检查该端口(我经常为每个elb运行一堆nodeport侦听器,而不是为每个nodeport服务运行一个侦听器,以节省资金。)

相关问题