1. 程式人生 > >Docker Kubernetes 項目

Docker Kubernetes 項目

空間 mach 命名空間 ner version 了解 term 標簽 本地

Kubernetes 是 Google 團隊發起並維護的基於Docker的開源容器集群管理系統,它不僅支持常見的雲平臺,而且支持內部數據中心。

建於Docker之上的Kubernetes可以構建一個容器的調度服務,其目的是讓用戶透過Kubernetes集群來進行雲端容器集群的管理,而無需用戶進行復雜的設置工作。系統會自動選取合適的工作節點來執行具體的容器集群調度處理工作。其核心概念是Container Pod(容器倉)。一個Pod是有一組工作於同一物理工作節點的容器構成的。這些組容器擁有相同的網絡命名空間/IP以及存儲配額,可以根據實際情況對每一個Pod進行端口映射。此外,Kubernetes工作節點會由主系統進行管理,節點包含了能夠運行Docker容器所用到的服務。

Docker Kubernetes簡介

項目簡介

技術分享圖片

Kubernetes 是 Google 團隊發起的開源項目,它的目標是管理跨多個主機的容器,提供基本的部署,維護以及運用伸縮,主要實現語言為Go語言。Kubernetes是:

  • 易學:輕量級,簡單,容易理解
  • 便攜:支持公有雲,私有雲,混合雲,以及多種雲平臺
  • 可拓展:模塊化,可插拔,支持鉤子,可任意組合
  • 自修復:自動重調度,自動重啟,自動復制

Kubernetes構建於Google數十年經驗,一大半來源於Google生產環境規模的經驗。結合了社區最佳的想法和實踐。

在分布式系統中,部署,調度,伸縮一直是最為重要的也最為基礎的功能。Kubernets就是希望解決這一序列問題的。

Kubernets 目前在github.com/GoogleCloudPlatform/kubernetes進行維護,截至定稿最新版本為 0.7.2 版本。

Kubernetes 能夠運行在任何地方!

雖然Kubernets最初是為GCE定制的,但是在後續版本中陸續增加了其他雲平臺的支持,以及本地數據中心的支持。

Docker Kubernetes架構設計

基本架構和基本概念

任何優秀的項目都離不開好的架構和設計藍圖,在本小節,我們將來看一看Kubernetes是如何規劃它的架構。為了理解和使用Kubernets,我們需要了解Kubernetes的基本概念和作用。

架構設計

技術分享圖片

  • 節點:一個節點是一個運行Kubernetes中的主機。
  • 容器組:一個Pod對應於由若幹容器組成的一個容器組,同個組內的容器共享一個存儲卷(volume)。
  • 容器組生命周期:包含所有容器狀態集合,包括容器組狀態類型,容器組生命周期,事件,重啟策略,以及replication controllers。
  • Replication Controllers:主要負責指定數量的pod在同一時間一起運行。
  • 服務:一個Kubernetes服務是容器組邏輯的高級抽象,同時也對外提供訪問容器組的策略。
  • 卷:一個卷就是一個目錄,容器對其有訪問權限。
  • 標簽:標簽是用來連接一組對象的,比如容器組。標簽可以被用來組織和選擇子對象。
  • 接口權限:端口,ip地址和代理的防火墻規則。
  • web界面:用戶可以通過web界面操作Kubernetes。
  • 命令行操作:kubecfg命令。

節點

什麽是節點

在Kubernetes中,節點是實際工作的點,以前叫做Minion。節點可以是虛擬機或者物理機器,依賴於一個集群環境。每個節點都有一些必要的服務以運行容器組,並且它們都可以通過主節點來管理。必要服務包括docker,kubelet和網絡代理。

容器狀態

容器狀態用來描述節點的當前狀態。現在,其中包含三個信息:

主機IP

主機IP需要雲平臺來查詢,Kubernetes把它作為狀態的一部分來保存。如果Kubernetes沒有運行在雲平臺上,節點ID就是必需的。IP地址可以變化,並且可以包含多種類型的IP地址,如公共IP,私有IP,動態IP,ipv6等等。

節點周期

通常來說節點有 PendingRunningTerminated三個周期,如果Kubernetes發現了一個節點並且其可用,那麽Kubernetes就把它標記為 Pending。然後在某個時刻,Kubernetes將會標記其為 Running。節點的結束周期稱為 Terminated。一個已經terminated的節點不會接受和調度任何請求,並且已經在其上運行的容器組也會刪除。

節點狀態

節點的狀態主要是用來描述處於 Running的節點。當前可用的有 NodeReachableNodeReady 。以後可能會增加其他狀態。NodeReachable 表示集群可達。NodeReady表示kubelet返回 StatusOk並且HTTP狀態檢查健康。

節點管理

節點並非Kubernetes創建,而是由雲平臺創建,或者就是物理機器、虛擬機。在Kubernetes中,節點僅僅是一條記錄,節點創建之後,Kubernetes會檢查其是否可用。在Kubernetes中,節點用如下結構保存:

{
  "id": "10.1.2.3",
  "kind": "Minion",
  "apiVersion": "v1beta1",
  "resources": {
    "capacity": {
      "cpu": 1000,
      "memory": 1073741824
    },
  },
  "labels": {
    "name": "my-first-k8s-node",
  },
}

Kubernetes校驗節點可用依賴於id。在當前的版本中,有兩個接口可以用來管理節點:節點控制和Kube管理。

節點控制

在Kubernetes主節點中,節點控制器是用來管理節點的組件。主要包含:

  • 集群範圍內節點同步
  • 單節點生命周期管理

節點控制有一個同步輪尋,主要監聽所有雲平臺的虛擬實例,會根據節點狀態創建和刪除。可以通過 --node_sync_period標誌來控制該輪尋。如果一個實例已經創建,節點控制將會為其創建一個結構。同樣的,如果一個節點被刪除,節點控制也會刪除該結構。在Kubernetes啟動時可用通過 --machines標記來顯示指定節點。同樣可以使用 kubectl來一條一條的添加節點,兩者是相同的。通過設置 --sync_nodes=false標記來禁止集群之間的節點同步,你也可以使用api/kubectl 命令行來增刪節點。

容器組

在Kubernetes中,使用的最小單位是容器組,容器組是創建,調度,管理的最小單位。

什麽是容器組

一個容器組使用相同的Dokcer容器並共享卷(掛載點)。一個容器組是一個特定運用的打包集合,包含一個或多個容器。

和運行的容器類似,一個容器組被認為只有很短的運行周期。容器組被調度到一組節點運行,知道容器的生命周期結束或者其被刪除。如果節點死掉,運行在其上的容器組將會被刪除而不是重新調度。(也許在將來的版本中會添加容器組的移動)。

容器組設計的初衷

資源共享和通信

容器組主要是為了數據共享和它們之間的通信。

在一個容器組中,容器都使用相同的網絡地址和端口,可以通過本地網絡來相互通信。每個容器組都有獨立的ip,可用通過網絡來和其他物理主機或者容器通信。

容器組有一組存儲卷(掛載點),主要是為了讓容器在重啟之後可以不丟失數據。

容器組管理

容器組是一個運用管理和部署的高層次抽象,同時也是一組容器的接口。容器組是部署、水平放縮的最小單位。

容器組的使用

容器組可以通過組合來構建復雜的運用,其本來的意義包含:

  • 內容管理,文件和數據加載以及本地緩存管理等。
  • 日誌和檢查點備份,壓縮,快照等。
  • 監聽數據變化,跟蹤日誌,日誌和監控代理,消息發布等。
  • 代理,網橋
  • 控制器,管理,配置以及更新

替代方案

為什麽不在一個單一的容器裏運行多個程序?

  • 1.透明化。為了使容器組中的容器保持一致的基礎設施和服務,比如進程管理和資源監控。這樣設計是為了用戶的便利性。
  • 2.解偶軟件之間的依賴。每個容器都可能重新構建和發布,Kubernetes必須支持熱發布和熱更新(將來)。
  • 3.方便使用。用戶不必運行獨立的程序管理,也不用擔心每個運用程序的退出狀態。
  • 4.高效。考慮到基礎設施有更多的職責,容器必須要輕量化。

容器組生命周期

本小結將會簡單描述容器狀態類型,容器組生命周期,事件,重啟策略和復制控制器。

狀態值

pending

容器組已經被節點接受,但有一個或多個容器還沒有運行起來。這將包含某些節點正在下載鏡像的時間,這種情形會依賴於網絡情況。

running

容器組已經被調度到節點,並且所有的容器都已經啟動。至少有一個容器處於運行狀態(或者處於重啟狀態)。

succeeded

所有的容器都正常退出。

failed

容器組中所有容器都意外中斷了。

容器組生命周期

通常來說,如果容器組被創建了就不會自動銷毀,除非被某種行為出發,而觸發此種情況可能是人為,或者復制控制器所為。唯一例外的是容器組由 succeeded狀態成功退出,或者在一定時間內重試多次依然失敗。

如果某個節點死掉或者不能連接,那麽節點控制器將會標記其上的容器組的狀態為 failed

舉例

  • 容器組狀態 running,有1容器,容器正常退出- 記錄完成事件
  • 如果重啟策略為:- 始終:重啟容器,容器組保持 running
  • 失敗時:容器組變為 succeeded
  • 從不:容器組變為 succeeded

  • 容器組狀態 running,有1容器,容器異常退出- 記錄失敗事件
  • 如果重啟策略為:- 始終:重啟容器,容器組保持 running
  • 失敗時:重啟容器,容器組保持 running
  • 從不:容器組變為 failed

  • 容器組狀態 running,有2容器,有1容器異常退出- 記錄失敗事件
  • 如果重啟策略為:- 始終:重啟容器,容器組保持 running
  • 失敗時:重啟容器,容器組保持 running
  • 從不:容器組保持 running- 當有2容器退出

  • 記錄失敗事件
  • 如果重啟策略為:- 始終:重啟容器,容器組保持 running
  • 失敗時:重啟容器,容器組保持 running
  • 從不:容器組變為 failed

  • 容器組狀態 running,容器內存不足- 標記容器錯誤中斷
  • 記錄內存不足事件
  • 如果重啟策略為:- 始終:重啟容器,容器組保持 running
  • 失敗時:重啟容器,容器組保持 running
  • 從不:記錄錯誤事件,容器組變為 failed

  • 容器組狀態 running,一塊磁盤死掉- 殺死所有容器
  • 記錄事件
  • 容器組變為 failed
  • 如果容器組運行在一個控制器下,容器組將會在其他地方重新創建

  • 容器組狀態 running,對應的節點段溢出- 節點控制器等到超時
  • 節點控制器標記容器組 failed
  • 如果容器組運行在一個控制器下,容器組將會在其他地方重新創建

Replication Controllers

服務

標簽

接口權限

web界面

命令行操作

Docker Kubernetes 項目