[轉]k8s核心概念

轉載自 http://www.javashuo.com/article/p-agixkvog-hs.htmlphp

什麼是kubernetes

  • 首先,他是一個全新的基於容器技術的分佈式架構領先方案。Kubernetes(k8s)是Google開源的容器集羣管理系統(谷歌內部:Borg)。在Docker技術的基礎上,爲容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提升了大規模容器集羣管理的便捷性。
  • Kubernetes是一個完備的分佈式系統支撐平臺,具備完備的集羣管理能力,多擴多層次的安全防禦和准入機制、多租戶應用支撐能力、透明的服務註冊和發現機制、內建智能負載均衡器、強大的故障發現和自我修復能力、服務滾動升級和在線擴容能力、可擴展的資源自動調度機制以及多粒度的資源配額管理能力。同時Kubernetes提供完善的管理工具,涵蓋了包括開發、部署測試、運維監控在內的各個環節。

Kubernetes自己有如下主件組成

  • etcd: 高可用存儲共享配置和服務發現,做爲與minion機器上的flannel配套使用,做用是使每臺 minion上運行的docker擁有不一樣的ip段,最終目的是使不一樣minion上正在運行的docker containner都有一個與別的任意一個containner(別的minion上運行的docker containner)不同的IP地址。
  • flannel: 網絡結構支持
  • kube-apiserver: 不論經過kubectl仍是使用remote api 直接控制,都要通過apiserver
  • kube-controller-manager: 對replication controller, endpoints controller, namespace controller, and serviceaccounts controller的循環控制,與kube-apiserver交互,保證這些controller工做
  • kube-scheduler: Kubernetes scheduler的做用就是根據特定的調度算法將pod調度到指定的工做節點(minion)上,這一過程也叫綁定(bind)
  • kubelet: Kubelet運行在Kubernetes Minion Node上. 它是container agent的邏輯繼任者
  • kube-proxy: kube-proxy是kubernetes 裏運行在minion節點上的一個組件, 它起的做用是一個服務代理的角色

Kubernetes架構和組件

  • 服務分組,小集羣,多集羣
  • 服務分組,大集羣,單集羣

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

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

Service:

Service的服務進程目前都是基於Socket通訊方式對外提供服務,好比Redis、Memcache、MySQL、Web Server,或者是實現了某個具體業務的一個特定的TCP Server進程,雖然一個Service一般由多個相關的服務進程來提供服務,每一個服務進程都有一個獨立的Endpoint(IP+Port)訪問點,但Kubernetes可以讓咱們經過服務鏈接到指定的Service上。有了Kubernetes內奸的透明負載均衡和故障恢復機制,無論後端有多少服務進程,也無論某個服務進程是否會因爲發生故障而從新部署到其餘機器,都不會影響咱們隊服務的正常調用,更重要的是這個Service自己一旦建立就不會發生變化,意味着在Kubernetes集羣中,咱們不用爲了服務的IP地址的變化問題而頭疼了。node

Pod:

容器提供了強大的隔離功能,全部有必要把爲Service提供服務的這組進程放入容器中進行隔離。爲此,Kubernetes設計了Pod對象,將每一個服務進程包裝到相對應的Pod中,使其成爲Pod中運行的一個容器。爲了創建Service與Pod間的關聯管理,Kubernetes給每一個Pod貼上一個標籤Label,好比運行MySQL的Pod貼上name=mysql標籤,給運行PHP的Pod貼上name=php標籤,而後給相應的Service定義標籤選擇器Label Selector,這樣就能巧妙的解決了Service於Pod的關聯問題。mysql

服務:

在集羣管理方面,Kubernetes將集羣中的機器劃分爲一個Master節點和一羣工做節點Node,其中,在Master節點運行着集羣管理相關的一組進程kube-apiserver、kube-controller-manager和kube-scheduler,這些進程實現了整個集羣的資源管理、Pod調度、彈性伸縮、安全控制、系統監控和糾錯等管理能力,而且都是全自動完成的。Node做爲集羣中的工做節點,運行真正的應用程序,在Node上Kubernetes管理的最小運行單元是Pod。Node上運行着Kubernetes的kubelet、kube-proxy服務進程,這些服務進程負責Pod的建立、啓動、監控、重啓、銷燬以及實現軟件模式的負載均衡器。算法

Replication Controller

在Kubernetes集羣中,它解決了傳統IT系統中服務擴容和升級的兩大難題。你只需爲須要擴容的Service關聯的Pod建立一個Replication Controller簡稱(RC),則該Service的擴容及後續的升級等問題將迎刃而解。在一個RC定義文件中包括如下3個關鍵信息。sql

  • 目標Pod的定義
  • 目標Pod須要運行的副本數量(Replicas)
  • 要監控的目標Pod標籤(Label)

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

 Kubernetes優點:編程

    - 容器編排後端

    - 輕量級api

    - 開源安全

    - 彈性伸縮

    - 負載均衡

Kubernetes的核心概念

1.Master

  k8s集羣的管理節點,負責管理集羣,提供集羣的資源數據訪問入口。擁有Etcd存儲服務(可選),運行Api Server進程,Controller Manager服務進程及Scheduler服務進程,關聯工做節點Node。Kubernetes API server提供HTTP Rest接口的關鍵服務進程,是Kubernetes裏全部資源的增、刪、改、查等操做的惟一入口。也是集羣控制的入口進程;Kubernetes Controller Manager是Kubernetes全部資源對象的自動化控制中心;Kubernetes Schedule是負責資源調度(Pod調度)的進程

2.Node

  Node是Kubernetes集羣架構中運行Pod的服務節點(亦叫agent或minion)。Node是Kubernetes集羣操做的單元,用來承載被分配Pod的運行,是Pod運行的宿主機。關聯Master管理節點,擁有名稱和IP、系統資源信息。運行docker eninge服務,守護進程kunelet及負載均衡器kube-proxy.

  • 每一個Node節點都運行着如下一組關鍵進程
  • kubelet:負責對Pod對於的容器的建立、啓停等任務
  • kube-proxy:實現Kubernetes Service的通訊與負載均衡機制的重要組件
  • Docker Engine(Docker):Docker引擎,負責本機容器的建立和管理工做

  Node節點能夠在運行期間動態增長到Kubernetes集羣中,默認狀況下,kubelet會想master註冊本身,這也是Kubernetes推薦的Node管理方式,kubelet進程會定時向Master彙報自身情報,如操做系統、Docker版本、CPU和內存,以及有哪些Pod在運行等等,這樣Master能夠獲知每一個Node節點的資源使用狀況,冰實現高效均衡的資源調度策略。、

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從新調度到其餘節點上。

4.Replication Controller

  Replication Controller用來管理Pod的副本,保證集羣中存在指定數量的Pod副本。集羣中副本的數量大於指定數量,則會中止指定數量以外的多餘容器數量,反之,則會啓動少於指定數量個數的容器,保證數量不變。Replication Controller是實現彈性伸縮、動態擴容和滾動升級的核心。

5.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僅僅做用於Kubernetes Service這個對象,並由Kubernetes管理和分配P地址
  • Cluster IP沒法被ping,他沒有一個"實體網絡對象"來響應
  • Cluster IP只能結合Service Port組成一個具體的通訊端口,單獨的Cluster IP不具有通訊的基礎,而且他們屬於Kubernetes集羣這樣一個封閉的空間。

Kubernetes集羣以內,Node IP網、Pod IP網於Cluster IP網之間的通訊,採用的是Kubernetes本身設計的一種編程方式的特殊路由規則。

6.Label

 Kubernetes中的任意API對象都是經過Label進行標識,Label的實質是一系列的Key/Value鍵值對,其中key於value由用戶本身指定。Label能夠附加在各類資源對象上,如Node、Pod、Service、RC等,一個資源對象能夠定義任意數量的Label,同一個Label也能夠被添加到任意數量的資源對象上去。Label是Replication Controller和Service運行的基礎,兩者經過Label來進行關聯Node上運行的Pod。
咱們能夠經過給指定的資源對象捆綁一個或者多個不一樣的Label來實現多維度的資源分組管理功能,以便於靈活、方便的進行資源分配、調度、配置等管理工做。
一些經常使用的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 Selector在Kubernetes中重要使用場景以下:
- kube-Controller進程經過資源對象RC上定義Label Selector來篩選要監控的Pod副本的數量,從而實現副本數量始終符合預期設定的全自動控制流程
- kube-proxy進程經過Service的Label Selector來選擇對應的Pod,自動創建起每一個Service島對應Pod的請求轉發路由表,從而實現Service的智能負載均衡
- 經過對某些Node定義特定的Label,而且在Pod定義文件中使用Nodeselector這種標籤調度策略,kuber-scheduler進程能夠實現Pod"定向調度"的特性

Kubernetes 組件:

Kubernetes Master控制組件,調度管理整個系統(集羣),包含以下組件:

  • 1.Kubernetes API Server
        做爲Kubernetes系統的入口,其封裝了核心對象的增刪改查操做,以RESTful API接口方式提供給外部客戶和內部組件調用。維護的REST對象持久化到Etcd中存儲。
  • 2.Kubernetes Scheduler
        爲新創建的Pod進行節點(node)選擇(即分配機器),負責集羣的資源調度。組件抽離,能夠方便替換成其餘調度器。
  • 3.Kubernetes Controller
        負責執行各類控制器,目前已經提供了不少控制器來保證Kubernetes的正常運行。
  • 4.Replication Controller
        管理維護Replication Controller,關聯Replication Controller和Pod,保證Replication Controller定義的副本數量與實際運行Pod數量一致。
  • 5.Node Controller
        管理維護Node,按期檢查Node的健康狀態,標識出(失效|未失效)的Node節點。
  • 6.Namespace Controller
        管理維護Namespace,按期清理無效的Namespace,包括Namesapce下的API對象,好比Pod、Service等。
  • 7.Service Controller
        管理維護Service,提供負載以及服務代理。
  • 8.EndPoints Controller
        管理維護Endpoints,關聯Service和Pod,建立Endpoints爲Service的後端,當Pod發生變化時,實時更新Endpoints。
  • 9.Service Account Controller
        管理維護Service Account,爲每一個Namespace建立默認的Service Account,同時爲Service Account建立Service Account Secret。
  • 10.Persistent Volume Controller
        管理維護Persistent Volume和Persistent Volume Claim,爲新的Persistent Volume Claim分配Persistent Volume進行綁定,爲釋放的Persistent Volume執行清理回收。
  • 11.Daemon Set Controller
        管理維護Daemon Set,負責建立Daemon Pod,保證指定的Node上正常的運行Daemon Pod。
  • 12.Deployment Controller
        管理維護Deployment,關聯Deployment和Replication Controller,保證運行指定數量的Pod。當Deployment更新時,控制實現Replication Controller和 Pod的更新。
  • 13.Job Controller
        管理維護Job,爲Jod建立一次性任務Pod,保證完成Job指定完成的任務數目
  • 14.Pod Autoscaler Controller
        實現Pod的自動伸縮,定時獲取監控數據,進行策略匹配,當知足條件時執行Pod的伸縮動做。

Kubernetes Node運行節點,運行管理業務容器,包含以下組件:

  • 1.Kubelet
        負責管控容器,Kubelet會從Kubernetes API Server接收Pod的建立請求,啓動和中止容器,監控容器運行狀態並彙報給Kubernetes API Server。
  • 2.Kubernetes Proxy
        負責爲Pod建立代理服務,Kubernetes Proxy會從Kubernetes API Server獲取全部的Service信息,並根據Service的信息建立代理服務,實現Service到Pod的請求路由和轉發,從而實現Kubernetes層級的虛擬轉發網絡。
  • 3.Docker     Node上須要運行容器服務
相關文章
相關標籤/搜索