kubernetes nginx 入口日志不显示外部 ip

sil*_*gon 1 nginx kubernetes google-kubernetes-engine kubernetes-ingress

我让入口 nginx 工作在gcloud. 但是,当我使用命令看到日志时kubectl log

$ kubectl logs nginx-ingress-controller-59f55c679c-zcr24
myhost.com/clients"
10.28.0.1 - [10.28.0.1] - - [14/May/2018:09:00:59 +0000] "GET /api/users/2/10 HTTP/1.1" 304 0 "http://myhost.com/clients" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0" 796 0.083 [default-back-main-80] 10.28.0.93:1337 0 0.083 304
2018/05/14 09:01:00 [notice] 10982#10982: *6937489 "/api/(.*)" matches "/api/users/1/10", client: 10.28.0.1, server: myhost.com, request: "GET /api/users/1/10 HTTP/1.1", host: "myhost.com", referrer: "http://myhost.com/clients"
2018/05/14 09:01:00 [notice] 10982#10982: *6937489 rewritten data: "/users/1/10", args: "", client: 10.28.0.1, server: myhost.com, request: "GET /api/users/1/10 HTTP/1.1", host: "myhost.com", referrer: "http://myhost.com/clients"
10.28.0.1 - [10.28.0.1] - - [14/May/2018:09:01:00 +0000] "GET /api/users/1/10 HTTP/1.1" 304 0 "http://myhost.com/clients" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0" 796 0.014 [default-back-main-80] 10.28.0.93:1337 0 0.014 304
Run Code Online (Sandbox Code Playgroud)

这只是日志的一部分,但是,所有 ip 都来自10.28.0.1. 我想查看外部 ip,或我的用户的 ip。

此外,ip的root10.28.*.*对我来说似乎有点奇怪。如果我显示容器的 IP,您会发现它似乎有所不同。

$ kubectl get service | awk '{print $3}'
CLUSTER-IP
10.31.243.114
10.31.245.58
10.31.241.148
10.31.240.1
Run Code Online (Sandbox Code Playgroud)

我知道其他容器中的请求来自私有 ip,但是在入口容器中我应该收到用户的外部 ip。我怎样才能看到这些ip?

Dig*_*gil 5

看起来在使用 GKE 服务时必须保留源 IP (在您的情况下为外部 IP)。此处,默认设置为使用集群 IP,这意味着流量将通过 SNAT 并在节点之间传输。在此期间,\xe2\x80\x98Source IP\'(外部 IP)被替换为节点\xe2\x80\x99s IP(详细说明见本节帮助中心文章中提供了详细说明)。

\n\n

根据文章,通过将 \xe2\x80\x98 service.spec.externalTrafficPolicy \xe2\x80\x99 设置为值 \xe2\x80\x98 Local \xe2\x80\x99 ,这将绕过 SNAT,您也许可以将流量直接路由到正确的节点/pod,从而保留源 IP。

\n\n

设置此exernalTrafficPolicy的命令为服务

\n\n
$kubectl patch svc [service_name] -p \'{"spec":{"externalTrafficPolicy":"Local"}\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

在您的情况下,service_name=nginx-ingress-controller-59f55c679c-zcr24

\n