1.1 docker容器技術
Docker provides a way to run applications securely isolated in a container, packaged with all its dependencies and libraries.Build once, Run anywhwere.
Docker提供了一種將應用程式安全,隔離執行的一種方式,能夠將應用程式依賴和庫檔案打包在一個容器中,後續再任何地方執行起來即可,其包含了應用程式所依賴相關環境,一次構建,任意執行(build once,run anywhere)
docker架構圖
Docker組成:
- Docker Daemon 容器管理元件,守護程式,負載容器,映象,儲存,網路等管理
- Docker Client 容器客戶端,負責和Docker Daemon互動,完成容器生命週期管理
- Docker Registry 容器映象倉庫,負責儲存,分發,打包
- Docker Object 容器物件,主要包含container和images
容器給應用程式開發環境帶來很大的便利,從根本上解決了容器的環境依賴,打包等問題,然而,Docker帶來的容器打包的便利,同時也帶來了以下的挑戰:
- 容器如何排程,分發
- 多臺機器如何協同工作
- Docker主機故障時應用如何恢復
- 如何保障應用高可用,橫向擴充套件,動態伸縮
1.2 kubernetes簡介與功能
Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.It groups containers that make up an application into logical units for easy management and discovery. Kubernetes builds upon15 years of experience of running production workloads at Google, combined with best-of-breed ideas and practices from the community.
Kubernetes是google開源的一套微服務,容器化的編排引擎,提供容器話應用的自動化部署,橫向擴充套件和管理,是google內部容器十多年實戰沉澱的結晶,已戰勝Swarm,Mesos成為容器編排的行業標準。
三大容器編排引擎:
- Swarm Docker原生提供的容器化編排引擎,隨著docker支援kubernetes逐漸廢棄
- Mesos 結合Marathon提供容器排程編排的能力,還能提供其他framwork的排程
- Kubernetes 已成為容器編排引擎的唯一標準,越來越多程式支援kubernetes。
kuberntes內建有很多非常優秀的特性使開發者專注於業務本身,其包含的功能如下:
kubernetes功能
- Service discovery and load balancing,服務發現和負載均衡,透過DNS實現內部解析,service實現負載均衡
- Storage orchestration,儲存編排,透過plungin的形式支援多種儲存,如本地,nfs,ceph,公有云快儲存等
- Automated rollouts and rollbacks,自動釋出與回滾,透過匹配當前狀態與目標狀態一致,更新失敗時可回滾
- Automatic bin packing,自動資源排程,可以設定pod排程的所需(requests)資源和限制資源(limits)
- Self-healing,內建的健康檢查策略,自動發現和處理叢集內的異常,更換,需重啟的pod節點
- Secret and configuration management,金鑰和配置管理,對於敏感資訊如密碼,賬號的那個透過secret儲存,應用的配置檔案透過configmap儲存,避免將配置檔案固定在映象中,增加容器編排的靈活性
- Batch execution,批處理執行,透過job和cronjob提供單次批處理任務和迴圈計劃任務功能的實現
- Horizontal scaling,橫向擴充套件功能,包含有HPA和AS,即應用的基於CPU利用率的彈性伸縮和基於平臺級的彈性伸縮,如自動增加node和刪除nodes節點。
1.3 kubernetes架構解析
kubernetes整體架構
kubernetes包含兩種角色:master節點和node節點,master節點是叢集的控制管理節點,作為整個k8s叢集的大腦。
- 負責叢集所有接入請求(kube-apiserver),在整個叢集的入口;
- 叢集資源排程(kube-controller-scheduler),透過watch監視pod的建立,負責將pod排程到合適的node節點;
- 叢集狀態的一致性(kube-controller-manager),透過多種控制器確保叢集的一致性,包含有Node Controller,Replication Controller,Endpoints Controller等;
- 後設資料資訊儲存(etcd),資料持久儲存化,儲存叢集中包括node,pod,rc,service等資料;
node節點是實際的工作節點,負責叢集負載的實際執行,即pod執行的載體,其通常包含三個元件:Container Runtime,kubelet和kube-proxy
- Container Runtime是容器執行時,負責實現container生命週期管理,如docker,containerd,rktlet;
- kubelet負責映象和pod的管理,
- kube-proxy是service服務實現的抽象,負責維護和轉發pod的路由,實現叢集內部和外部網路的訪問。
其他元件還包括:
- cloud-controller-manager,用於公有云的接入實現,提供節點管理(node),路由管理,服務管理(LoadBalancer和Ingress),儲存管理(Volume,如雲盤,NAS接入),需要由公有云廠商實現具體的細節,kubernetes提供實現介面的接入,如騰訊雲目前提供CVM的node管理,節點的彈性伸縮(AS),負載均衡的接入(CLB),儲存的管理(CBS和CFS)等產品的整合;
- DNS元件由kube-dns或coredns實現叢集內的名稱解析;
- kubernetes-dashboard用於圖形介面管理;
- kubectl命令列工具進行API互動;
- 服務外部接入,透過ingress實現七層接入,由多種controller控制器組成
- traefik
- nginx ingress controller
- haproxy ingress controller
- 公有云廠商ingress controller
- 監控系統用於採集node和pod的監控資料
- metric-server 核心指標監控
- prometheus 自定義指標監控,提供豐富功能
- heapster+influxdb+grafana 舊核心指標監控方案,現已廢棄
- 日誌採集系統,用於收集容器的業務資料,實現日誌的採集,儲存和展示,由EFK實現
- Fluentd 日誌採集
- ElasticSearch 日誌儲存+檢索
- Kiabana 資料展示
1.4 kubernetes高可用架構
kubernetes高可用叢集通常由3或5個節點組成高可用叢集,需要保障各個節點的高可用性
- etcd 內建叢集機制,保障資料持久儲存
- kube-apiserver 無狀態api服務,有負載均衡排程器做負載分發,如haproxy或nginx
- kube-scheduler 內建選舉機制,保障排程器高可用,確保同個時刻一個leader節點工作,其他處於阻塞,防止腦裂
- kube-controller-manager 內建的選舉機制保障控制器高可用,機制和kube-scheduler一致。
kubernetes高可用架構
本作品採用《CC 協議》,轉載必須註明作者和本文連結