我使用istio-ingress网关和virtualservice来公开不同的微服务。到目前为止,所有这些都是http服务,所以直接按照istio的文档进行操作。
但对于卡夫卡,我面临着一些问题。我正在使用bitnami/kafka舵表安装kafka。这是用于它的值:
global:
storageClass: "kafka-sc"
replicaCount: 3
deleteTopicEnable: true
resources:
requests:
memory: 1024Mi
cpu: 500m
limits:
memory: 2048Mi
cpu: 1000m
zookeeper:
replicaCount: 3
resources:
requests:
memory: 1024Mi
cpu: 500m
limits:
memory: 2048Mi
cpu: 1000m
此部署在此端点上公开kafka:my-kafka.kafka.svc.cluster.local:9092
我希望这个端点可以使用入口控制器通过互联网访问。因此,我应用了以下kubernetes清单-->
A。kafka-ingress-gateway.yaml
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: kafka-ingress-gateway
namespace: kafka
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 9092
name: tcp
protocol: TCP
hosts:
- "kafka.<public_domain>"
B。kafka-ingress-virtualservice.yaml
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: kafka-ingress-virtualservice
namespace: kafka
spec:
hosts:
- "kafka.<public_domain>"
gateways:
- kafka/kafka-ingress-gateway
tcp:
- match:
- port: 9092
route:
- destination:
host: my-kafka.kafka.svc.cluster.local
port:
number: 9092
为了验证这是否有效,我使用以下方法:
- 创建一个kafka客户端pod并在两个不同的终端中登录
- 在第一个终端中,我使用以下命令生成一个名为
test
的主题:kafka-console-producer.sh --broker-list my-kafka-0.my-kafka-headless.kafka.svc.cluster.local:9092 --topic test
- 在第二个终端,我使用这个命令在
test
主题中消费
在这里,这是有效的:kafka-console-consumer.sh --bootstrap-server my-kafka.kafka.svc.cluster.local:9092 --topic test --from-beginning
这不起作用:kafka-console-consumer.sh --bootstrap-server kafka.<public_domain>:9092 --topic test --from-beginning
我收到这个错误:WARN [Consumer clientId=consumer-console-consumer-89304-1, groupId=console-consumer-89304] Bootstrap broker kafka.<public_domain>:9092 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
我是kafka的新手,所以不确定还需要什么来公开消费者端点。从stackoverflow的类似问题中,我注意到我们应该定义";advertisedListeners";在kafka配置中,但不确定要在其中设置什么值。
如果我遗漏了任何细节,请告诉我。
编辑您的istio-ingressgateway并为tcp端口添加9092
kubectl edit svc -nistio-system istio-ingressgateway
添加
- name: kafka-broker
port: 9092
protocol: TCP
targetPort: 9092
您需要从Kubernetes服务获取负载平衡器的DNS名称或IP地址,例如,您应该在那里的状态部分找到它。然后使用它来配置您想要公开的Kafka代理中的播发地址。不过,我不确定是否需要公开引导服务器端点。