001.Kubernetes簡介

来源:https://www.cnblogs.com/itzgr/archive/2019/01/11/10254589.html
-Advertisement-
Play Games

一 Kubernetes概述 Kubernetes是一個全新的基於容器技術的分散式架構領先方案。Kubernetes(k8s)是Google開源的容器集群管理系統(谷歌內部:Borg)。在Docker技術的基礎上,為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模 ...


一 Kubernetes概述

Kubernetes是一個全新的基於容器技術的分散式架構領先方案。Kubernetes(k8s)是Google開源的容器集群管理系統(谷歌內部:Borg)。在Docker技術的基礎上,為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模容器集群管理的便捷性。   Kubernetes是一個完備的分散式系統支撐平臺,具有完備的集群管理能力,多擴多層次的安全防護和準入機制、多租戶應用支撐能力、透明的服務註冊和發現機制、內建智能負載均衡器、強大的故障發現和自我修複能力、服務滾動升級和線上擴容能力、可擴展的資源自動調度機制以及多粒度的資源配額管理能力。 同時Kubernetes提供完善的管理工具,涵蓋了包括開發、部署測試、運維監控在內的各個環節。 Kubernetes中,Service是分散式集群架構的核心,一個Service對象擁有如下關鍵特征:
  1. 擁有一個唯一指定的名字
  2. 擁有一個虛擬IP(Cluster IP、Service IP、或VIP)和埠號
  3. 能夠提供某種遠程服務能力
  4. 被映射到了提供這種服務能力的一組容器應用上
  Service的服務進程目前都是基於Socket通信方式對外提供服務,比如Redis、Memcache、MySQL、Web Server,或者是實現了某個具體業務的一個特定的TCP Server進程,雖然一個Service通常由多個相關的服務進程來提供服務,每個服務進程都有一個獨立的Endpoint(IP+Port)訪問點,但Kubernetes能夠讓我們通過服務連接到指定的Service上。有了Kubernetes內建的透明負載均衡和故障恢復機制,不管後端有多少服務進程,也不管某個服務進程是否會由於發生故障而重新部署到其他機器,都不會影響我們對服務的正常調用,更重要的是這個Service本身一旦創建就不會發生變化,意味著在Kubernetes集群中,我們不用為了服務的IP地址的變化問題而進行修複。   容器提供了強大的隔離功能,所以有必要把為Service提供服務的這組進程放入容器中進行隔離。為此,Kubernetes設計了Pod對象,將每個服務進程包裝到相對應的Pod中,使其成為Pod中運行的一個容器。為了建立Service與Pod間的關聯管理,Kubernetes給每個Pod貼上一個標簽Label,比如運行MySQL的Pod貼上name=mysql標簽,給運行PHP的Pod貼上name=php標簽,然後給相應的Service定義標簽選擇器Label Selector,這樣就能巧妙的解決了Service於Pod的關聯問題。 Pod運行在一個稱之為節點(Node)的環境中,節點可以是物理機,也可以是虛擬機,通過一個節點運行幾百個Pod;其次每個Pod里運行著一個特殊的稱之為Pause的容器,其他容器則為業務容器,所有業務容器共用Pause容器的網路棧和Volume掛載捲,因此他們之間的通信和交互更為高效,因此在設計之初可以將一組密切相關聯的服務進程放入同一個Pod中。   在集群管理方面,Kubernetes將集群中的機器劃分為一個Master節點和一群工作節點Node,其中,在Master節點運行著集群管理相關的一組進程kube-apiserver、kube-controller-manager和kube-scheduler,這些進程實現了整個集群的資源管理、Pod調度、彈性伸縮、安全控制、系統監控和糾錯等管理能力,並且都是全自動完成的。Node作為集群中的工作節點,運行真正的應用程式,在Node上Kubernetes管理的最小運行單元是Pod。Node上運行著Kubernetes的kubelet、kube-proxy服務進程,這些服務進程負責Pod的創建、啟動、監控、重啟、銷毀以及實現軟體模式的負載均衡器。   在Kubernetes集群中,它解決了傳統IT系統中服務擴容和升級的兩大難題。你只需為需要擴容的Service關聯的Pod創建一個Replication Controller簡稱(RC),則該Service的擴容及後續的升級等問題將迎刃而解。在一個RC定義文件中包括以下3個關鍵信息。
  1. 目標Pod的定義
  2. 目標Pod需要運行的副本數量(Replicas)
  3. 要監控的目標Pod標簽(Label)
  在創建好RC後,Kubernetes會通過RC中定義的的Label篩選出對應Pod實例並實時監控其狀態和數量,如果實例數量少於定義的副本數量,則會根據RC中定義的Pod模板來創建一個新的Pod,然後將新Pod調度到合適的Node上啟動運行,直到Pod實例的數量達到預定目標,這個過程完全是自動化。

二 Kubernetes優勢、場景、特點

Kubernetes主要優勢:
  • 容器編排
  • 輕量級
  • 開源
  • 彈性伸縮
  • 負載均衡
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節點都運行著以下一組關鍵進程
  1. kubelet:負責對Pod對於的容器的創建、啟停等任務,同時與Master節點協作,實現集群管理的基本功能;
  2. kube-proxy:實現Kubernetes Service的通信與負載均衡機制的重要組件;
  3. Docker Engine(Docker):Docker引擎,負責本機容器的創建和管理工作。
  Node節點可以在運行期間動態增加到Kubernetes集群中,預設情況下,kubelet會想master註冊自己,這也是Kubernetes推薦的Node管理方式,kubelet進程會定時向Master彙報自身情報,如操作系統、Docker版本、CPU和記憶體,以及有哪些Pod在運行等等,這樣Master可以獲知每個Node節點的資源使用情況,並實現高效均衡的資源調度策略。

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重新調度到其他節點上。 001 Pod的IP與ContainerPort(容器埠)共同構成了Endpoint,表示此Pod中的一個服務進程對外的通信地址。 每個Pod也可以對其能使用的資源設置相應配額,CPU和記憶體的數值都為絕對值,CPU通常定義為千分之一單位,如100-300m,表示占用0.1——0.3個CPU,記憶體通常以位元組數表示,如64Mi。 002

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"
  Label相當於我們熟悉的標簽,給某個資源對象定義一個Label就相當於給它大了一個標簽,隨後可以通過Label Selector(標簽選擇器)查詢和篩選擁有某些Label的資源對象,Kubernetes通過這種方式實現了類似SQL的簡單又通用的對象查詢機制。 Label和Label Selector共同構成了Kubernetes系統中最核心的應用模型,是的被管理對象能夠被精細的分組管理,同時實現了整個集群的高可用性。 Label場景:
  • kube-Controller進程通過資源對象RC上定義Label Selector來篩選要監控的Pod副本的數量,從而實現副本數量始終符合預期設定的全自動控制流程
  • kube-proxy進程通過Service的Label Selector來選擇對應的Pod,自動建立起每個Service島對應Pod的請求轉發路由表,從而實現Service的智能負載均衡
  • 通過對某些Node定義特定的Label,並且在Pod定義文件中使用Nodeselector這種標簽調度策略,kuber-scheduler進程可以實現Pod”定向調度“的特性。
003

3.5 Replication Controller

  Replication Controller用來管理Pod的副本,保證集群中存在指定數量的Pod副本。集群中副本的數量大於指定數量,則會停止指定數量之外的多餘容器數量,反之,則會啟動少於指定數量個數的容器,保證數量不變。Replication Controller是實現彈性伸縮、動態擴容和滾動升級的核心。 定義RC包括如下幾個部分:
  • Pod期待的副本數(replicas);
  • 用於篩選目標Pod的Label Selector;
  • 當Pod的副本數小於預期數量時,用於創建Pod的Pod模板(template)。
RC機制: 當定義了RC並提交至Kubernetes集群中之後,Master節點上的Controller Manager組件獲悉,並同時巡檢系統中當前存活的目標Pod,並確保目標Pod實例的數量剛好等於此RC的期望值,若存在過多的Pod副本在運行,系統會停止一些Pod,反之則自動創建一些Pod。 註意:刪除RC並不會影響通過該RC已經創建的Pod。 提示:下一代RC,即Replica Sets與RC唯一的區別是RS支持基於集合的Label selector。 RC特性及場景:
  • 通過定義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地址
  首先,Node IP是Kubernetes集群中節點的物理網卡IP地址,所有屬於這個網路的伺服器之間都能通過這個網路直接通信。這也表明Kubernetes集群之外的節點訪問Kubernetes集群之內的某個節點或者TCP/IP服務的時候,必須通過Node IP進行通信;   其次,Pod IP是每個Pod的IP地址,他是Docker Engine根據docker0網橋的IP地址段進行分配的,通常是一個虛擬的二層網路;   最後Cluster IP是一個虛擬的IP,但更像是一個偽造的IP網路,Cluster IP特點:
  1. Cluster IP僅僅作用於Kubernetes Service這個對象,並由Kubernetes管理和分配P地址;
  2. Cluster IP無法被ping,他沒有一個“實體網路對象”來響應;
  3. Cluster IP只能結合Service Port組成一個具體的通信埠,單獨的Cluster IP不具備通信的基礎,並且他們屬於Kubernetes集群這樣一個封閉的空間。
  4. 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自動分配的目錄。
場景: 臨時空間,用於某些應用程式運行時所需的臨時目錄,且無須永久保存; 長時間任務的中間過程CheckPoint的臨時保存目錄; 一個容器需要從另一個容器中獲取數據的目錄(多容器共用目錄)。
  • hostPath:為在Pod上掛載宿主機上的文件或目錄。
場景: 容器應用程式生產的日誌文件需要永久保存,可以使用宿主機的高速文件系統進行存儲; 需要訪問宿主機的Docker內部數據結構的容器。可指定hostPath為/var/lib/docker,使容器內部應用直接訪問Docker的文件系統;

提示:若不同Node上具有相同配置的Pod可能因為宿主機的目錄結構不一致從而導致訪問結構不一致。

  • NFS:NFS網路文件系統;
  • iSCSI:iSCSI存儲設備;
  • flocker;
  • rbd:
  • glusterfs。

3.10 Namespace(命名空間)

Namespace用於實現多租戶的資源隔離,可將集群內部的資源對象分配到不同的Namespace中,形成邏輯上的不同項目、小組或用戶組,便於不同的Namespace在共用使用整個集群的資源的同時還能被分別管理。 提示:Kubernetes集群在啟動後,會創建一個名為“default”的Namespace,且預設情況下Kubernetes的相關資源,如Pod、RC、Service都將被系統創建到此預設名為default的Namespace中。

3.11 Annotation(註釋)

Annotation類似Label,也使用key/value形式進行定義。Annotation是用戶任意定義的“附加信息”,如電話號碼、負責人、網站等等。  

四 Kubernetes 組件簡述

Kubernetes Master控制組件,調度管理整個系統(集群),包含如下組件: Kubernetes API Server 作為Kubernetes系統的入口,其封裝了核心對象的增刪改查操作,以RESTful API介面方式提供給外部客戶和內部組件調用。維護的REST對象持久化到Etcd中存儲。 Kubernetes Scheduler 為新建立的Pod進行節點(node)選擇(即分配機器),負責集群的資源調度。組件抽離,可以方便替換成其他調度器。 Kubernetes Controller 負責執行各種控制器,目前已經提供了很多控制器來保證Kubernetes的正常運行。 Replication Controller 管理維護Replication Controller,關聯Replication Controller和Pod,保證Replication Controller定義的副本數量與實際運行Pod數量一致。 Node Controller 管理維護Node,定期檢查Node的健康狀態,標識出(失效|未失效)的Node節點。 Namespace Controller 管理維護Namespace,定期清理無效的Namespace,包括Namesapce下的API對象,比如Pod、Service等。 Service Controller 管理維護Service,提供負載以及服務代理。 EndPoints Controller 管理維護Endpoints,關聯Service和Pod,創建Endpoints為Service的後端,當Pod發生變化時,實時更新Endpoints。 Service Account Controller 管理維護Service Account,為每個Namespace創建預設的Service Account,同時為Service Account創建Service Account Secret。 Persistent Volume Controller 管理維護Persistent Volume和Persistent Volume Claim,為新的Persistent Volume Claim分配Persistent Volume進行綁定,為釋放的Persistent Volume執行清理回收。 Daemon Set Controller 管理維護Daemon Set,負責創建Daemon Pod,保證指定的Node上正常的運行Daemon Pod。 Deployment Controller 管理維護Deployment,關聯Deployment和Replication Controller,保證運行指定數量的Pod。當Deployment更新時,控制實現Replication Controller和 Pod的更新。 Job Controller 管理維護Job,為Jod創建一次性任務Pod,保證完成Job指定完成的任務數目 Pod Autoscaler Controller 實現Pod的自動伸縮,定時獲取監控數據,進行策略匹配,當滿足條件時執行Pod的伸縮動作。   參考:https://blog.csdn.net/qq_35254726/article/details/54233781
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近使用電腦時遇到的問題: 使用spotlight進行搜索時,只要輸入字母超過一定個數(在我的Mac上是3個),spotlight就閃退了。 谷歌搜索得到大部分解決方案是在系統自帶詞典的偏好設置里取消外部字典的勾選(如https://placeless.net/2017/09/28/spotligh ...
  • 本文內容參考《kuberneters進階實戰》/馬哥的新書/推薦 部署前的準備 主機名稱解析 分散式系統環境中的多主機通信通常基於主機名稱進行,這在IP地址存在變化的可能性時為主機提供了固定的訪問入口,因此一般需要有專用的DNS服務負責解決各節點主機名。不過,考慮到此處部署的是測試集群,因此為了降低 ...
  • 今天需要再服務上部署一個.net 方面的項目;當時開啟服務的命令只能在前臺執行;使用nohub CMD &等放在後臺開啟服務都會宕機;所以搜尋了Supervisor 這個解決辦法,為服務創建守護進程。具體操作如下 1、什麼是守護進程 本篇的創建守護進程,是指發佈在Linux上 asp.net cor ...
  • 原文鏈接:http://www.oschina.net/translate/20-advanced-commands-for-middle-level-linux-users?from=20130811 ...
  • iostat(1)是在Linux系統上查看I/O性能最基本的工具,然而對於那些熟悉其它UNIX系統的人來說它是很容易被誤讀的。比如在HP-UX上 avserv(相當於Linux上的 svctm)是最重要的I/O指標,反映了硬碟設備的性能,它是指I/O請求從SCSI層發出、到I/O完成之後返回SCSI ...
  • 內核很多重要子系統均通過proc文件的方式,將自身的一些統計信息輸出,方便最終用戶查看各子系統的運行狀態,這些統計信息被稱為metrics。 直接查看metrics並不能獲取到有用的信息,一般都是由特定的應用程式(htop/sar/iostat等)每隔一段時間讀取相關metrics,併進行相應計算, ...
  • 狂神聲明 : 文章均為自己的學習筆記 , 轉載一定註明出處 ; 編輯不易 , 防君子不防小人~共勉 ! linux學習:【第1篇】初識Linux及安裝 寫在前面 學習之初看了一段文章,很有感觸,所以也想把這些分享給大家,認真讀完,明確自己的方向 很多同學接觸Linux不多,對Linux平臺的開發更是 ...
  • 執行如下命令: 儘量按以下順序執行,否則可能會發生意向不到的問題(坑) 1.更新數據源 2.更新安裝包 3.安裝lxde桌面 4.安裝xrdp 5.開放伺服器3389埠 6.Windows遠程桌面連接,輸入root賬號密碼即可連接: 7.進入lxde安裝語言包 8.安裝完後重啟系統或者直接在命令行 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...