雲容器引擎(Cloud Container Engine,簡稱CCE)提供高度可擴展的、高性能的企業級Kubernetes集群,支持運行Docker容器。借助雲容器引擎,您可以在華為雲上輕松部署、管理和擴展容器化應用程序。
雲容器引擎提供Kubernetes原生API,支持使用kubectl,且提供圖形化控制台,讓您能夠擁有完整的端到端使用體驗,使用雲容器引擎前,建議您先了解相關的基本概念。
集群(Cluster)
集群指容器運行所需要的雲資源組合,關聯了若干雲服務器節點、負載均衡等雲資源。您可以理解為集群是“同一個子網中一個或多個彈性雲服務器(又稱:節點)”通過相關技術組合而成的計算機群體,為容器運行提供了計算資源池。
節點(Node)
每一個節點對應一台服務器(可以是虛擬機實例或者物理服務器),容器應用運行在節點上。節點上運行着Agent代理程序(kubelet),用於管理節點上運行的容器實例。集群中的節點數量可以伸縮。
節點池(NodePool)
節點池是集群中具有相同配置的一組節點,一個節點池包含一個節點或多個節點。
虛擬私有雲(VPC)
虛擬私有雲是通過邏輯方式進行網絡隔離,提供安全、隔離的網絡環境。您可以在VPC中定義與傳統網絡無差別的虛擬網絡,同時提供彈性IP、安全組等高級網絡服務。
安全組
安全組是一個邏輯上的分組,為同一個VPC內具有相同安全保護需求並相互信任的彈性雲服務器提供訪問策略。安全組創建后,用戶可以在安全組中定義各種訪問規則,當彈性雲服務器加入該安全組后,即受到這些訪問規則的保護。
詳細介紹請參見安全組。
集群、虛擬私有雲、安全組和節點的關系
如下圖,同一個Region下可以有多個虛擬私有雲(VPC)。虛擬私有雲由一個個子網組成,子網與子網之間的網絡交互通過子網網關完成,而集群就是建立在某個子網中。因此,存在以下三種場景:
不同集群可以創建在不同的虛擬私有雲中。
不同集群可以創建在同一個子網中。
不同集群可以創建在不同的子網中。
集群、VPC、安全組和節點的關系
實例(Pod)
實例(Pod)是 Kubernetes 部署應用或服務的最小的基本單位。一個Pod 封裝多個應用容器(也可以只有一個容器)、存儲資源、一個獨立的網絡 IP 以及管理控制容器運行方式的策略選項。
實例(Pod)
容器(Container)
一個通過 Docker 鏡像創建的運行實例,一個節點可運行多個容器。容器的實質是進程,但與直接在宿主執行的進程不同,容器進程運行於屬於自己的獨立的命名空間。
工作負載
工作負載即Kubernetes對一組Pod的抽象模型,用於描述業務的運行載體,包括Deployment、Statefulset、Daemonset、Job、CronJob等多種類型。
- 無狀態工作負載:即kubernetes中的“Deployment”,無狀態工作負載支持彈性伸縮與滾動升級,適用於實例完全獨立、功能相同的場景,如:nginx、wordpress等。
- 有狀態工作負載:即kubernetes中的“StatefulSet”,有狀態工作負載支持實例有序部署和刪除,支持持久化存儲,適用於實例間存在互訪的場景,如ETCD、mysql-HA等。
- 創建守護進程集:即kubernetes中的“DaemonSet”,守護進程集確保全部(或者某些)節點都運行一個Pod實例,支持實例動態添加到新節點,適用於實例在每個節點上都需要運行的場景,如ceph、fluentd、Prometheus
Node Exporter等。 - 普通任務:即kubernetes中的“Job”,普通任務是一次性運行的短任務,部署完成后即可執行。使用場景為在創建工作負載前,執行普通任務,將鏡像上傳至鏡像倉庫。
- 定時任務:即kubernetes中的“CronJob”,定時任務是按照指定時間周期運行的短任務。使用場景為在某個固定時間點,為所有運行中的節點做時間同步。
工作負載與Pod的關系
編排模板
編排模板包含了一組容器服務的定義和其相互關聯,可以用於多容器應用的部署和管理。
鏡像(Image)
Docker鏡像是一個模板,是容器應用打包的標准格式,用於創建Docker容器。或者說,Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些為運行時准備的配置參數(如匿名卷、環境變量、用戶等)。鏡像不包含任何動態數據,其內容在構建之后也不會被改變。在部署容器化應用時可以指定鏡像,鏡像可以來自於 Docker Hub、華為雲容器鏡像服務或者用戶的私有 Registry。例如一個Docker鏡像可以包含一個完整的Ubuntu操作系統環境,里面僅安裝了用戶需要的應用程序及其依賴文件。
鏡像(Image)和容器(Container)的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
鏡像、容器、工作負載的關系
命名空間(Namespace)
命名空間是對一組資源和對象的抽象整合。在同一個集群內可創建不同的命名空間,不同命名空間中的數據彼此隔離。使得它們既可以共享同一個集群的服務,也能夠互不干擾。例如:
- 可以將開發環境、測試環境的業務分別放在不同的命名空間。
- 常見的pods, services, replication
controllers和deployments等都是屬於某一個namespace的(默認是default),而node,
persistentVolumes等則不屬於任何namespace。
服務(Service)
Service是將運行在一組 Pods 上的應用程序公開為網絡服務的抽象方法。
使用Kubernetes,您無需修改應用程序即可使用不熟悉的服務發現機制。 Kubernetes為Pods提供自己的IP地址和一組Pod的單個DNS名稱,並且可以在它們之間進行負載平衡。
Kubernetes允許指定一個需要的類型的 Service,類型 的取值以及行為如下:
- ClusterIP:集群內訪問。通過集群的內部 IP 暴露服務,選擇該值,服務只能夠在集群內部可以訪問,這也是默認的
ServiceType。 - NodePort:節點訪問。通過每個 Node 上的 IP 和靜態端口(NodePort)暴露服務。NodePort 服務會路由到
ClusterIP 服務,這個 ClusterIP 服務會自動創建。通過請求
:,可以從集群的外部訪問一個 NodePort 服務。 - LoadBalancer:負載均衡。使用雲提供商的負載均衡器,可以向外部暴露服務。外部的負載均衡器可以路由到 NodePort 服務和
ClusterIP 服務。 - DNAT:DNAT網關。可以為集群節點提供網絡地址轉換服務,使多個節點可以共享使用彈性IP。與彈性IP方式相比增強了可靠性,彈性IP無需與單個節點綁定,任何節點狀態的異常不影響其訪問
七層負載均衡(Ingress)
Ingress是為進入集群的請求提供路由規則的集合,可以給service提供集群外部訪問的URL、負載均衡、SSL終止、HTTP路由等。
網絡策略(NetworkPolicy)
NetworkPolicy提供了基於策略的網絡控制,用於隔離應用並減少攻擊面。它使用標簽選擇器模擬傳統的分段網絡,並通過策略控制它們之間的流量以及來自外部的流量。
配置項(Configmap)
ConfigMap用於保存配置數據的鍵值對,可以用來保存單個屬性,也可以用來保存配置文件。ConfigMap跟secret很類似,但它可以更方便地處理不包含敏感信息的字符串。
密鑰(Secret)
Secret解決了密碼、token、密鑰等敏感數據的配置問題,而不需要把這些敏感數據暴露到鏡像或者Pod Spec中。Secret可以以Volume或者環境變量的方式使用。
標簽(Label)
標簽其實就一對 key/value,被關聯到對象上,比如Pod。標簽的使用我們傾向於能夠標示對象的特殊特點,並且對用戶而言是有意義的,但是標簽對內核系統是沒有直接意義的。
選擇器(LabelSelector)
Label selector是Kubernetes核心的分組機制,通過label selector客戶端/用戶能夠識別一組有共同特征或屬性的資源對象。
注解(Annotation)
Annotation與Label類似,也使用key/value鍵值對的形式進行定義。
Label具有嚴格的命名規則,它定義的是Kubernetes對象的元數據(Metadata),並且用於Label Selector。
Annotation則是用戶任意定義的“附加”信息,以便於外部工具進行查找。
存儲卷(PersistentVolume)
PersistentVolume(PV)是集群之中的一塊網絡存儲。跟 Node 一樣,也是集群的資源。
存儲聲明(PersistentVolumeClaim)
PV 是存儲資源,而 PersistentVolumeClaim (PVC) 是對 PV 的請求。PVC 跟 Pod 類似:Pod 消費 Node 資源,而 PVC 消費 PV 資源;Pod 能夠請求 CPU 和內存資源,而 PVC 請求特定大小和訪問模式的數據卷。
彈性伸縮(HPA)
Horizontal Pod Autoscaling,簡稱HPA,是Kubernetes中實現POD水平自動伸縮的功能。Kubernetes集群可以通過Replication Controller的scale機制完成服務的擴容或縮容,實現具有伸縮性的服務。
親和性與反親和性
在應用沒有容器化之前,原先一個虛機上會裝多個組件,進程間會有通信。但在做容器化拆分的時候,往往直接按進程拆分容器,比如業務進程一個容器,監控日志處理或者本地數據放在另一個容器,並且有獨立的生命周期。這時如果他們分布在網絡中兩個較遠的點,請求經過多次轉發,性能會很差。
- 親和性:可以實現就近部署,增強網絡能力實現通信上的就近路由,減少網絡的損耗。如:應用A與應用B兩個應用頻繁交互,所以有必要利用親和性讓兩個應用的盡可能的靠近,甚至在一個節點上,以減少因網絡通信而帶來的性能損耗。
- 反親和性:主要是出於高可靠性考慮,盡量分散實例,某個節點故障的時候,對應用的影響只是 N
分之一或者只是一個實例。如:當應用采用多副本部署時,有必要采用反親和性讓各個應用實例打散分布在各個節點上,以提高HA。
節點親和性(NodeAffinity)
通過選擇標簽的方式,可以限制pod被調度到特定的節點上。
節點反親和性(NodeAntiAffinity)
通過選擇標簽的方式,可以限制pod不被調度到特定的節點上。
工作負載親和性(PodAffinity)
指定工作負載部署在相同節點。用戶可根據業務需求進行工作負載的就近部署,容器間通信就近路由,減少網絡消耗。
工作負載反親和性(PodAntiAffinity)
指定工作負載部署在不同節點。同個工作負載的多個實例反親和部署,減少宕機影響;互相干擾的應用反親和部署,避免干擾。
資源配額(Resource Quota)
資源配額(Resource Quotas)是用來限制用戶資源用量的一種機制。
資源限制(Limit Range)
默認情況下,K8S中所有容器都沒有任何CPU和內存限制。LimitRange(簡稱limits)用來給Namespace增加一個資源限制,包括最小、最大和默認資源。在pod創建時,強制執行使用limits的參數分配資源。
環境變量
環境變量是指容器運行環境中設定的一個變量,您可以在創建容器模板時設定不超過30個的環境變量。環境變量可以在工作負載部署后修改,為工作負載提供了極大的靈活性。
在CCE中設置環境變量與Dockerfile中的“ENV”效果相同。
應用服務網格(Istio)
Istio是一個提供連接、保護、控制以及觀測功能的開放平台。
雲容器引擎深度集成了應用服務網格,提供非侵入式的微服務治理解決方案,支持完整的生命周期管理和流量治理能力,兼容Kubernetes和Istio生態。一鍵開啟應用服務網格后即可提供非侵入的智能流量治理解決方案,其功能包括負載均衡、熔斷、限流等多種治理能力。應用服務網格內置金絲雀、藍綠等多種灰度發布流程,提供一站式自動化的發布管理。基於無侵入的監控數據采集,深度整合華為雲應用性能管理(APM)能力,提供實時流量拓撲、調用鏈等服務性能監控和運行診斷,構建全景的服務運行視圖。