concepts
Contents
概念
Container + Orchestration
k8s 是一種容器編排技術,用於協調數百個對象的部署和管理 cluster 中的數千個容器
VM vs Docker
- VM 是在 原本的 OS 上,再額外起來的完整的虛擬機器,具有完整的虛擬 OS
- 每個 VM 裡面除了 OS 外還有各自的 libs 和 deps
- 動輒以 GB 為單位
- 啟動速度慢
- Docker 是基於原本的內核,起起來的 container
- libs 和 deps 在各自容器內
- 大約以 MB 為單位
- 啟動速度快
術語
- node (minion)
- 安裝了 k8s 的機器,container 會起在這上面
- cluster
- 一組複數個 nodes ( 1 個 master / 多個 worker)
- 會有一台 master node,負責監管和負責流程編排 node 上 的 container
- components
- 安裝 k8s 時,會安裝的一些元件
- API server
- 可以作為 k8s 的前端 (系統操作入口)
- 不管是使用者對 k8s 或是 node 對 master 都是透過 apiserver 溝通
- 唯一可以和 etcd 溝通的元件,其他元件都必須透過 apiserver 才能訪問集群狀態
- 以 RESTful interface 提供外部或內部組件使用
- etcd
- key-value store
- 確保 master 間沒有 conflict
- kubelet
- 每個 node 都會安裝的 agent
- 確保 container 可以運作在 node 上
- container runtime
- 用來跑 container 的環境 (ex: Docker)
- controller manager
- 負責 k8s cluster 故障檢測和恢復的自動化,執行多種 controller
- replication controller
- 定期關聯 replication controller 和 pod,保證 pod 數量正確
- node controller
- kubelet 啟動的時候會通過 apiserver 註冊自己本身節點的資訊,定時向 apiserver 報告狀態
- apiserver 收到後更新到 etcd
- node controller 實現管理和監控 node 資訊
- resourceQuota controller
- 用來管理使用的資源不要超過設定
- namespace controller
- 用戶透過 apiserver 可以建立新的 namespace,存於 etcd
- service account controller
- 確保 default 的 ServiceAccount 在每個 namespace 中都存在
- token controller
- 用來監聽 service account 的建立/刪除 和 監聽 secret 的增加/刪除
- service controller
- 監聽 service 的變化
- endpoint controller
- endpoint 表示了 service 對應的所有 pod 副本的位址
- 而 endpoint controller 是負責生成和維護所有 endpoints 的控制器,保證 service 到 pod 的對應總是最新的
- replication controller
- orchestration 的大腦,在 nodes / containers 發生故障時發出通知和回應
- 決定是否建立新的 container
- 負責 k8s cluster 故障檢測和恢復的自動化,執行多種 controller
- scheduler
- 分配 container 給 nodes
- API server
- 安裝 k8s 時,會安裝的一些元件
- master 上
- 會安裝 kube-apiserver
- 會安裝 etcd 儲存資訊
- 會安裝 controller
- 會安裝 scheduler
- worker 上
- 會安裝 kubelet 和 master 溝通
k8s component 的 kind 種類
ConfigMap
指 系統相關設定的 key-value pair
讓 app pod 和 設定 分開,達到 decouple
- pod 需要 configMap 的時候再掛載來用就好
CronJob
K8s 的排程
k8s 中最小單位是 pod
所以
CronJob 在使用的時候也會產生對應的 pod
Deployment
Deployment 負責管理 ReplicaSet 和 Pod 的更新
Service
Service 是用來建立一個網路連線可以連到 pod
Secret
把敏感資訊以 非明碼的方式
放在 k8s 上
- 資料庫帳密
- access token
- ssh key…等等
k8s 可以把 secrets 當作環境變數來使用
Log 查看 pod 的 log
# l flag => label
# f flag => stream pod logs (stdout)
kubectl logs -l app=service --all-containers=true -f --tail=100