5

我现在有一个看起来像这样的服务:如何使用外部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而无需设置负载平衡器或入口?

+0

您是否正在运行GCE,GKE或其他? –

+0

我在GKE上运行。 – rfw

回答

1

这实现起来并不简单 - 因为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吗?

+0

我遇到了同样的问题。通过使用ClusterIP,我可以避免调配负载平衡器的额外费用。 (在我的情况下,它比我的单节点更昂贵) – willwill

1

如果你只有有一个确切的吊舱,可以使用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注入。

相关问题