Kubernetes(K8S)


一、簡介

  Kubernetes是Google公司在2014年6月開源的一個容器集群管理系統,使用Go語言開發,也叫K8S。Kubernetes的目標是讓部署容器化的應用簡單並且高效,Kubernetes提供了應用部署,規划,更新,維護的一種機制。Kubernetes一個核心的特點就是能夠自主的管理容器來保證雲平台中的容器按照用戶的期望狀態運行着(比如用戶想讓apache一直運行,用戶不需要關心怎么去做,Kubernetes會自動去監控,然后去重啟,新建,總之,讓apache一直提供服務),管理員可以加載一個微型服務,讓規划器來找到合適的位置,同時,Kubernetes也系統提升工具以及人性化方面,讓用戶能夠方便的部署自己的應用。

 Kubernetes特點:

  • 可移植: 支持公有雲,私有雲,混合雲,多重雲(multi-cloud)
  • 可擴展: 模塊化, 插件化, 可掛載, 可組合
  • 自愈: 自動布置,自動重啟,自動復制,自動擴展

二、基本對象概念

  (1)Pod

  Pod是Kubernetes中最小部署單元,所有的容器均在Pod中運行,一個Pod可以承載一個或者多個相關的容器。Pod中容器共享存儲和網絡,同一個Pod中的容器會部署在同一個docker宿主機上並且能夠共享資源。

  (2)Service

  Service是一個應用服務抽象,定義了Pod邏輯集合和訪問這個pod集合的策略(比如訪問策略)。Service代理Pod集合對外表現為一個訪問入口,分配一個機器IP地址,來自這個IP的請求將負載均衡轉發到后端Pod中的容器。Service通過Lable Selector選擇一組Pod提供服務。

  (3)Volume

  數據卷

  • 可以用來共享Pod容器中使用的數據
  • 持久化數據

  (4)Namespace

  是kubernetes系統中的另一個重要的概念,通過將系統內部的對象“分配”到不同的Namespace中,形成邏輯上分組的不同項目、小組或用戶組,便於不同的分組在共享使用整個集群的資源的同時還能被分別管理。Kubernetes集群在啟動后,會創建一個名為“default”的Namespace,如果不特別指明Namespace,則用戶創建的Pod、RC、Service都被系統創建到“default”的Namespace中。

  (5)Label

  Label機制是K8S中一個重要設計,通過Label進行對象弱關聯,靈活地分類和選擇不同服務或業務,讓用戶根據自己特定的組織結構以松耦合方式進行服務部署。Label是一對KV,對用戶而言非常有意義的,但對K8S本身而言沒有直接意義的。Label可以在創建對象時指定,也可以在后期修改,每個對象可以擁有多個標簽,但key值必須是唯一的。

  (6)RC(Replication Controller)

  Replication Controller確保任何時候Kubernetes集群中有指定數量的pod副本(replicas)在運行, 如果少於指定數量的pod副本(replicas),Replication Controller會啟動新的Container,反之會殺死多余的以保證數量不變。Replication Controller使用預先定義的pod模板創建pods,一旦創建成功,pod 模板和創建的pods沒有任何關聯,可以修改pod 模板而不會對已創建pods有任何影響,也可以直接更新通過Replication Controller創建的pods。對於利用pod 模板創建的pods,Replication Controller根據label selector來關聯,通過修改pods的label可以刪除對應的pods。

  (7)Deployment

  Kubernetes Deployment提供了官方的用於更新Pod和Replica Set(下一代的Replication Controller)的方法,您可以在Deployment對象中只描述您所期望的理想狀態(預期的運行狀態),Deployment控制器為您將現在的實際狀態轉換成您期望的狀態,例如,您想將所有的webapp:v1.0.9升級成webapp:v1.1.0,您只需創建一個Deployment,Kubernetes會按照Deployment自動進行升級。現在,您可以通過Deployment來創建新的資源(pod,rs,rc),替換已經存在的資源等。

  Deployment集成了上線部署、滾動升級、創建副本、暫停上線任務,恢復上線任務,回滾到以前某一版本(成功/穩定)的Deployment等功能,在某種程度上,Deployment可以幫我們實現無人值守的上線,大大降低我們的上線過程的復雜溝通、操作風險。

  (8)StatefulSet

  使用Deployment創建的Pod是無狀態的,當掛在Volume之后,如果該Pod掛了,Replication Controller會再run一個來保證可用性,但是由於是無狀態的,Pod掛了的時候與之前的Volume的關系就已經斷開了,新起來的Pod無法找到之前volume。StatefulSet 的目的就是給為數眾多的有狀態負載提供正確的控制器支持。

  當應用有以下任意要求時,StatefulSet的價值就體現出來了。 
   ● 穩定的、唯一的網絡標識。 
   ● 穩定的、持久化的存儲。 
   ● 有序的、優雅的部署和擴展。 
   ● 有序的、優雅的刪除和停止。 

  (9)DaemonSet

  DaemonSet能夠讓所有(或者一些特定)的Node節點運行同一個pod。當節點加入到kubernetes集群中,pod會被(DaemonSet)調度到該節點上運行,當節點從kubernetes集群中被移除,被(DaemonSet)調度的pod會被移除,如果刪除DaemonSet,所有跟這個DaemonSet相關的pods都會被刪除。

  (10)Job

  在有些場景下,是想要運行一些容器執行某種特定的任務,任務一旦執行完成,容器也就沒有存在的必要了。在這種場景下,創建pod就顯得不那么合適。於是就是了Job,Job指的就是那些一次性任務。通過Job運行一個容器,當其任務執行完以后,就自動退出,集群也不再重新將其喚醒。還可以執行定時任務。

三、主要功能 

1.數據卷
   Pod中的容器之間共享數據或者持久化數據,可以使用數據卷。

2.應用程序健康檢查
   容器內服務可能進程堵塞無法處理請求,可以設置監控健康檢查策略保證應用的健壯性。(默認情況下只保證容器本身正常,不會對應該程序狀態檢測)

3.復制應用程序實例
   控制器維護Pod副本的數量,保證一個Pod或一組同類的Pod數量始終可用。

4.彈性伸縮
   根據設定的指標(CPU利用率)自動縮放Pod副本數。

5.服務發現
   使用環境變量或DNS服務插件保證容器中程序發現Pod入口的訪問地址。

6.復制均衡
   一組Pod副本分配一個使用的機器IP地址,負載均衡轉發請求到后端容器。在集群內部其他Pod可以通過這個ClusterIP訪問應用。

7.滾動更新
   更新服務不中斷,一次更新一個Pod,而不是同時刪除整個服務

8.服務編排
   通過文件描述部署服務,使得應用程序部署變得更有效。

9.資源監控
   Node節點組件集成cAdvisor資源收集工具,可以通過Heapster匯總整個集群節點資源數據,然后存儲到IfluxDB時序數據庫中,再由Grafana展示。

10.提供認證和授權
   支持屬性訪問控制(ABAC)、角色訪問控制(RBAC)認證授權策略 

 

四、系統架構和組件功能

  

  4.1組件和功能

   Kubernetes集群包括Kubernetes節點(Node )和Kubernetes服務(master node)兩種角色,代理角色的組件包括Kube-proxy 和Kubelet,它們同時部署在一個節點上,這個節點也就是代理節點。服務角色的組件包括kube-apiserver,kube-scheduler,kube-controller-manager。

  Master組件:

  • apiserver:作為kubernetes系統的入口,封裝了核心對象的增刪改查操作,以RESTFul接口方式提供給外部客戶和內部組件調用。它維護的REST對象將持久化到etcd(一個分布式強一致性的key/value存儲)。
  • scheduler:負責集群的資源調度,為新建的pod分配機器。這部分工作分出來變成一個組件,意味着可以很方便地替換成其他的調度器。
  • controller-manager:負責執行各種控制器,目前有兩類:
  • endpoint-controller:定期關聯service和pod(關聯信息由endpoint對象維護),保證service到pod的映射總是最新的。
    replication-controller:定期關聯replicationController和pod,保證replicationController定義的復制數量與實際運行pod的數量總是一致的。

   Node組件: 

  • kubelet:負責管控docker容器,如啟動/停止、監控運行狀態等。它會定期從etcd獲取分配到本機的pod,並根據pod信息啟動或停止相應的容器。同時,它也會接收apiserver的HTTP請求,匯報pod的運行狀態。
  • proxy:負責為pod提供代理。它會定期從etcd獲取所有的service,並根據service信息創建代理。當某個客戶pod要訪問其他pod時,訪問請求會經過本機proxy做轉發。
  • docker或rocket/rkt:運行容器

  4.2工作流程

  1.Kubectl(user commands): k8s APIs客戶端工具,通過用戶輸入命令操作APIs資源

  2.認證,用戶輸入命令要通過APIs的認證

  3.認證通過之后,交由APIs中REST中對象處理(Kubernetes以RESTFul形式開放接口,用戶可操作的REST對象有三個Pod,service,controller)

  4.APIs中的操作處理都會持久化存儲到一個分布式存儲etcd

  5.Scheduler調度組件,會檢測REST對象中是否有新的動作產生,並將具體操作,根據算法下發到node節點中

  6.Controller通過API Server提供的接口實時監控整個集群的每個資源對象的當前狀態,當發生各種故障導致系統狀態發生變化時,會嘗試將系統狀態修復到“期望狀態”

  7.kubeletl類似於一個agent,處理AIPs下發的任務,如創建Pod、容器、獲取節點信息等

  8.proxy負責網絡代理,Service具體實現就是有proxy處理,維護網絡規則和四層負載均衡工作


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM