【发布时间】: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 应用程序)发送一个请求。
- 我怎样才能在外部做到这一点?即来自任何机器。
- 我怎样才能在内部做到这一点?即来自另一个容器吊舱。
如何让我的 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