簡體   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