淺談 Kubernetes 在生產環境中架構

注意:本文,只是筆者針對Kubernetes生產環境運行的一些關於架構設計和實現方案的總結,內容很粗糙,同時也會不斷完善。

首先,我們來梳理下Kubernetes生產架構,其設計適用於絕大多數環境。如下圖所示


淺談 Kubernetes 在生產環境中架構


在該架構中,我們可以將其分為四層,如下:

  • Client層:即Kubernetes集群外部用戶、客戶端等;
  • 服務訪問層:即由Traefik ingress實現服務發現、負載均衡和路由規則定義等;
  • 業務應用層:即基於Kubernetes平臺構建和運行企業業務應用,如CI/CD持續集成、微服務項目、監控告警和日誌管理、私有鏡像倉庫等服務;
  • 基礎設施層:即由Kubernetes容器管理平臺和Ceph數據持久化存儲等系統組成的基礎設施服務。


下面,我們分別來談談各層的具體實現方案。

基礎設施層

Kubernetes平臺

  • 部署管理:Kubernetes平臺除了直接使用公有云如阿里雲、AWS等雲服務提供商的K8s服務外,我們還可以自己部署和管理等,如使用Kubespray工具。
  • 網絡通信:在容器和容器之間、容器和主機網絡方面,可以使用Calico或Flannel等方案。
  • HA高可用:Kubernetes節點分為Master和Node兩種類型節點,前者負責運行集群相關的控制管理服務,而後者負責運行Pod容器。在多Node節點模式下,由於Kubernetes Pod具有天然的容災冗餘HA高可用實現,因此,我們並不需要關心Node節點的HA高可用,而只需關心Master節點的HA即可,Master節點的HA高可用,通過多Master節點+HAProxy方案實現即可。從Kubernetes 1.12版本起,kube-proxy服務默認使用ipvs實現,取消了之前的iptables。這有助於提升K8s大規模集群環境下的性能和穩定性。
  • Docker和操作系統優化:在生產環境中,Docker和操作系統版本應當使用較新的release版本。並且,主機操作系統應當做一定程度的優化配置,如關閉swap內存交換分區,預留一定的CPU核數和內存資源給宿主機使用等。


Ceph/NFS數據存儲

Kubernetes平臺的數據持久化存儲,可以使用Ceph、NFS等存儲方案。其中,Ceph適用於有其技術背景或大容量存儲需求的公司;而NFS適用於存儲容量需求相對較小,無專業存儲技術背景的公司。

業務應用層

  • 鏡像管理:使用Harbor私有鏡像倉庫服務;
  • 日誌管理:使用Elasticsearch、Filebeat 和 Kibana技術棧;
  • 監控告警管理:使用Cadvisor、Prometheus和Grafana技術棧;
  • 微服務架構:使用Service Mesh服務網格中的Istio方案;
  • Devops:使用Gitlab、Jenkins等持續集成工具;
  • 單體應用:無狀態類服務使用deployment,有狀態類服務則使用Statefulset,如果關聯的服務較多且複雜則使用Helm。
  • 規劃好Namespace:應當做到每個namespace專屬用於某類型的應用,如monitor namespace統一管理諸如監控告警和日誌管理方面的pod、service、pvc、ingress等資源。這樣,可以較為方便的管理和區分K8s上的各種應用。

服務訪問層

外部客戶端訪問K8s集群內的服務、負載均衡和路由規則定義使用Traefik Ingress實現。此外,應當實現Ingress服務HA高可用,可以想象在K8s集群中,大量的出入口流量都進過Ingress,其負載是非常大的,其重要程度不言而喻,因此實現HA就非常重要。ingress controller節點(無論是基於nginx還是traefik實現)應當至少為2個節點,並在這些節點上,部署Keepalived和HAproxy共同維護一個VIP地址,將其提供給ingress使用。

架構如下圖所示


淺談 Kubernetes 在生產環境中架構


在該架構中,Ingress節點一般使用獨立的服務器,即只做將集群外部流量接入到集群內部。除了使用external Ip來暴露ingress的Service到集群外部,還可以使用hostNetwork,如果是公有云,還可以使用LoadBalance。這樣Ingress Controller將監聽節點的80和443端口,通過熱備的形式部署多個ingress節點,並在每個節點上部署Keepalived,多個節點共同維護一個VIP,實現Ingress服務的高可用。

如上圖所示,部署兩個ingress節點172.16.10.11和172.16.10.12。公網ip映射或轉發到內網的VIP地址172.16.10.10上(如果VIP本身是公網IP則可以不用轉發)。ingress controller的副本數replicaCount為2,將被調度到node1和node2這兩個節點上。同時,使用pod反親和性禁止ingress pod調度在同一個節點上。


分享到:


相關文章: