【问题标题】:Issue in converting a Docker image to a Kubernetes Deployment File将 Docker 映像转换为 Kubernetes 部署文件时出现问题
【发布时间】: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


【解决方案1】:

如果一个应用程序部署在 K8s 中,那么我们不需要端口转发,因为在集群之外没有任何东西可以暴露。当我们在 K8s 中运行东西时,我们通常不会使用 localhost 访问东西。 localhost 指的是 pod 的容器本身。 因此,为了解决上述问题,从引导服务器中完全删除了 localhost 引用。然后将其替换为外部引导服务 IP [10.X.X.X:9099],然后执行 K8s 部署文件。随后生产者和消费者 pod 成功启动,这解决了问题。

【讨论】:

  • 可能也有助于显示完整的 Kafka 和部署规范
猜你喜欢
  • 2018-08-24
  • 2022-12-11
  • 2020-08-01
  • 2021-06-22
  • 1970-01-01
  • 2019-02-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多