K8s中如何根据与pod的交互获取用户的ip

How to get the ip of the user based on interaction with pod in K8s

我想根据他与 Pods 的交互获取用户(客户端)的 IP,(我正在考虑获取用户 IP 并根据他的 IP 定位他)

为了更好地解释我的问题,我制作了下图, 我能找到的唯一可能改善这种情况的方法是修补服务并将 externalTrafficPolicy 设置为“本地”,这样服务将保留用户的 IP。

但仍然不确定我应该如何或什至在哪一部分检查用户的IP。是否可以从 Pod 外部监控用户的 activity?有什么想法吗?

(我正在使用 golang)

update: 为了说得更清楚,我不是在创建 pods,在下面的场景中,客户负责并可以创建不同的 pods 和容器,甚至他们需要的服务,这就像他们的试验台,所以我无法编辑他们的容器文件,但我可以在他们的容器旁边调出另一个容器,然后也许可以使用这里的答案 post 查找客户端的ip。你觉得这行得通吗?

当然可以,但请记住,您只会在具有特定服务 pods 的节点上接收流量(在您的情况下 Service NodePort).

如果您使用的是 Golang

现在,这应该适用于 L4 或 L7 流量。如果您使用的是 Golang,如何获取它的示例是查看 X-Forwarded-For HTTP header:

package main

import (
    "encoding/json"
    "net/http"
)

func main() {
    http.HandleFunc("/", ExampleHandler)
    if err := http.ListenAndServe(":8080", nil); err != nil {
        panic(err)
    }
}

func ExampleHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Add("Content-Type", "application/json")
    resp, _ := json.Marshal(map[string]string{
        "ip": GetIP(r),
    })
    w.Write(resp)
}

// GetIP gets a requests IP address by reading off the forwarded-for
// header (for proxies) and falls back to use the remote address.
func GetIP(r *http.Request) string {
    forwarded := r.Header.Get("X-FORWARDED-FOR")
    if forwarded != "" {
        return forwarded
    }
    return r.RemoteAddr
}

此外,here's an example of how to get for L4 services (TCP)

✌️