正如你已經注意到的,你將不得不設置一個自定義負載均衡器來完成這項工作。此負載均衡器必須在羣集外部並由您自己進行配置。
我建議您通讀Ingress
和ingress-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。正如開始時所說的,您應該閱讀有關入口的文檔,以弄清楚它帶來的免費功能。
您可以使用DNS輪循機制,創建一個包含多個端點的DNS記錄,並使用監視程序服務使DNS記錄更新爲帶有活動節點的列表?看起來您需要在它之前構建負載平衡器解決方案。 –
嗨 - 您需要一個L4負載均衡器,但是混合了Nginx或HAproxy等產品。應該改變問題以避免未來的混淆? – pagid