【问题标题】:Allowing Intra-Cluster Communication with nginx in kubernetes允许在 kubernetes 中与 nginx 进行集群内通信
【发布时间】:2019-02-03 12:37:18
【问题描述】:

我目前的 k8s 设置存在问题。在生产中,我为每个服务创建了三个副本,并将它们放在一个 pod 中。当 pod 相互对话时,我们希望 pod 以循环方式与 pod 中的每个容器对话。不幸的是,由于 TLS 保持活动状态,Pod 之间的连接永远不会终止 - 我们不想专门更改该部分 - 但我们确实希望 Pod 中的每个容器都能正常通信。这就是我们现在所拥有的:

如果 API 试图与 pod OSS 通信,它将仅与第一个容器通信。我希望 API 能够以循环方式与所有三个对话。

我该怎么做?我知道我需要一个入口控制器,比如 nginx。但是是否有一些真正的教程可以分解我如何实现这一目标?我不确定并且对 k8s 有点陌生。任何帮助都将被接受!

顺便说一句,我正在本地开发 minikube。

编辑:

在生产中,我们为每个服务创建三个副本。当服务A 需要与服务B 对话时,从服务B 中选择一个pod B1 并管理它接收到的任何请求。但是,该 pod B1 成为服务 B 中唯一处理任何通信的 pod;换句话说,豆荚 B2B3 永远不会说话。我正在尝试使用 nginx 解决这个问题,因为我们似乎需要一个负载均衡器来帮助解决这个问题,但我不知道该怎么做。谁能提供一些关于需要做什么的详细解释?具体来说,我如何使用我的服务设置 nginx,以便在服务中使用所有 pod(以某种循环方式),这与现在只使用一个 pod 的情况不同?这是一个问题,因为在生产中,当我们有两个其他 pod 坐在那里什么都不做时,一个 pod 会因请求超载而死亡。我正在 minikube 上进行本地开发。

【问题讨论】:

  • 为什么要将所有容器放在一个 pod 中?为了实现您的目标,创建一个具有多个副本的部署(每个容器都有自己的 pod)并创建一个指向这些 pod 的服务。您将使用服务名称来访问所有 pod,kubernetes 将决定到底是哪一个。
  • 同意上面的评论。你错误地构建了这个。为每个服务创建一个 Service,让 3 个 Pod 支持该服务,然后让 Kubernetes 调度它们。任何连接到服务的东西都将在 pod 之间循环。然后,为 API 创建入口控制器并将其指向服务后,您将获得所需的行为。
  • @MarcinRomaszewicz 好吧,我实际上错了 - “为每个服务创建一个服务,让 3 个 pod 支持该服务,然后让 Kubernetes 安排它们”。我已经做到了。它们不是 pod 中的容器——它们都是自己的 pod。你能描述一下我将如何创建一个入口控制器吗?我还没有找到一个很好的教程来解释如何正确使用我的服务

标签: nginx kubernetes minikube


【解决方案1】:

我假设您的 pod 下有一个微服务架构,对吧?您是否考虑过在 Kubernetes 中使用 Istio?它由 Google、IBM 和 Lyft 开源和开发——目的是为开发人员提供一种供应商中立的方式(这似乎是您正在寻找的方式)来连接、保护、管理和监控云平台上不同微服务的网络(AWS、Azure、谷歌等)。

从高层次上讲,Istio 有助于降低这些复杂性 部署,并减轻开发团队的压力。它是一个 完全开源的服务网格,透明地分层 现有的分布式应用程序。它也是一个平台,包括 允许它集成到任何日志记录平台、遥测或 政策体系。 Istio 的多样化功能集可让您成功,并且 高效地运行分布式微服务架构,并提供 一种保护、连接和监控微服务的统一方式。

这是link to Istio's documentation,详细解释了如何设置多集群环境,正是您要找的。​​p>

我想强调一下文档中的一条注释——它可能与您的问题有关:

由于 Kubernetes pod 没有稳定的 IP,重启任何 Istio 控制平面集群中的服务 pod 将导致其端点为 改变了。因此,从远程集群到该集群的任何连接 端点将被破坏。这在 Istio issue #4822 中有记录。

那里 有多种方法可以避免或解决这种情况。这 部分提供了这些选项的高级概述。

  • 更新 DNS 条目
  • 使用负载平衡器服务类型
  • 通过网关公开 Istio 服务

我引用的是负载均衡器解决方案,因为它似乎是您想要的:

在 Kubernetes 中,您可以将具有服务类型的服务声明为 LoadBalancer。 pod 重启问题的一个简单解决方案是使用 Istio 服务的负载均衡器。然后您可以使用负载 平衡器 IP 作为 Istio 服务的端点 IP 来配置 远程集群。

希望对你有帮助,有什么问题就拍吧!

【讨论】:

  • 我喜欢 istio 的想法。你熟悉吗?我尝试设置它,但无法根据需要设置服务条目和网关。我仍然需要访问集群外部的流量,而 istio 基本上不允许我访问,无论我关闭什么身份验证。
  • 当然。我看到很多公司将 Istio 与 API 网关结合起来进行外部访问(查看这些参考资料 12)。既然您在问题中提到了 nginx,我建议使用 Kong,这是基于 nginx 的 API 网关实现。
  • Continuing... 如this picture 中所述,您应该从 API Gateway 调用您的 LoadBalancer。此外,还有一个流行的 Stack Overflow 线程谈论 k8s Ingress 和 Load Balancer,与 nginx 集成:stackoverflow.com/questions/45079988/…
【解决方案2】:

here 提到了一个非常简单的示例,说明如何使用 Kubernetes 服务平衡您的后端 Pod。

您的副本应该由链接中提到的 kubernetes 自行管理,即通过创建您的 pod 有点像下面示例中提到的那样,然后按照步骤创建指向这些 pod 的服务

kubectl run hello-world --replicas=2 --labels="run=load-balancer-example" --image=gcr.io/google-samples/node-hello:1.0  --port=8080

通过这样做,kubernetes 将确保负载在所有正在运行的 Pod 中均匀分布。

在您的情况下,您可能希望查看创建 pod 和服务的方式。确保您的服务设置正确的一种方法是运行以下命令,结果应该为您提供多个 ENDPOINTS,即指向您的各个副本 pod 的 : 对,类似于下面显示的示例。

kubectl get endpoints --all-namespaces

NAMESPACE     NAME                      ENDPOINTS                                                  AGE
kube-system   kube-dns                  10.244.0.96:53,10.244.0.97:53,10.244.0.96:53 + 1 more...   1d

好吧,如果您真的对设置 nginx 入口感兴趣,this 将是一个好的开始。但是,kubernetes 服务中的一个简单 LoadBalancer 应该可以满足您当前的需求

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 2019-12-07
    • 2018-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多