如何使用外部IP保护到达ClusterIP服务的流量的源IP?
我现在有一个看起来像这样的服务:如何使用外部IP保护到达ClusterIP服务的流量的源IP?
apiVersion: v1
kind: Service
metadata:
name: httpd
spec:
ports:
- port: 80
targetPort: 80
name: http
protocol: TCP
- port: 443
targetPort: 443
name: https
protocol: TCP
selector:
app: httpd
externalIPs:
- 10.128.0.2 # VM's internal IP
我可以接收从绑定到虚拟机的外部IP流量正常,但所有的请求是通过源IP 10.104.0.1
的HTTP接收到绝对是一个内部IP - 即使当我从集群外部连接到VM的外部IP时也是如此。
如何获取请求的真实源IP而无需设置负载平衡器或入口?
这实现起来并不简单 - 因为kube-proxy的工作方式,您的流量可以在节点到达支持服务的pod之前在节点之间转发。
有一些测试版注释可以用来解决这个问题,特别是service.beta.kubernetes.io/external-traffic: OnlyLocal
。
在文档更多信息,在这里:https://kubernetes.io/docs/tutorials/services/source-ip/#source-ip-for-services-with-typeloadbalancer
但是,这并不符合你不需要负载均衡器的附加要求。你可以扩展你为什么不想涉及LoadBalancer吗?
我遇到了同样的问题。通过使用ClusterIP,我可以避免调配负载平衡器的额外费用。 (在我的情况下,它比我的单节点更昂贵) – willwill
如果你只有有一个确切的吊舱,可以使用hostNetwork: true
来实现这一目标:
apiVersion: apps/v1beta1
kind: Deployment
metadata:
name: caddy
spec:
replicas: 1
template:
metadata:
labels:
app: caddy
spec:
hostNetwork: true # <---------
containers:
- name: caddy
image: your_image
env:
- name: STATIC_BACKEND # example env in my custom image
value: $(STATIC_SERVICE_HOST):80
注意做这个您的吊舱将继承主机的DNS解析器,而不是Kubernetes'。这意味着您不能再通过DNS名称解析群集服务。例如,在上面的示例中,您无法访问服务http://static。您仍然可以通过群集IP访问服务,这些IP由environment variables注入。
您是否正在运行GCE,GKE或其他? –
我在GKE上运行。 – rfw