2017-02-21 65 views
0

我在本地數據中心建立了一個Kubernete集羣。有4個節點和1個主站。 尋找內部服務的L4負載平衡解決方案。Kubernete:請問一個L4負載平衡解決方案的非雲集羣

[email protected]:/home/mesos# kubectl get nodes 
NAME  STATUS   AGE 
niubi01 Ready,master 7d 
niubi02 Ready   7d 
niubi03 Ready   7d 
niubi04 Ready   7d 
niubi05 Ready   7d 

假設我們有三個帶'hello world'web服務的Pod。具有公開外部IP的服務是使用'NodePort'創建的。外部IP爲「節點」和端口是30145.

[email protected]:/home/mesos# kubectl get service 
NAME    CLUSTER-IP  EXTERNAL-IP PORT(S)   AGE 
example-service 10.100.220.21 <nodes>  8080:30145/TCP 6d 

正如文件所提到的,我們可以訪問任何節點的IP來存取這個「世界你好」的服務。像:

curl http://niubi01:30145 
curl http://niubi02:30145 
curl http://niubi03:30145 
curl http://niubi04:30145 
curl http://niubi05:30145 

從外面。 問題是我們無法保證任何節點永遠活躍,甚至是主人。我們應該使用哪個URL? 如何做一個像Haproxy一樣的LoadBalance來爲這個服務提供高可用性? 我們應該有另一臺服務器提供這5個地址之間的負載平衡服務嗎?爲這種情況尋求更好的解決方案。

+0

您可以使用DNS輪循機制,創建一個包含多個端點的DNS記錄,並使用監視程序服務使DNS記錄更新爲帶有活動節點的列表?看起來您需要在它之前構建負載平衡器解決方案。 –

+0

嗨 - 您需要一個L4負載均衡器,但是混合了Nginx或HAproxy等產品。應該改變問題以避免未來的混淆? – pagid

回答

1

正如你已經注意到的,你將不得不設置一個自定義負載均衡器來完成這項工作。此負載均衡器必須在羣集外部並由您自己進行配置。

我建議您通讀Ingressingress-controller的概念。特別是nginx-ingress-controller在這裏非常有用。

好處是您只需要設置一次自定義的外部負載均衡器,而不是您想要公開的所有服務。您的負載均衡器應該將流量平衡到入口控制器,入口控制器將根據所提供的Ingress資源執行內部負載均衡。

要部署進入控制器,它應該足以做到以下幾點:

kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress/master/examples/deployment/nginx/default-backend.yaml 
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress/master/examples/deployment/nginx/nginx-ingress-controller.yaml 

第一行創建這是用於所有無與倫比一個入節點default-backend。它基本上只是返回404

第二行創建一個Deployment默認情況下有1個副本。在產品環境中,您可能希望通過擴展部署或使用nginx-ingress-controller.yaml文件的本地修改副本來更改副本計數。另外,我建議使用專門的節點(通過使用DaemonSet + NodeAffinity + Taints + Tolerations)來控制入口控制器,以防萬一您期望大量流量。

入口控制器現在運行而不被暴露。我認爲暴露控制器不是示例的一部分,因爲這取決於所使用的基礎設施而變化太大。在你的情況,你應該創建一個Kubernetes Service通過部署該資源暴露入口控制器爲NodePort

apiVersion: v1 
kind: Service 
metadata: 
    name: nginx-ingres-controller-svc 
    labels: 
    name: nginx-ingres-controller-svc 
    namespace: kube-system 
spec: 
    type: NodePort 
    ports: 
    - port: 80 
     nodePort: 30080 
     name: http 
    - port: 443 
     nodePort: 30443 
     name: https 
    selector: 
    k8s-app: nginx-ingress-controller 

請注意nodePort明確此處指定。這使配置外部負載均衡器時的生活更輕鬆。

完成所有這些設置後,您可以創建Ingress資源將外部流量引導到您的內部服務中。例如:

apiVersion: extensions/v1beta1 
kind: Ingress 
metadata: 
    name: example-ingress 
spec: 
    rules: 
    - host: example.company.org 
    http: 
     paths: 
     - path:/
     backend: 
      serviceName: example-service 
      servicePort: 8080 

如果你有你的數據中心的DNS設置,以解決example.company.org到外部負載平衡器,稱這將直接帶您到example-service

這一切聽起來可能比較複雜然後只是使用NodePort並更改外部負載均衡器的配置以獲得新服務。但是如果設置一次,配置和自動化就會大大簡化。它還提供了大量的新功能,否則將不得不手動實施。例如,nginx-ingress-controller本地支持基本認證,只需在Ingress資源中添加註釋即可。它還與kube-lego結合使用時支持letsencrypt。正如開始時所說的,您應該閱讀有關入口的文檔,以弄清楚它帶來的免費功能。

+0

「此負載均衡器必須位於羣集外部並由您自己配置。」這是否意味着我需要在另一個kubernete羣集上安裝入口和入口控制器?如果是這樣,第二個集羣如何與原始集羣通信?我實際上試圖在主節點上這樣做,但不起作用。謝謝! – Mian

+0

這裏有兩個負載均衡器,第一個是在羣集內運行的入口控制器。第二個是負載平衡器,您必須在集羣外部的某個位置創建/配置(完全在Kubernetes之外)。第二個指向入口控制器,僅作爲您現有基礎架構的集成點。例如,如果您的DC中已經運行了LB解決方案,則可以將其配置爲指向入口控制器。 –

1

獨立於您的LoadBalancer位於你可能只是有你的節點之間平衡虛擬IP地址的負載,包括它在你的服務定義如圖所示in the documentation

--- 
kind: Service 
apiVersion: v1 
metadata: 
    name: my-service 
spec: 
    selector: 
    app: MyApp 
    ports: 
    - name: http 
    protocol: TCP 
    port: 80 
    targetPort: 9376 
    externalIPs: 
    - 80.11.12.10 

一旦這個IP流量(80.11.12.10 )擊中任何節點,kube-proxy將重定向到您的服務。

實現此目的的一個選項是在節點上使用Pacemaker,如許多blog posts中所述。但是,在集羣前部安裝專用負載均衡器也可以。

使用虛擬IP的好處是您不必在防火牆或相關配置中混淆NodePort。另一個好處是,這不僅限於HTTP流量。

缺點是外部負載均衡器的配置和服務的IP分配不是自動的,必須手動完成。爲了緩解這個問題,您可以實現您自己的提供者(請參閱其他provider implementations on Github),或者您可以從etcd讀取服務配置並將其用作配置外部負載均衡器的源。