【发布时间】:2021-09-01 05:37:54
【问题描述】:
我正在尝试将用于测试 Kafka 功能的 dockerised 应用程序转换为 Kubernetes 部署文件。
执行按预期工作的容器的 docker 命令是:
docker run --name consumer-1 --network="host" -dt 56d57e1538d3 pizzaapp_multiconsumer1.py bash
但是,当将其转换为以下 Kubernetes 部署文件并执行它时,我在 pod 上收到 CrashLoopBackOff 错误。
spec:
hostNetwork: true
containers:
- name: kafka-consumer
image: bhuvidockerhub/kafkaproject:v1.0
imagePullPolicy: IfNotPresent
args: ["pizzaapp_multiconsumer1.py", "bash"]
imagePullSecrets:
- name: regcred
在检查失败 pod 的日志时,我看到了这个错误:
Traceback (most recent call last):
File "//pizzaapp_multiconsumer1.py", line 12, in <module>
multiconsume_pizza_messages()
File "/testconsumer1.py", line 14, in multiconsume_pizza_messages
kafka_admin_client: KafkaAdminClient = KafkaAdminClient(
File "/usr/local/lib/python3.9/site-packages/kafka/admin/client.py", line 208, in __init__
self._client = KafkaClient(metrics=self._metrics,
File "/usr/local/lib/python3.9/site-packages/kafka/client_async.py", line 244, in __init__
self.config['api_version'] = self.check_version(timeout=check_timeout)
File "/usr/local/lib/python3.9/site-packages/kafka/client_async.py", line 900, in check_version
raise Errors.NoBrokersAvailable()
kafka.errors.NoBrokersAvailable: NoBrokersAvailable
但是代理容器已经启动并运行
my-cluster-with-metrics-entity-operator-7d8894b79f-99fwt 3/3 Running 181 27d
my-cluster-with-metrics-kafka-0 1/1 Running 57 19d
my-cluster-with-metrics-kafka-1 1/1 Running 5 19h
my-cluster-with-metrics-kafka-2 1/1 Running 0 27m
my-cluster-with-metrics-kafka-exporter-568968bd5c-mrg7f 1/1 Running 108 27d
相应的服务也有
my-cluster-with-metrics-kafka-bootstrap ClusterIP 10.98.78.168 <none> 9091/TCP,9100/TCP 27d
my-cluster-with-metrics-kafka-brokers ClusterIP None <none> 9090/TCP,9091/TCP,9100/TCP 27d
my-cluster-with-metrics-kafka-external-0 NodePort 10.110.196.75 <none> 9099:30461/TCP 27d
my-cluster-with-metrics-kafka-external-1 NodePort 10.107.225.187 <none> 9099:32310/TCP 27d
my-cluster-with-metrics-kafka-external-2 NodePort 10.103.99.151 <none> 9099:31950/TCP 27d
my-cluster-with-metrics-kafka-external-bootstrap NodePort 10.98.131.151 <none> 9099:31248/TCP 27d
我已经转发了 svc 端口,以便可以找到代理:
kubectl port-forward svc/my-cluster-with-metrics-kafka-external-bootstrap 9099:9099 -n kafka
当我运行它执行的 docker 命令时发布这个,正如预期的那样。
但在 K8s 中,即使在 args 中添加了 bash 并尝试之后,它仍然没有提供可用的代理。
谁能建议我应该在部署文件中尝试哪些更改,以使其与上述成功运行的 docker 命令完全一样?
【问题讨论】:
-
不清楚您提供的引导地址,但您应该使用 k8s 服务发现与内部广告服务进行通信,理想情况下作为环境变量提供给您的客户端部署,而不是使用
--network="host"或需要使用端口转发 -
@OneCricketeer 实际上,我在应用程序中提供的引导地址是 [localhost:9099],因为应用程序是从安装在 EC2 ubuntu 机器上的 minikube 集群内部运行的。这就是我使用端口转发和 --network="host" 来运行和公开该特定端口的原因。我有两个代理服务名称,其中外部引导程序是当前端口转发的一个 - my-cluster-with-metrics-kafka-external-bootstrap。如何在我的部署文件中使用此服务,以便可以访问 K8s 中的本地主机。
-
1) 如果你的应用部署在 k8s 中,那么你不需要 kafka 端口转发,因为集群外没有任何东西可以暴露 2)
localhost指的是 pod 的容器本身,所以显然需要完全更换。我建议查看一些 Kubernetes 特定资源,了解 Pod 之间的服务发现和网络通信如何工作,因为这个问题与 Kafka 无关 -
谢谢,@OneCricketeer 我实际上尝试了这个逻辑,将本地主机完全替换为外部引导服务 IP,现在能够成功运行生产者和消费者。问题已解决。
-
欢迎在下方回答您自己的问题
标签: docker kubernetes apache-kafka