【问题标题】:Kubernetes Pods intercommunication with internal/external IP addressesKubernetes Pods 与内部/外部 IP 地址互通
【发布时间】:2018-09-24 13:52:23
【问题描述】:

假设我在本地机器上有一个 Python 代码,它在 localhost 和端口 8000 上进行侦听,如下所示:

import waitress
app = hug.API(__name__)
app.http.add_middleware(CORSMiddleware(app))
waitress.serve(__hug_wsgi__, host='127.0.0.1', port=8000)

此代码接受127.0.0.1:8000 上的请求并返回一些响应。

现在我想将这个应用程序(以及另外两个相关的应用程序)移动到 Docker 中,并使用 Kubernetes 来编排它们之间的通信。

但为了简单起见,我将只使用这个 Python 节点(应用程序)。

首先我使用以下方法构建了 docker 映像:

docker build -t gcr.io/${PROJECT_ID}/python-app:v1 .

然后我将它推送到 gcloud docker(我使用的是 google cloud 而不是 docker hub):

gcloud docker -- push gcr.io/${PROJECT_ID}/python-app:v1

现在我创建了容器集群:

gcloud container clusters create my-cluster

将应用部署到 kubernates 中:

kubectl run python-app --image=gcr.io/${PROJECT_ID}/python-app:v1 --port 8000

最后通过以下方式将其暴露在互联网上:

kubectl expose deployment python-app --type=LoadBalancer --port 80 --target-port 8000

现在kubectl get services命令的输出是:

好的,我的问题是,我想从另一个应用程序(比如说一个节点 js 应用程序)发送一个请求。

  1. 我怎样才能在外部做到这一点?即来自任何机器。
  2. 我怎样才能在内部做到这一点?即来自另一个容器吊舱。

如何让我的 Python 应用使用这些 IP 地址并监听它们?

这是 Python 应用的 Dockerfile:

FROM python:3
WORKDIR /usr/src/app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD [ "python", "./app.py" ]

提前致谢!

【问题讨论】:

  • 您好,如果您想从集群中的另一个 pod 发送流量。您可以使用 cluster-ip(如您在图片 10.3.254.16 中看到的那样)。在 k8s 集群中有一个内部 DNS 服务器,它使用集群 IP 进行服务发现。另一方面,当您通过负载均衡器公开您的应用程序时,这就是这样做的方法。
  • 嗨@SureshVishnoi,感谢您的回复。是的,我可以复制集群 IP,然后在其他应用程序中使用它。但我的问题是如何让 Python 应用程序使用这个 IP 而不是 localhost 。因为正如您在代码中看到的那样,它使用的是 localhost:8000
  • 如果您运行以下命令 kubectl get endpoints 那么您将看到您的 pod 具有唯一的 IP。你可以写 '*' 而不是 localhost
  • 运行此命令会导致 python-app 在 10.0.0.8:8000 上运行,而我没有得到使用 * 的意义?
  • 10.0.0.8:8000 所以这是您的应用正在侦听的 IP 和端口号。我知道您的应用程序只在 localhost 上侦听,这就是为什么我只想说您可以做到*

标签: docker kubernetes google-cloud-platform gcloud kubectl


【解决方案1】:

外部

通过运行:

kubectl run python-app --image=gcr.io/${PROJECT_ID}/python-app:v1 --port 8000

您指定您的 pod 在端口 8000 上侦听。

通过运行:

kubectl expose deployment python-app --type=LoadBalancer --port 80 --target-port 8000

您指定您的服务在端口 80 上进行侦听,并且该服务将流量发送到 TargetPort 8000(pod 侦听的端口)。

因此可以总结为,您的配置流量遵循以下路径:

traffic (port 80) > Load Balancer > Service (Port 80) > TargetPort/Pod (port 8000)

使用负载均衡器类型的服务(而不是创建 Nodeport 类型服务的替代“入口”和 HTTP(s) 负载均衡器而不是 TCP 负载均衡器),您正在指定以pod 应该在端口 80 上到达 LoadBalancer,然后服务将此流量定向到您应用上的端口 8000。因此,如果您想根据屏幕截图中的地址将流量从外部来源引导到您的应用,您可以将流量发送到 35.197.94.202:80。

内部

正如其他人在 cmets 中指出的那样,集群 IP 可用于内部定位 pod。您指定为服务端口的端口(在您的情况下为 80,尽管这可以是您为服务选择的任何数字)可以与集群 IP 一起使用,以针对该服务所针对的集群上的 pod。例如,您可以定位:

10.3.254.16:80

但是,要针对特定​​的 pod,您可以使用 pod IP 地址和 pod 侦听的端口。您可以通过在 pod 上运行 describe 命令来发现这一点:

kubectl describe pod

或者通过运行:

kubectl get endpoints 

它会生成它列出的 pod IP 和端口。

【讨论】:

  • 感谢您的宝贵意见,对于内部部分,直到我运行 kubectl get endpoints 并使用其结果的 IP,它才起作用。但是,如果我想公开两个端口,让我们说第三个应用程序中的 5601 和 9200。我怎样才能?因为 kubectl run 只允许一个端口通过 --port
  • 为确保我们遵守 Stackoverflow 准则,我建议在单独的问题中提出该问题,以保持一切整洁并一次处理一个问题。
  • 谢谢,我在这里问过:stackoverflow.com/questions/49833440/…
猜你喜欢
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 2011-07-29
  • 2023-04-02
  • 2018-08-11
  • 2019-09-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多