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注入。

相關問題