容器技術研究-Kubernetes基本概念

最近在研究容器技術,做爲入門,基本概念必須搞明白,今天整理一下Kubernetes的基本概念。前端

1、什麼是Kubernetes服務器

Kubernetes(k8s)是自動化容器操做的開源平臺,這些操做包括部署,調度和節點集羣間擴展。若是你曾經用過Docker容器技術部署容器,那麼能夠將Docker當作Kubernetes內部使用的低級別組件。Kubernetes不只僅支持Docker,還支持Rocket,這是另外一種容器技術。
使用Kubernetes能夠:網絡

  • 自動化容器的部署和複製
  • 隨時擴展或收縮容器規模
  • 將容器組織成組,而且提供容器間的負載均衡
  • 很容易地升級應用程序容器的新版本
  • 提供容器彈性,若是容器失效就替換它,等等...

實際上,使用Kubernetes只需一個部署文件(yaml),使用一條命令就能夠部署多層容器(前端,後臺等)的完整集羣:架構

$ kubectl create -f single-config-file.yaml 

 注: kubectl是和Kubernetes API交互的命令行程序.app

2、Kubernetes核心概念負載均衡

1. 集羣frontend

  集羣是一組節點,這些節點能夠是物理服務器或者虛擬機,之上安裝了Kubernetes平臺。下圖展現這樣的集羣。注意該圖爲了強調核心概念有所簡化。如下是一個典型的Kubernetes架構圖。動畫

  

  上圖能夠看到以下組件,使用特別的圖標表示Service和Label:spa

  • Pod
  • Container(容器)
  • Label(label)(標籤)
  • Replication Controller(複製控制器)
  • Service(服務)
  • Node(節點)
  • Kubernetes Master(Kubernetes主節點)

 2. Pod命令行

Pod(上圖綠色方框)安排在節點上,包含一組容器和卷
同一個Pod裏的容器共享同一個網絡命名空間,可使用localhost互相通訊。
Pod是短暫的,不是持續性實體。

咱們可能會有如下這些問題:
若是Pod是短暫的,那麼我怎麼才能持久化容器數據使其可以跨重啓而存在呢? 是的,Kubernetes支持卷的概念,所以能夠使用持久化的卷類型
是否手動建立Pod,若是想要建立同一個容器的多份拷貝,須要一個個分別建立出來麼?能夠手動建立單個Pod,可是也可使用Replication Controller使用Pod模板建立出多份拷貝。
若是Pod是短暫的,那麼重啓時IP地址可能會改變,那麼怎麼才能從前端容器正確可靠地指向後臺容器呢?這時可使用Service。

 3. Label標籤

一些Pod有Label。
一個Label是attach到Pod的一對鍵/值對,用來傳遞用戶定義的屬性。好比,你可能建立了一個"tier"和「app」標籤,
經過Label(tier=frontend, app=myapp)來標記前端Pod容器,
使用Label(tier=backend, app=myapp)標記後臺Pod。
而後可使用Selectors選擇帶有特定Label的Pod,而且將Service或者Replication Controller應用到上面。

 4. Replication Controller      

是否手動建立Pod,若是想要建立同一個容器的多份拷貝,須要一個個分別建立出來麼,可否將Pods劃到邏輯組裏?
Replication Controller確保任意時間都有指定數量的Pod「副本」在運行。若是爲某個Pod建立了Replication Controller而且指定3個副本,它會建立3個Pod,而且持續監控它們。若是某個Pod不響應,那麼Replication Controller會替換它,保持總數爲3.

若是以前不響應的Pod恢復了,如今就有4個Pod了,那麼Replication Controller會將其中一個終止保持總數爲3。若是在運行中將副本總數改成5,Replication Controller會馬上啓動2個新Pod,保證總數爲5。還能夠按照這樣的方式縮小Pod,這個特性在執行滾動升級時頗有用。當建立Replication Controller時,須要指定兩個東西:

  •   Pod模板:用來建立Pod副本的模板
  •   Label:Replication Controller須要監控的Pod的標籤

 5. Service

若是Pods是短暫的,那麼重啓時IP地址可能會改變,怎麼才能從前端容器正確可靠地指向後臺容器呢??
Service是定義一系列Pod以及訪問這些Pod的策略的一層抽象
Service經過Label找到Pod組。由於Service是抽象的,因此在圖表裏一般看不到它們的存在,這也就讓這一律念更難以理解。

如今,假定有2個後臺Pod,而且定義後臺Service的名稱爲‘backend-service’,lable選擇器爲(tier=backend, app=myapp)。backend-service 的Service會完成以下兩件重要的事情:
會爲Service建立一個本地集羣的DNS入口,所以前端Pod只須要DNS查找主機名爲 ‘backend-service’,就可以解析出前端應用程序可用的IP地址。
如今前端已經獲得了後臺服務的IP地址,可是它應該訪問2個後臺Pod的哪個呢?
Service在這2個後臺Pod之間提供透明的負載均衡,會將請求分發給其中的任意一個。經過每一個Node上運行的代理(kube-proxy)完成。

       下述動畫展現了Service的功能。注意該圖做了不少簡化。若是不進入網絡配置,那麼達到透明的負載均衡目標所涉及的底層網絡和路由相對先進。

      

     注:有一個特別類型的Kubernetes Service,稱爲'LoadBalancer',做爲外部負載均衡器使用,在必定數量的Pod之間均衡流量。好比,對於負載均衡Web流量頗有用

  6. Node

節點(上圖橘色方框)是物理或者虛擬機器,做爲Kubernetes worker,一般稱爲Minion。每一個節點都運行以下Kubernetes關鍵組件:

  • Kubelet:是主節點代理。
  • Kube-proxy:Service使用其將連接路由到Pod,如上文所述。
  • Docker或Rocket:Kubernetes使用的容器技術來建立容器。

 7. Kubernetes Master      

集羣擁有一個Kubernetes Master(紫色方框)。
Kubernetes Master提供集羣的獨特視角,而且擁有一系列組件,好比Kubernetes API Server。
API Server提供能夠用來和集羣交互的REST端點。
Master節點包括用來建立和複製Pod的Replication Controller

 

周國慶

2019/4/4

相關文章
相關標籤/搜索