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接收的,源IP
10.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,我可以避免配置负载平衡器的额外费用。(在我的例子中,它甚至比我拥有的单个节点更昂贵)