K8S(Kubernetes)學習筆記

 

Kubernetes(k8s)google提供的開源的容器集羣管理系統,在Docker技術的基礎上,爲容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提升了大規模容器集羣管理的便捷性。node

Rancher是一個開源的企業級容器管理平臺redis

  • k8s整體架構
  • 基本概念
    • Node
    • Pod
    • service
    • Replication Controller
    • Label 
    • Volume(存儲卷) 
    • Namespace(命名空間)
  • 流程

 

k8s整體架構

Kubernetes將集羣機器劃分爲一個Master節點和一羣工做節點(Node)。其中,Master節點上運行着集羣管理相關的一組進程etcd、API Server、Controller Manager、Scheduler,後三個組件構成了Kubernetes的總控中心,這些進程實現了整個集羣的資源管理、Pod調度、彈性伸縮、安全控制、系統監控和糾錯等管理功能,而且全都是自動完成。後端

在每一個Node上運行Kubelet、Proxy、Docker daemon三個組件,負責對本節點上的Pod的生命週期進行管理,以及實現服務代理的功能。api

Kubernetes集羣

 1.master節點緩存

包含Etcd存儲服務(可選)、Api Server進程、Controller Manager服務進程及Scheduler服務進程。安全

其中,Api Server進程是管理全部資源的增、刪、改、查等操做的惟一入口,Controller ManagerKubernetes全部資源對象的自動化控制中心;Kubernetes Schedule是負責資源調度(Pod調度)的進程。服務器

master節點關聯工做節點。網絡

 2.一羣工做節點,運行真正的應用程序,Node是Kubernetes集羣架構中運行Pod的服務節點,用來承載pod的運行,是pod運行的宿主機。架構

工做node關聯Master管理節點,擁有名稱和IP、系統資源信息。app

  • kubelet:負責本Node節點上的Pod的建立、修改、監控、刪除等全生命週期管理,同時Kubelet定時「上報」本Node的狀態信息到API Server裏。
  • kube-proxy:實現Kubernetes Service的通訊與負載均衡機制的重要組件
  • Docker Engine(Docker):Docker引擎,負責本機容器的建立和管理工做

基本概念

Node

 Node是集羣的工做負載節點,默認狀況kubelet會向Master註冊本身,一旦Node被歸入集羣管理範圍,kubelet會定時向Master彙報自身的情報,包括操做系統,Docker版本,機器資源狀況等。

若是Node超過指定時間不上報信息,會被Master判斷爲「失聯」,標記爲Not Ready,隨後Master會觸發Pod轉移。

Node中有一個或多個的pod,是pod運行的宿主機,pod是node中Kubernetes管理的最小運行單元。

查詢pod的命令:kubectl get nodes

Pod

 Pod是Kubernetes最基本的操做單元,包含一個或多個緊密相關的容器,每一個Pod中有個根容器(Pause容器),Pause容器的狀態表明整個容器組的狀態,其餘業務容器共享Pause的IP,即Pod IP,共享Pause掛載的Volume,這樣簡化了同個Pod中不一樣容器之間的網絡問題和文件共享問題。


Kubernetes集羣中,同宿主機的或不一樣宿主機的Pod之間要求可以TCP/IP直接通訊,所以採用虛擬二層網絡技術來實現,例如Flannel,Openvswitch(OVS)等,這樣在同個集羣中,不一樣的宿主機的Pod IP爲不一樣IP段的IP,集羣中的全部Pod IP都是惟一的,不一樣Pod之間能夠直接通訊。
Pod有兩種類型:普通Pod和靜態Pod。靜態Pod即不經過K8S調度和建立,直接在某個具體的Node機器上經過具體的文件來啓動。普通Pod則是由K8S建立、調度,同時數據存放在ETCD中。
Pod IP和具體的容器端口(ContainnerPort)組成一個具體的通訊地址,即Endpoint。一個Pod中能夠存在多個容器,能夠有多個端口,Pod IP同樣,即有多個Endpoint。
Pod Volume是定義在Pod之上,被各個容器掛載到本身的文件系統中,能夠用分佈式文件系統實現後端存儲功能。
Pod中的Event事件能夠用來排查問題,能夠經過kubectl describe pod xxx 來查看對應的事件。
每一個Pod能夠對其能使用的服務器上的計算資源設置限額,通常爲CPU和Memory。K8S中通常將千分之一個的CPU配置做爲最小單位,用m表示,是一個絕對值,即100m對於一個Core的機器仍是48個Core的機器都是同樣的大小。Memory配額也是個絕對值,單位爲內存字節數。
資源配額的兩個參數
Requests:該資源的最小申請量,系統必須知足要求。
Limits:該資源最大容許使用量,當超過該量,K8S會kill並重啓Pod。

 

service

Kubernetes中,Service是分佈式集羣架構的核心,一個Service對象擁有以下關鍵特徵:

  • 擁有一個惟一指定的名字
  • 擁有一個虛擬IP(Cluster IP、Service IP、或VIP)和端口號
  • 可以體統某種遠程服務能力
  • 被映射到了提供這種服務能力的一組容器應用上

一個Service能夠看做一組提供相同服務的Pod的對外訪問接口,Service做用於哪些Pod是經過Label Selector來定義的。RC保證Service的Pod副本實例數目保持預期水平。

Replication Controller

Replication Controller是實現彈性伸縮、動態擴容和滾動升級的核心。

在建立好RC後,Kubernetes會經過RC中定義的的Label篩選出對應Pod實例並實時監控其狀態和數量,若是實例數量少於定義的副本數量,則會根據RC中定義的Pod模板來建立一個新的Pod,而後將新Pod調度到合適的Node上啓動運行,直到Pod實例的數量達到預約目標,這個過程徹底是自動化。

RC(Replication Controller)

  • 用於建立Pod的模板(template)
  • Pod指望的副本數(replicas)
  • 用於篩選目標Pod的Label Selector

RC特性說明:

Pod的縮放能夠經過如下命令實現:kubectl scale rc redis-slave --replicas=3
刪除RC並不會刪除該RC建立的Pod,能夠將副本數設置爲0,便可刪除對應Pod。或者經過kubectl stop /delete命令來一次性刪除RC和其建立的Pod。
改變RC中Pod模板的鏡像版本能夠實現滾動升級(Rolling Update)。

Label 

以key/value的形式附加到各類對象上,如Pod、Service、RC、Node等,以識別這些對象,管理關聯關係等。

Label和資源對象是多對多的關係,即一個Label能夠被添加到多個對象上,一個對象也能夠定義多個Label。

Label的做用主要用來實現精細的、多維度的資源分組管理,以便進行資源分配,調度,配置,部署等工做。
k8s經過Label Selector(標籤選擇器)來篩選指定Label的資源對象,相似SQL語句中的條件查詢(WHERE語句)。

使用場景:

kube-controller進程經過資源對象RC上定義的Label Selector來篩選要監控的Pod副本數,從而實現副本數始終保持預期數目。
kube-proxy進程經過Service的Label Selector來選擇對應Pod,自動創建每一個Service到對應Pod的請求轉發路由表,從而實現Service的智能負載均衡機制。
kube-scheduler實現Pod定向調度:對Node定義特定的Label,而且在Pod定義文件中使用NodeSelector標籤調度策略。

Volume(存儲卷) 

 Volume是Pod中可以被多個容器訪問的共享目錄,可讓容器的數據寫到宿主機上或者寫文件到網絡存儲中

 Volume的使用方式:先在Pod上聲明一個Volume,而後被一個Pod中的多個容器Mount到具體的文件目錄下。

k8s的Volume與Pod生命週期相關,而與容器的生命週期無關,即容器掛掉,數據不會丟失,可是Pod掛掉,數據則會丟失。

Namespace(命名空間)

kubernetes系統經過將系統內部的對象「分配」到不一樣的Namespace中,造成邏輯上分組的不一樣項目、小組或用戶組,便於不一樣的分組在共享使用整個集羣的資源的同時還能被分別管理。

Kubernetes集羣在啓動後,會建立一個名爲「default」的Namespace,若是不特別指明Namespace,則用戶建立的Pod、RC、Service都被系統建立到「default」的Namespace中。

經過使用Namespace來組織k8s的各類對象,能夠實現對用戶的分組,即「多租戶」管理。對不一樣的租戶還能夠進行單獨的資源配額設置和管理,使得整個集羣的資源配置很是靈活、方便。

查詢命名空間:kubectl get namespaces

查詢命名空間中的POD:kubectl get pods 或者 kubectl get pods --namespace=development

流程

        經過Kubectl(k8s中的命令行工具)提交一個建立RC的請求,該請求經過API Server被寫入etcd中,此時Controller Manager經過API Server的監聽資源變化的接口監聽到這個RC事件,分析以後,發現當前集羣中尚未它所對應的Pod實例,因而根據RC裏的Pod模板定義生成一個Pod對象,經過API Server寫入etcd,接下來,此事件被Scheduler發現,它當即執行一個複雜的調度流程,爲這個新Pod選定一個落戶的Node,而後經過API Server講這一結果寫入到etcd中,隨後,目標Node上運行的Kubelet進程經過API Server監測到這個「新生的」Pod,並按照它的定義,啓動該Pod並不辭辛苦地負責它的下半生,直到Pod的生命結束。

        隨後,咱們經過Kubectl提交一個新的映射到該Pod的Service的建立請求,Controller Manager會經過Label標籤查詢到相關聯的Pod實例,而後生成Service的Endpoints信息,並經過API Server寫入到etcd中,接下來,全部Node上運行的Proxy進程經過API Server查詢並監聽Service對象與其對應的Endpoints信息,創建一個軟件方式的負載均衡器來實現Service訪問到後端Pod的流量轉發功能。

  • etcd 
    用於持久化存儲集羣中全部的資源對象,如Node、Service、Pod、RC、Namespace等;API Server提供了操做etcd的封裝接口API,這些API基本上都是集羣中資源對象的增刪改查及監聽資源變化的接口。

  • API Server 
    提供了資源對象的惟一操做入口,其餘全部組件都必須經過它提供的API來操做資源數據,經過對相關的資源數據「全量查詢」+「變化監聽」,這些組件能夠很「實時」地完成相關的業務功能。

  • Controller Manager 
    集羣內部的管理控制中心,其主要目的是實現Kubernetes集羣的故障檢測和恢復的自動化工做,好比根據RC的定義完成Pod的複製或移除,以確保Pod實例數符合RC副本的定義;根據Service與Pod的管理關係,完成服務的Endpoints對象的建立和更新;其餘諸如Node的發現、管理和狀態監控、死亡容器所佔磁盤空間及本地緩存的鏡像文件的清理等工做也是由Controller Manager完成的。

  • Scheduler 
    集羣中的調度器,負責Pod在集羣節點中的調度分配。

  • Kubelet 
    負責本Node節點上的Pod的建立、修改、監控、刪除等全生命週期管理,同時Kubelet定時「上報」本Node的狀態信息到API Server裏。

  • Proxy 
    實現了Service的代理與軟件模式的負載均衡器。

參考文檔:

https://blog.csdn.net/huwh_/article/details/77017281

相關文章
相關標籤/搜索