# 基本概念

* 節點(Node):一個節點是一個運行 Kubernetes 中的主機。
* 容器組(Pod):一個 Pod 對應于由若干容器組成的一個容器組,同個組內的容器共享一個存儲卷(volume)。
* 容器組生命周期(pos-states):包含所有容器狀態集合,包括容器組狀態類型,容器組生命周期,事件,重啟策略,以及replication controllers。
* Replication Controllers(replication-controllers):主要負責指定數量的pod在同一時間一起運行。
* 服務(services):一個Kubernetes服務是容器組邏輯的高級抽象,同時也對外提供訪問容器組的策略。
* 卷(volumes):一個卷就是一個目錄,容器對其有訪問權限。
* 標簽(labels):標簽是用來連接一組對象的,比如容器組。標簽可以被用來組織和選擇子對象。
* 接口權限(accessing_the_api):端口,ip地址和代理的防火墻規則。
* web 界面(ux):用戶可以通過 web 界面操作Kubernetes。
* 命令行操作(cli):`kubecfg`命令。
## 節點
在 Kubernetes 中,節點是實際工作的點,以前叫做 Minion。節點可以是虛擬機或者物理機器,依賴于一個集群環境。每個節點都有一些必要的服務以運行容器組,并且它們都可以通過主節點來管理。必要服務包括 Docker,kubelet 和代理服務。
### 容器狀態
容器狀態用來描述節點的當前狀態。現在,其中包含三個信息:
#### 主機IP
主機IP需要云平臺來查詢,Kubernetes把它作為狀態的一部分來保存。如果Kubernetes沒有運行在云平臺上,節點ID就是必需的。IP地址可以變化,并且可以包含多種類型的IP地址,如公共IP,私有IP,動態IP,ipv6等等。
#### 節點周期
通常來說節點有 `Pending`,`Running`,`Terminated`三個周期,如果Kubernetes發現了一個節點并且其可用,那么Kubernetes就把它標記為 `Pending`。然后在某個時刻,Kubernetes將會標記其為 `Running`。節點的結束周期稱為 `Terminated`。一個已經terminated的節點不會接受和調度任何請求,并且已經在其上運行的容器組也會刪除。
#### 節點狀態
節點的狀態主要是用來描述處于 `Running`的節點。當前可用的有 `NodeReachable` 和 `NodeReady` 。以后可能會增加其他狀態。`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。
#### 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 簡介
- 什么是 Docker
- 為什么要用 Docker
- 基本概念
- 鏡像
- 容器
- 倉庫
- 安裝
- Ubuntu
- CentOS
- 鏡像
- 獲取鏡像
- 列出
- 創建
- 存出和載入
- 移除
- 實現原理
- 容器
- 啟動
- 守護態運行
- 終止
- 進入容器
- 導出和導入
- 刪除
- 倉庫
- Docker Hub
- 私有倉庫
- 配置文件
- 數據管理
- 數據卷
- 數據卷容器
- 備份、恢復、遷移數據卷
- 使用網絡
- 外部訪問容器
- 容器互聯
- 高級網絡配置
- 快速配置指南
- 配置 DNS
- 容器訪問控制
- 端口映射實現
- 配置 docker0 網橋
- 自定義網橋
- 工具和示例
- 編輯網絡配置文件
- 實例:創建一個點到點連接
- 實戰案例
- 使用 Supervisor 來管理進程
- 創建 tomcat/weblogic 集群
- 多臺物理主機之間的容器互聯
- 標準化開發測試和生產環境
- 安全
- 內核名字空間
- 控制組
- 服務端防護
- 內核能力機制
- 其它安全特性
- 總結
- Dockerfile
- 基本結構
- 指令
- 創建鏡像
- 底層實現
- 基本架構
- 名字空間
- 控制組
- 聯合文件系統
- 容器格式
- 網絡
- Docker Compose 項目
- 簡介
- 安裝
- 使用
- 命令說明
- YAML 模板文件
- Docker Machine 項目
- 簡介
- 安裝
- 使用
- Docker Swarm 項目
- 簡介
- 安裝
- 使用
- 調度器
- 過濾器
- Etcd 項目
- 簡介
- 安裝
- 使用 etcdctl
- Fig 項目
- 簡介
- 安裝
- 命令參考
- fig.yml參考
- 環境變量參考
- 實戰 Django
- 實戰 Rails
- 實戰 wordpress
- CoreOS 項目
- 簡介
- 工具
- 快速搭建CoreOS集群
- Kubernetes 項目
- 簡介
- 快速上手
- 基本概念
- kubectl 使用
- 架構設計
- Mesos 項目
- 簡介
- 安裝與使用
- 原理與架構
- 配置項解析
- 常見框架
- 附錄一:命令查詢
- 附錄二:常見倉庫介紹
- Ubuntu
- CentOS
- MySQL
- MongoDB
- Redis
- Nginx
- WordPress
- Node.js
- 附錄三:有用的資源