Kubernetes Pods与内部/外部IP地址进行相互通信

时间:2018-04-14 09:27:14

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

假设我的本地计算机上有一个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的输出是:

kubectl get services

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

  1. 我如何从外部做到这一点?即来自任何机器。
  2. 我怎么能在内部这样做?即从另一个容器舱。
  3. 如何让我的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" ]
    

    提前致谢!

1 个答案:

答案 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和端口。