Network programming 如何保护源IP不受使用外部IP到达ClusterIP服务的流量的影响?
我目前有一个如下所示的服务:Network programming 如何保护源IP不受使用外部IP到达ClusterIP服务的流量的影响?,network-programming,kubernetes,google-compute-engine,google-kubernetes-engine,Network Programming,Kubernetes,Google Compute Engine,Google Kubernetes Engine,我目前有一个如下所示的服务: 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: ap
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
我可以从绑定到VM的外部IP接收流量,但所有请求都是通过HTTP接收的,源IP10.104.0.1
,这绝对是一个内部IP–即使我从集群外部连接到VM的外部IP
如何在不设置负载平衡器或入口的情况下获取请求的真实源IP?这并不容易实现——因为kube代理的工作方式,您的流量可以在到达支持您的服务的pod之前在节点之间进行转发 您可以使用一些beta注释来解决这个问题,特别是
service.beta.kubernetes.io/external-traffic:OnlyLocal
文档中的更多信息,请参见:
但这并不能满足您不需要负载平衡器的额外要求。您能详细说明为什么不想使用负载平衡器吗?如果您只有一个pod,您可以使用
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
apiVersion:apps/v1beta1
种类:部署
元数据:
姓名:球童
规格:
副本:1份
模板:
元数据:
标签:
应用程序:球童
规格:
hostNetwork:是的#你是在运行GCE、GKE还是其他什么?我在运行GKE。我遇到了同样的问题。通过使用ClusterIP,我可以避免配置负载平衡器的额外费用。(在我的例子中,它甚至比我拥有的单个节点更昂贵)