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 应用程序)发送请求。
- 我如何在外部执行此操作?即来自任何机器。
- 我怎样才能在内部做到这一点?即来自另一个容器吊舱。
如何让我的 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 和端口。
假设我的本地机器上有一个 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 应用程序)发送请求。
- 我如何在外部执行此操作?即来自任何机器。
- 我怎样才能在内部做到这一点?即来自另一个容器吊舱。
如何让我的 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 和端口。