如何获取客户端外部 ip,我正在使用 Gcloud/kubernetes
How to get the clients external ip, im using Gcloud/kubernetes
我最近开始在 gcloud 上使用 kubernetes,到目前为止还很顺利,但我似乎无法在我的应用程序上使用 clients/user 外部 IP 地址 wildfly(jsf) 任何想法将不胜感激!
我使用以下命令公开我的 pod:
kubectl expose rc modcluster-replication-controller --name=modcluster --type="LoadBalancer"
- 1 个 pod 运行 wildfly 独立 mode
- 1 个 pod 运行 mod-集群
- 1 个 pod 运行 postgres
- 1 rc 运行 mod-集群复制控制器
- 1 公开 rc mod-集群复制控制器端口 80
- 1 个 gcloud 负载均衡器
我正在使用基于 Ticket-monster Kubernetes[=13= 的 kubernetes、gcloud、modcluster、wildfly ]
我的建议(如果您的应用程序 HTTP/HTTPs 在端口 80/443 上)是
利用 Ingress 控制器,它基本上暴露了
服务作为 HTTP/HTTPs 负载均衡器,在数据包中注入 X-Forwarded-For。
这将显示 source/client 的 IP 地址。请关注tutorial
X-Forwarded-For 字段的详细信息可用 here
我刚刚使用该教程测试的示例调用:
负载均衡 IP:130.211.10.191
容器内的 Tcpdump:
$ tcpdump -n -l -w - | strings
Output:
Host: 130.211.10.191
Cache-Control: max-age=0
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; CrOS x86_64 7978.74.0) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/50.0.2661.103 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
If-None-Match: "574da256-264"
If-Modified-Since: Tue, 31 May 2016 14:40:22 GMT
X-Cloud-Trace-Context:
6b36a7d93d60dc6921417796255466d5/14093000126457324029
Via: 1.1 google
X-Forwarded-For: 81.47.XXX.XXX, 130.211.10.191 # the IP starting with
81. is my local IP
X-Forwarded-Proto: http
Connection: Keep-Alive
JxHTTP/1.1 304 Not Modified
k8s 1.7 版(刚刚在 1.7.2 中测试过)使这变得轻而易举。只需在您的 LoadBalancer 服务中使用 spec:externalTrafficPolicy:Local。它将毫无问题地服务于端口 80 和 443。例如:
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
name: http
- port: 443
protocol: TCP
targetPort: 443
name: https
selector:
app: myapp
role: myrole
type: LoadBalancer
loadBalancerIP: 104.196.208.195
externalTrafficPolicy: Local
kubectl describe svc servicename | grep 'LoadBalancer Ingress'
我最近开始在 gcloud 上使用 kubernetes,到目前为止还很顺利,但我似乎无法在我的应用程序上使用 clients/user 外部 IP 地址 wildfly(jsf) 任何想法将不胜感激! 我使用以下命令公开我的 pod:
kubectl expose rc modcluster-replication-controller --name=modcluster --type="LoadBalancer"
- 1 个 pod 运行 wildfly 独立 mode
- 1 个 pod 运行 mod-集群
- 1 个 pod 运行 postgres
- 1 rc 运行 mod-集群复制控制器
- 1 公开 rc mod-集群复制控制器端口 80
- 1 个 gcloud 负载均衡器
我正在使用基于 Ticket-monster Kubernetes[=13= 的 kubernetes、gcloud、modcluster、wildfly ]
我的建议(如果您的应用程序 HTTP/HTTPs 在端口 80/443 上)是 利用 Ingress 控制器,它基本上暴露了 服务作为 HTTP/HTTPs 负载均衡器,在数据包中注入 X-Forwarded-For。
这将显示 source/client 的 IP 地址。请关注tutorial X-Forwarded-For 字段的详细信息可用 here
我刚刚使用该教程测试的示例调用: 负载均衡 IP:130.211.10.191
容器内的 Tcpdump:
$ tcpdump -n -l -w - | strings
Output:
Host: 130.211.10.191
Cache-Control: max-age=0
Accept:
text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; CrOS x86_64 7978.74.0) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/50.0.2661.103 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8
If-None-Match: "574da256-264"
If-Modified-Since: Tue, 31 May 2016 14:40:22 GMT
X-Cloud-Trace-Context:
6b36a7d93d60dc6921417796255466d5/14093000126457324029
Via: 1.1 google
X-Forwarded-For: 81.47.XXX.XXX, 130.211.10.191 # the IP starting with
81. is my local IP
X-Forwarded-Proto: http
Connection: Keep-Alive
JxHTTP/1.1 304 Not Modified
k8s 1.7 版(刚刚在 1.7.2 中测试过)使这变得轻而易举。只需在您的 LoadBalancer 服务中使用 spec:externalTrafficPolicy:Local。它将毫无问题地服务于端口 80 和 443。例如:
apiVersion: v1
kind: Service
metadata:
name: myservice
spec:
ports:
- port: 80
protocol: TCP
targetPort: 80
name: http
- port: 443
protocol: TCP
targetPort: 443
name: https
selector:
app: myapp
role: myrole
type: LoadBalancer
loadBalancerIP: 104.196.208.195
externalTrafficPolicy: Local
kubectl describe svc servicename | grep 'LoadBalancer Ingress'