当 kubernetes pod 中的 python 代码为 运行 时,如何获取客户端 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 容器中时,它 returns 正确的客户端 IP。但是,当我使用 minikube 在 Kubernetes 集群上托管相同的代码时,返回的 IP 地址是本地主机 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 ingress 概念。在这两种情况下,您都应该获得正确的客户端 IP 地址。对于入口,客户端 IP 通常通过 HTTP header(由入口负载 balancer/reverse 代理)提供。大多数入口控制器使用 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
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 容器中时,它 returns 正确的客户端 IP。但是,当我使用 minikube 在 Kubernetes 集群上托管相同的代码时,返回的 IP 地址是本地主机 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 ingress 概念。在这两种情况下,您都应该获得正确的客户端 IP 地址。对于入口,客户端 IP 通常通过 HTTP header(由入口负载 balancer/reverse 代理)提供。大多数入口控制器使用 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