k8s nginx應用 獲取客戶端訪問真實IP

2022-05-10 12:09:53 字數 3287 閱讀 1766

通常,當 kubernetes 集群內的客戶端連線到服務的時候,是支援服務的 pod 可以獲取到客戶端的 ip 位址的,但是,當通過節點埠接收到連線時,由於對資料報執行了源網路位址轉換(snat),因此資料報的源 ip 位址會發生變化,後端的 pod 無法看到實際的客戶端 ip,對於某些應用來說是個問題,比如,nginx 的請求日誌就無法獲取準確的客戶端訪問 ip 了,比如下面我們的應用:

kind: deployment

metadata:

name: nginx

spec:

replicas: 3

selector:

matchlabels:

template:

metadata:

labels:

spec:

containers:

- name: nginx

image: nginx:1.7.9

ports:

- containerport: 80

---apiversion: v1

kind: service

metadata:

name: nginx

spec:

selector:

type: nodeport

ports:

- protocol: tcp

port: 80

targetport: 80

直接建立後可以檢視 nginx 服務被自動分配了乙個 32761 的 nodeport 埠:

$ kubectl get svc

name type cluster-ip external-ip port(s) age

kubernetes clusterip 10.96.0.1 443/tcp 28d

nginx nodeport 10.106.190.194 80:32761/tcp 48m

$ kubectl get pods -o wide

name ready status restarts age ip node nominated node readiness gates

nginx-54f57cf6bf-nwtjp 1/1 running 0 3m 10.244.3.15 ydzs-node3 nginx-54f57cf6bf-ptvgs 1/1 running 0 2m59s 10.244.2.13 ydzs-node2 nginx-54f57cf6bf-xhs8g 1/1 running 0 2m59s 10.244.1.16 ydzs-node1

$ kubectl logs -f nginx-54f57cf6bf-xhs8g

這個是因為我們 master 節點上並沒有對應的 pod,所以通過 master 節點去訪問應用的時候必然需要額外的網路跳轉才能到達其他節點上 pod,在跳轉過程中由於對資料報進行了 snat,所以看到的是 master 節點的 ip。這個時候我們可以在 service 設定externaltrafficpolicy來減少網路跳數:

spec:

externaltrafficpolicy: local

如果 service 中配置了externaltrafficpolicy=local,並且通過服務的節點埠來開啟外部連線,則 service 會**到本地執行的 pod,如果本地沒有本地 pod 存在,則連線將掛起,比如我們這裡設定上該字段更新,這個時候我們去通過 master 節點的 nodeport 訪問應用是訪問不到的,因為 master 節點上並沒有對應的 pod 執行,所以需要確保負載均衡器將連線**給至少具有乙個 pod 的節點。

但是需要注意的是使用這個引數有乙個缺點,通常情況下,請求都是均勻分布在所有 pod 上的,但是使用了這個配置的話,情況就有可能不一樣了。比如我們有兩個節點上執行了 3 個 pod,假如節點 a 執行乙個 pod,節點 b 執行兩個 pod,如果負載均衡器在兩個節點間均衡分布連線,則節點 a 上的 pod 將接收到所有請求的 50%,但節點 b 上的兩個 pod 每個就只接收 25% 。

由於增加了externaltrafficpolicy: local這個配置後,接收請求的節點和目標 pod 都在乙個節點上,所以沒有額外的網路跳轉(不執行 snat),所以就可以拿到正確的客戶端 ip,如下所示我們把 pod 都固定到 master 節點上:

獲取客戶端MAC

有時候我們需要獲取客戶端的一些資訊來做處理,獲取mac,如下 dllimport iphlpapi.dll private static extern int sendarp int32 dest,int32 host,ref int64 mac,ref int32 length dllimport...

獲取客戶端資訊

request.browser.majorversion.tostring 獲取客戶端瀏覽器的 主 版本號request.browser.version.tostring 獲取客戶端瀏覽器的完整版本號 request.browser.platform.tostring 獲取客戶端使用平台的名字 re...

獲取客戶端ip

1.統計訪問者ip位址 2.設定黑名單,黑名單的使用者不可以訪問聊天室。內容提要 這種情況下同樣透露了客戶端是使用了 伺服器 但編造了乙個虛假的隨機ip 220.4.251.159 代替客戶端的真實 ip來欺騙它 獲取客戶端 ip其實不是個簡單的活兒 因為存在 ip欺騙 和 問題 所以獲取客戶端的 ...