【发布时间】: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