# 基本概念

* 節點(`Node`):一個節點是一個運行 Kubernetes 中的主機。
* 容器組(`Pod`):一個 Pod 對應于由若干容器組成的一個容器組,同個組內的容器共享一個存儲卷(volume)。
* 容器組生命周期(`pos-states`):包含所有容器狀態集合,包括容器組狀態類型,容器組生命周期,事件,重啟策略,以及 replication controllers。
* Replication Controllers:主要負責指定數量的 pod 在同一時間一起運行。
* 服務(`services`):一個 Kubernetes 服務是容器組邏輯的高級抽象,同時也對外提供訪問容器組的策略。
* 卷(`volumes`):一個卷就是一個目錄,容器對其有訪問權限。
* 標簽(`labels`):標簽是用來連接一組對象的,比如容器組。標簽可以被用來組織和選擇子對象。
* 接口權限(`accessing_the_api`):端口,IP 地址和代理的防火墻規則。
* web 界面(`ux`):用戶可以通過 web 界面操作 Kubernetes。
* 命令行操作(`cli`):`kubecfg`命令。
## 節點
在 `Kubernetes` 中,節點是實際工作的點,節點可以是虛擬機或者物理機器,依賴于一個集群環境。每個節點都有一些必要的服務以運行容器組,并且它們都可以通過主節點來管理。必要服務包括 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 返回 Status Ok 并且 HTTP 狀態檢查健康。
### 節點管理
節點并非 Kubernetes 創建,而是由云平臺創建,或者就是物理機器、虛擬機。在 Kubernetes 中,節點僅僅是一條記錄,節點創建之后,Kubernetes 會檢查其是否可用。在 Kubernetes 中,節點用如下結構保存:
```json
{
"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 中,使用的最小單位是容器組,容器組是創建,調度,管理的最小單位。
一個容器組使用相同的 Docker 容器并共享卷(掛載點)。一個容器組是一個特定運用的打包集合,包含一個或多個容器。
和運行的容器類似,一個容器組被認為只有很短的運行周期。容器組被調度到一組節點運行,直到容器的生命周期結束或者其被刪除。如果節點死掉,運行在其上的容器組將會被刪除而不是重新調度。(也許在將來的版本中會添加容器組的移動)。
### 容器組設計的初衷
### 資源共享和通信
容器組主要是為了數據共享和它們之間的通信。
在一個容器組中,容器都使用相同的網絡地址和端口,可以通過本地網絡來相互通信。每個容器組都有獨立的 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
- 基本概念
- 鏡像
- 容器
- 倉庫
- 安裝 Docker
- Ubuntu
- Debian
- CentOS
- Raspberry Pi
- macOS
- Windows PC
- 鏡像加速器
- 使用鏡像
- 獲取鏡像
- 列出鏡像
- 刪除本地鏡像
- 利用 commit 理解鏡像構成
- 使用 Dockerfile 定制鏡像
- Dockerfile 指令詳解
- COPY 復制文件
- ADD 更高級的復制文件
- CMD 容器啟動命令
- ENTRYPOINT 入口點
- ENV 設置環境變量
- ARG 構建參數
- VOLUME 定義匿名卷
- EXPOSE 暴露端口
- WORKDIR 指定工作目錄
- USER 指定當前用戶
- HEALTHCHECK 健康檢查
- ONBUILD 為他人作嫁衣裳
- 參考文檔
- Dockerfile 多階段構建
- 其它制作鏡像的方式
- 實現原理
- 操作容器
- 啟動
- 守護態運行
- 終止
- 進入容器
- 導出和導入
- 刪除
- 訪問倉庫
- Docker Hub
- 私有倉庫
- 私有倉庫高級配置
- Nexus 3
- 數據管理
- 數據卷
- 掛載主機目錄
- 使用網絡
- 外部訪問容器
- 容器互聯
- 配置 DNS
- 高級網絡配置
- 快速配置指南
- 容器訪問控制
- 端口映射實現
- 配置 docker0 網橋
- 自定義網橋
- 工具和示例
- 編輯網絡配置文件
- 實例:創建一個點到點連接
- Docker 三劍客之 Compose 項目
- 簡介
- 安裝與卸載
- 使用
- 命令說明
- Compose 模板文件
- 實戰 Django
- 實戰 Rails
- 實戰 WordPress
- Docker 三劍客之 Machine 項目
- 安裝
- 使用
- Docker 三劍客之 Docker Swarm
- Swarm mode
- 基本概念
- 創建 Swarm 集群
- 部署服務
- 使用 compose 文件
- 管理敏感數據
- 管理配置信息
- 滾動升級
- 安全
- 內核命名空間
- 控制組
- 服務端防護
- 內核能力機制
- 其它安全特性
- 總結
- 底層實現
- 基本架構
- 命名空間
- 控制組
- 聯合文件系統
- 容器格式
- 網絡
- Etcd 項目
- 簡介
- 安裝
- 集群
- 使用 etcdctl
- CoreOS 項目
- 簡介
- 工具
- 快速搭建 CoreOS 集群
- Kubernetes 項目
- 簡介
- 快速上手
- 基本概念
- kubectl 使用
- 架構設計
- Mesos - 優秀的集群資源調度平臺
- Mesos 簡介
- 安裝與使用
- 原理與架構
- Mesos 配置項解析
- 日志與監控
- 常見應用框架
- 本章小結
- 容器與云計算
- 簡介
- 亞馬遜云
- 騰訊云
- 阿里云
- 小結
- 實戰案例-操作系統
- Busybox
- Alpine
- Debian Ubuntu
- CentOS Fedora
- 本章小結
- 實戰案例-CI/CD
- Drone
- Docker 開源項目
- LinuxKit
- 附錄
- 附錄一:常見問題總結
- 附錄二:熱門鏡像介紹
- Ubuntu
- CentOS
- MySQL
- MongoDB
- Redis
- Nginx
- WordPress
- Node.js
- 附錄三:Docker 命令查詢
- 附錄四:Dockerfile 最佳實踐
- 附錄五:資源鏈接
- 附錄六:Docker 中文資源