繁体   English   中英

当 python 代码在 kube.netes pod 中运行时,如何获取客户端 IP 地址?

[英]How to get client IP address when the python code is running inside a kubernetes pod?

import uvicorn

app = FastAPI()


@app.get("/items/{item_id}")

def read_root(item_id: str, request: Request):

    client_host = request.client.host
    f= open("ipadress.txt","a+")
    f.write(client_host+"\n")
    f.close()

    return {"client_host": client_host, "item_id": item_id}


if __name__ == "__main__":
    uvicorn.run(app, host="0.0.0.0", forwarded_allow_ips="*")

以上是使用 uvicorn 托管的 python 代码。 当我在 docker 容器内运行代码时,它返回正确的客户端 IP。但是,当我使用 minikube 在 Kube.netes 集群上托管相同的代码时,返回的 IP 地址是本地主机 IP (127.0.0.1)

用于运行上述代码图像的 docker 命令是docker run -it -p 8080:8000 <image-name>我已经公开端口 8080 以从虚拟机访问服务

用于暴露服务的kube.netes命令是kubectl port-forward --address 0.0.0.0 services/sample-deploy 8080:80

kube.netes 的 service.yaml 是

apiVersion: v1
kind: Service
metadata:
  name: sample-deploy
spec:
  type: LoadBalancer
  ports:
  - port: 80
  selector:
    app: sample-deploy

我还尝试使用 LoadBalancer 访问该服务,其中可以使用外部 IP 访问该服务,但我无法获得真实的客户端 IP 地址。 我认为 IP 地址在 kube.netes 集群中被屏蔽了。

当您执行port-forward时,您会创建一条从本地机器到容器的隧道。 因此,连接在容器中被视为来自本地机器(因此是127.0.0.1 )。 端口转发通常仅用于调试目的。

访问应用程序的典型方式是通过LoadBalancer类型的服务或通过Kube.netes 入口概念。 在这两种情况下,您都应该获得正确的客户端 IP 地址。 对于入口,客户端 IP 通常通过 HTTP header(由入口负载均衡器/反向代理)提供。 大多数入口控制器使用X-Forwarded-For 这个 header 通常在检查客户端 IP 时由 web 应用框架获取。

在服务YAML文件中,externalTrafficPolicy应该设置为Local,这样IP地址就保留下来了。 externalTrafficPolicy 只能与 NodePort 或 LoadBalancer 类型一起使用。

apiVersion: v1
kind: Service
metadata:
  name: sample-deploy
spec:
  type: LoadBalancer
  externalTrafficPolicy: Local
  ports:
  - port: 80
  selector:
    app: sample-deploy

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM