3

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

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

但仍然不确定我应该如何甚至在哪个部分检查用户的 IP。是否可以从 pod 外部监控用户的活动?任何想法?

(我正在使用golang)

使用 NodePort 作为服务的 k8s 集群

更新:为了更清楚,我不是在创建 Pod,在下面的场景中,客户端负责并且可以创建不同的 Pod 和容器,甚至是他们需要的服务,这就像他们的试验台,所以我不能编辑他们容器文件,但我可能能够在他们的容器旁边调出另一个容器,然后可以使用这篇文章https://stackoverflow.com/a/27971761/9350055上的答案来查找客户端的 ip。你认为这行得通吗?

微型容器 - 单个 pod 中的两个容器

4

1 回答 1

1

当然,这会起作用,但请记住,您只会在您拥有特定服务的 pod 的节点上接收流量(在您的情况下Service NodePort)。

如果你使用 Golang

图片1

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

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
}

此外,这里还有一个如何获取 L4 服务 (TCP) 的示例

✌️

于 2020-08-26T20:50:37.523 回答