Kubernetes Pods 与 internal/external IP 地址相互通信

Kubernetes Pods intercommunication with internal/external IP addresses

假设我的本地机器上有一个 Python 代码,它侦听本地主机和端口 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 云而不是 docker 集线器):

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 应用程序的 Docker 文件:

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

提前致谢!

外部

来自 运行:

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)

使用负载均衡器类型的服务(而不是替代 'Ingress',它创建一个 Nodeport 类型的服务,和一个 HTTP(s) 负载均衡器而不是 TCP 负载均衡器)你指定以 pods 为目标的流量应该到达端口 80 上的 LoadBalancer,然后该服务将此流量定向到您应用程序上的端口 8000。因此,如果您想将流量从外部来源定向到您的应用程序,根据屏幕截图中的地址,您可以将流量发送到 35.197.94.202:80。

内部

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

10.3.254.16:80

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

kubectl describe pod

或按运行:

kubectl get endpoints 

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