【问题标题】:How to get client IP address when the python code is running inside a kubernetes pod?python代码在kubernetes pod中运行时如何获取客户端IP地址?
【发布时间】:2023-03-16 08:13:01
【问题描述】:
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 在 Kubernetes 集群上托管相同的代码时,返回的 IP 地址是 localhost IP (127.0.0.1)

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

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

kubernetes 的 service.yaml 是

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

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

【问题讨论】:

  • 尝试命令,kubectl get svc,如果设置了,这将提供 clusterIP & LB IP。
  • 由于您使用的是端口转发,它将使用本地 IP,因为它正在从本地创建隧道。

标签: docker kubernetes minikube uvicorn


【解决方案1】:

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

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

【讨论】:

  • 谢谢,我使用的是入口而不是端口转发,现在我得到的 IP 地址是 172.17.0.3 我该怎么做才能获得真正的客户端 IP?
  • 我看到你正在运行 uvicorn。请务必以“--proxy-headers”开头。见uvicorn.org/deployment/#running-behind-nginx
【解决方案2】:

在服务 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

【讨论】:

    猜你喜欢
    • 2021-09-14
    • 2012-03-14
    • 2012-02-16
    • 1970-01-01
    • 2019-01-14
    • 2014-03-26
    • 2021-10-22
    相关资源
    最近更新 更多