docker - python代码在kubernetes pod中运行时如何获取客户端IP地址?
问题描述
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集群中被屏蔽了。
解决方案
当你这样做时,port-forward
你会创建一个从本地机器到容器的隧道。因此,在容器中可以看到连接,就好像它来自本地计算机(因此是127.0.0.1
)。端口转发通常仅用于调试目的。
访问应用程序的典型方式是通过服务类型LoadBalancer
或通过Kubernetes 入口概念。在这两种情况下,您都应该获得正确的客户端 IP 地址。对于入口,客户端 IP 通常通过 HTTP 标头(由入口负载平衡器/反向代理)提供。大多数入口控制器使用X-Forwarded-For
. 在检查客户端 IP 时,Web 应用程序框架通常会获取此标头。
推荐阅读
- python - 数据抓取输出到数据框
- python - 如何在其他类中添加多对多关系。就我而言,在 InfoCreateView 类中
- amazon-web-services - 跨区域只读副本与使用 AWS Global Accelerator 的一个只读副本
- python - efs的boto3中的自定义等待条件
- sql-server - 在表和 where 子句之间使用一些 JOIN 更新查询
- c++ - OpenCV放大Mat图像而不改变窗口边框c ++
- node.js - UnhandledPromiseRejectionWarning:MongooseServerSelectionError:连接 ECONNREFUSED 127.0.0.1:27017
- css-selectors - 目标图像的第 n 个子项(偶数)不起作用
- java - 在没有反向函数或循环的情况下反转字符串
- scala - SameSite=None 正在成为另一个 cookie