一 Kubernetes概述 Kubernetes是一個全新的基於容器技術的分散式架構領先方案。Kubernetes(k8s)是Google開源的容器集群管理系統(谷歌內部:Borg)。在Docker技術的基礎上,為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模 ...
一 Kubernetes概述
Kubernetes是一個全新的基於容器技術的分散式架構領先方案。Kubernetes(k8s)是Google開源的容器集群管理系統(谷歌內部:Borg)。在Docker技術的基礎上,為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模容器集群管理的便捷性。 Kubernetes是一個完備的分散式系統支撐平臺,具有完備的集群管理能力,多擴多層次的安全防護和準入機制、多租戶應用支撐能力、透明的服務註冊和發現機制、內建智能負載均衡器、強大的故障發現和自我修複能力、服務滾動升級和線上擴容能力、可擴展的資源自動調度機制以及多粒度的資源配額管理能力。 同時Kubernetes提供完善的管理工具,涵蓋了包括開發、部署測試、運維監控在內的各個環節。 Kubernetes中,Service是分散式集群架構的核心,一個Service對象擁有如下關鍵特征:- 擁有一個唯一指定的名字
- 擁有一個虛擬IP(Cluster IP、Service IP、或VIP)和埠號
- 能夠提供某種遠程服務能力
- 被映射到了提供這種服務能力的一組容器應用上
- 目標Pod的定義
- 目標Pod需要運行的副本數量(Replicas)
- 要監控的目標Pod標簽(Label)
二 Kubernetes優勢、場景、特點
Kubernetes主要優勢:- 容器編排
- 輕量級
- 開源
- 彈性伸縮
- 負載均衡
- 快速部署應用
- 快速擴展應用
- 無縫對接新的應用功能
- 節省資源,優化硬體資源的使用
- 可移植: 支持公有雲,私有雲,混合雲,多重雲(multi-cloud)
- 可擴展: 模塊化, 插件化, 可掛載, 可組合
- 自動化: 自動部署,自動重啟,自動複製,自動伸縮/擴展
三 Kubetcl的核心概念
3.1 Master
k8s集群的管理節點,負責管理集群,提供集群的資源數據訪問入口。擁有Etcd存儲服務(可選),運行Api Server進程,Controller Manager服務進程及Scheduler服務進程,關聯工作節點Node。- Kubernetes API server提供HTTP Rest介面的關鍵服務進程,是Kubernetes里所有資源的增、刪、改、查等操作的唯一入口。也是集群控制的入口進程;
- Kubernetes Controller Manager是Kubernetes所有資源對象的自動化控制中心;
- Kubernetes Schedule是負責資源調度(Pod調度)的進程。
3.2 Node
Node是Kubernetes集群架構中運行Pod的服務節點(亦叫agent或minion)。Node是Kubernetes集群操作的單元,用來承載被分配Pod的運行,是Pod運行的宿主機。關聯Master管理節點,擁有名稱和IP、系統資源信息。運行docker eninge服務,守護進程kunelet及負載均衡器kube-proxy. 每個Node節點都運行著以下一組關鍵進程- kubelet:負責對Pod對於的容器的創建、啟停等任務,同時與Master節點協作,實現集群管理的基本功能;
- kube-proxy:實現Kubernetes Service的通信與負載均衡機制的重要組件;
- Docker Engine(Docker):Docker引擎,負責本機容器的創建和管理工作。
3.3 Pod
運行於Node節點上,若幹相關容器的組合。Pod內包含的容器運行在同一宿主機上,使用相同的網路命名空間、IP地址和埠,能夠通過localhost進行通信。Pod是Kurbernetes進行創建、調度和管理的最小單位,它提供了比容器更高層次的抽象,使得部署和管理更加靈活。一個Pod可以包含一個容器或者多個相關容器。 Pod有兩種類型:普通Pod和靜態Pod。後者比較特殊,它並不存在Kubernetes的etcd存儲中,而是存放在某個具體的Node上的一個具體文件中,並且只在此Node上啟動。普通Pod一旦被創建,就會被放入etcd存儲中,隨後會被Kubernetes Master調度到摸個具體的Node上進行綁定,隨後該Pod被對應的Node上的kubelet進程實例化成一組相關的Docker容器並啟動起來,在預設情況下,當Pod里的某個容器停止時,Kubernetes會自動檢測到這個問題並且重啟這個Pod(重啟Pod里的所有容器),如果Pod所在的Node宕機,則會將這個Node上的所有Pod重新調度到其他節點上。 Pod的IP與ContainerPort(容器埠)共同構成了Endpoint,表示此Pod中的一個服務進程對外的通信地址。 每個Pod也可以對其能使用的資源設置相應配額,CPU和記憶體的數值都為絕對值,CPU通常定義為千分之一單位,如100-300m,表示占用0.1——0.3個CPU,記憶體通常以位元組數表示,如64Mi。3.4 Label(標簽)
Kubernetes中的任意API對象都是通過Label進行標識,Label的實質是一系列的Key/Value鍵值對,其中key與value可自定義。Label可以附加到各種資源對象上,如Node、Pod、Service、RC等,一個資源對象可以定義任意數量的Label,同一個Label也可以被添加到任意數量的資源對象上去。Label是Replication Controller和Service運行的基礎,二者通過Label來進行關聯Node上運行的Pod,可以通過Label Selector(標簽選擇器)查詢和篩選資源對象。 一些常用的Label如下:- 版本標簽:"release":"stable","release":"canary"......
- 環境標簽:"environment":"dev","environment":"qa","environment":"production"
- 架構標簽:"tier":"frontend","tier":"backend","tier":"middleware"
- 分區標簽:"partition":"customerA","partition":"customerB"
- 質量管控標簽:"track":"daily","track":"weekly"
- kube-Controller進程通過資源對象RC上定義Label Selector來篩選要監控的Pod副本的數量,從而實現副本數量始終符合預期設定的全自動控制流程
- kube-proxy進程通過Service的Label Selector來選擇對應的Pod,自動建立起每個Service島對應Pod的請求轉發路由表,從而實現Service的智能負載均衡
- 通過對某些Node定義特定的Label,並且在Pod定義文件中使用Nodeselector這種標簽調度策略,kuber-scheduler進程可以實現Pod”定向調度“的特性。
3.5 Replication Controller
Replication Controller用來管理Pod的副本,保證集群中存在指定數量的Pod副本。集群中副本的數量大於指定數量,則會停止指定數量之外的多餘容器數量,反之,則會啟動少於指定數量個數的容器,保證數量不變。Replication Controller是實現彈性伸縮、動態擴容和滾動升級的核心。 定義RC包括如下幾個部分:- Pod期待的副本數(replicas);
- 用於篩選目標Pod的Label Selector;
- 當Pod的副本數小於預期數量時,用於創建Pod的Pod模板(template)。
- 通過定義RC實現Pod的創建過程及副本數量自動控制;
- RC里包括完整的Pod定義模板;
- RC通過Label Selector機制實現副本的自動控制;
- 通過改變RC里的Pod副本數量,可以實現Pod的擴容或縮容功能;
- 通過改變RC的Pod模板的鏡像版本,可以實現Pod的滾動升級功能。
3.6 Deployment
Deployment在內部使用了RS來實現目的,Deployment相當於RC的一次升級,其最大的特色為可以隨時獲知當前Pod的部署進度。 Deployment場景:- 創建一個Deployment對象來生成對應的RS並完成Pod副本的創建過程;
- 檢查Deployment的狀態來看部署動作是否完成(即副本數量是否達到預期值);
- 更新Deployment以創建新的Pod(比如鏡像升級);
- 如果當前Deployment不穩定,則回滾到一個早先Deployment版本;
- 掛起或恢復一個Deployment。
3.7 HPA(Horizontal Pod Autoscaler)
Pod的橫向自動擴容,也是Kubernetes的一種資源,通過追蹤分析RC控制的所有Pod目標的負載變化情況,來確定是否需要針對性的調整Pod副本數量。 HPA針對Pod負載的兩種度量方式:- CPUUtilizationPercentage;
- 應用程式自定義的度量指標。
3.8 Service
Service定義了Pod的邏輯集合和訪問該集合的策略,是真實服務的抽象。Service提供了一個統一的服務訪問入口以及服務代理和發現機制,關聯多個相同Label的Pod,用戶不需要瞭解後臺Pod是如何運行。 外部系統訪問Service的機制: Kubernetes的三種IP:- Node IP:Node節點的IP地址
- Pod IP: Pod的IP地址
- Cluster IP:Service的IP地址
- Cluster IP僅僅作用於Kubernetes Service這個對象,並由Kubernetes管理和分配P地址;
- Cluster IP無法被ping,他沒有一個“實體網路對象”來響應;
- Cluster IP只能結合Service Port組成一個具體的通信埠,單獨的Cluster IP不具備通信的基礎,並且他們屬於Kubernetes集群這樣一個封閉的空間。
- Kubernetes集群之內,Node IP網、Pod IP網與Cluster IP網之間的通信,採用的是Kubernetes自己設計的一種區別於常規的IP路由的編程方式的特殊路由規則。
3.9 Volume(存儲捲)
Volume是Pod中能夠被多個容器訪問的共用目錄,Kubernetes中的Volume是定義在Pod上,可以被一個或多個Pod中的容器掛載到某個目錄下。Kubernetes中的Volume與Pod的生命周期相同,與容器的生命周期並無直接關係。Kubernetes的Volume支持多種類型的後端驅動,如glusterfs、ceph。 Volume常見類型:- emptyDir:為Pod分配到Node的時候創建。無需指定宿主機的目錄文件,為Kubernetes自動分配的目錄。
- hostPath:為在Pod上掛載宿主機上的文件或目錄。
提示:若不同Node上具有相同配置的Pod可能因為宿主機的目錄結構不一致從而導致訪問結構不一致。
- NFS:NFS網路文件系統;
- iSCSI:iSCSI存儲設備;
- flocker;
- rbd:
- glusterfs。