假设我的本地计算机上有一个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节点(app)。
首先,我使用以下方法构建了泊坞窗图像:
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应用程序)。
如何让我的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" ]
提前致谢!
答案 0 :(得分:2)
<强>外部强>
通过运行:
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)
使用Load Balancer类型的服务(而不是替代的'Ingress',它创建Nodeport类型的服务,以及HTTP(s)Load Balancer而不是TCP Load Balancer),您指定的是针对pod应该到达端口80上的LoadBalancer,然后服务将此流量定向到应用程序上的端口8000。因此,如果您想根据屏幕截图中的地址从外部源向您的应用程序发送流量,您可以将流量发送到35.197.94.202:80。
<强>内部强>
正如其他人在评论中指出的那样,群集IP可用于在内部定位pod。您指定为服务端口的端口(在您的情况下为80,尽管可以是您为服务选择的任何数字)可以与群集IP一起使用,以定位服务所针对的群集上的Pod。例如,您可以定位:
10.3.254.16:80
但是,要定位特定的pod,您可以使用pod IP地址和pod侦听的端口。您可以通过在pod上运行describe命令来发现这一点:
kubectl describe pod
或者通过运行:
kubectl get endpoints
生成其列出的pod IP和端口。