Kubernetes高可用負載均衡與叢集外服務訪問實踐_Kubernetes中文社群
Kubernetes在設計之初就充分考慮了針對容器的服務發現與負載均衡機制,提供了Service資源,並通過kube-proxy配合cloud provider來適應不同的應用場景。隨著kubernetes使用者的激增,使用者場景的不斷豐富,產生了一些新的負載均衡機制。
一、Kubernetes平臺Service的特點
Service是對一組提供相同功能的Pods的抽象,併為它們提供一個統一的入口。藉助Service,應用可以方便的實現服務發現與負載均衡,並實現應用的零宕機升級。Service通過標籤來選取服務後端,一般配合Replication Controller或者Deployment來保證後端容器的正常執行。
目前 kubernetes 共有三種服務暴露的方式:
- LoadBlancer Service
- NodePort Service
- Ingress
LoadBlancer Service是kubernetes深度結合雲平臺的一個元件;當使LoadBlancer Service暴露服務時,實際上是通過向底層雲平臺申請建立一個負載均衡器來向外暴露服務;目前LoadBlancer Service支援的雲平臺已經相對完善,比如國外的GCE、DigitalOcean,國內的 阿里雲,私有云 OpenStack 等等,由於LoadBlancer Service深度結合了雲平臺,所以只能在一些雲平臺上來使用。
NodePort Service,實質上就是通過在叢集的每個node上暴露一個埠,然後將這個埠對映到某個具體的service來實現的,雖然每個node的埠有很多(預設的取值範圍是 30000-32767),但是由於安全性和易用性(服務多了就亂了,還有埠衝突問題)實際使用可能並不多。
Ingress可以實現使用nginx等開源的反向代理負載均衡器實現對外暴露服務,可以理解Ingress就是用於配置域名轉發,在nginx中就類似upstream,它與ingress-controller結合使用,通過ingress-controller監控到pod及service的變化,動態地將ingress中的轉發資訊寫到諸如nginx、apache、haproxy等元件中實現方向代理和負載均衡。
二、Kubernetes平臺Ingress 介紹
Ingress 是一個規則的集合,它允許叢集外的流量通過一定的規則到達叢集內的 Service 。如下圖:
Ingress三個元件:
- 反向代理負載均衡器
- Ingress Controller
- Ingress
反向代理負載均衡器,即常見的負載均衡軟體,如 nginx、Haproxy 等。
Ingress Controller 與 kubernetes API 進行互動,實時的感知後端 service、pod 等變化, Ingress Controller 再結合下文的 Ingress 生成配置,然後更新反向代理負載均衡器,並重新整理其配置,實現動態服務發現與更新。
Ingress是規則集合;定義了域名與Kubernetes的service的對應關係;這個規則將與 Ingress Controller 結合, Ingress Controller 將其動態寫入到負載均衡器配置中,從而實現整體的服務發現和負載均衡。
Traefik
Træfɪk 是一個為了讓部署微服務更加便捷而誕生的現代HTTP反向代理、負載均衡工具。 它支援多種後臺來自動化、動態的應用它的配置檔案設定。
特性
- 它非常快
- 無需安裝其他依賴,通過Go語言編寫的單一可執行檔案
- 支援 Rest API
- 多種後臺支援:Docker, Swarm, Kubernetes, Marathon, Mesos, Consul, Etcd
- 後臺監控, 可以監聽後臺變化進而自動化應用新的配置檔案設定
- 配置檔案熱更新。無需重啟程序
- 正常結束http連線
- 後端斷路器
- 輪詢,rebalancer 負載均衡
- Rest Metrics
- 支援最小化 官方 docker 映象
- 後臺支援SSL
- 前臺支援SSL(包括SNI)
- 清爽的AngularJS前端頁面
- 支援Websocket
- 支援HTTP/2
- 網路錯誤重試
- 高可用叢集模式
Traefik 工作原理
Traefik 可以與Kubernetes的API進行互動,每當Kubernetes使用Ingress對微服務進行新增、移除、或更新都會被感知,並且可以自動生成它們的配置檔案。 指向到你服務的路由將會被直接創建出來。
Traefik UI介面
三、Kubernetes結合LVS高可用負載均衡與叢集外服務訪問實踐
前端為兩臺LVS伺服器,通過keepalive實現負載叢集高可用以及虛擬IP,實現外部流量的四層負載,以及作為Kubernetes叢集服務訪問的入口。LVS負載均衡採用DR模式提高叢集的處理速度。
後端三臺伺服器組成Kubernetes叢集,每臺節點使用hostPort 的方式部署traefik容器,traefik監聽節點的80埠,前端LVS負載均衡監聽後端三臺Kubernetes節點的80埠將外部訪問負載分擔至traefik。
然後由Traefik進行七層負載均衡,可以實現基於域名或訪問目錄等來實現對映與負載,將訪問流量對映至Kubernetes Service並通過Service負載至最終業務POD所在的容器。
組網拓撲如下:
Deploy關鍵配置
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: wordpress-svc labels: app: wordpress-svc spec: replicas: 3 strategy: type: Recreate template: metadata: labels: app: wordpress-svc tier: frontend spec: containers: - image: "192.168.18.250:5002/library/wordpress:4.4-apache" name: wordpress-svc ports: - containerPort: 80
Service關鍵配置
apiVersion: v1 kind: Service metadata: name: wordpress-svc labels: app: wordpress-svc spec: ports: - port: 8912 targetPort: 80 selector: app: wordpress-svc
Ingress 關鍵配置
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: wordpress-ing spec: rules: - host: wordpress.example.com http: paths: - path: / backend: serviceName: wordpress-svc servicePort: 8912
Kubernetes外部訪問流程圖
優勢:
1.所有應用實現域名方式訪問,相對IP+埠的訪問方式,提高了訪問的便捷性與可維護性。
2.簡化應用釋出的操作流程,域名與服務實現了自動更新與配置,只需定義ingress與新增外部DNS條目兩步操作,即可完成應用的對外發布,減少操作流程,提高維護效率。
不足:
1.叢集內部的服務轉發與負載應對大規模訪問流量,存在效能瓶頸,還有優化空間。
2.暫時無法實現LVS與Traefik的彈性伸縮與自動擴容。