K8s API Server 基於HTTP/HTTPS接收並響應client端的請求, 它提供一種resource-based的RESTful風格的接口,將K8s cluster 中的object都抽象成REST資源, ex: Node, Namespace和Pod等,K8s遵循REST風格組織並管理這些object, 同時支援通過標準的HTTP方法(POST, PUT, PATCH, DELETE, GET)對這些object進行CRUD操作。
圖片參考書:【Kubernetes 進階實踐】
依照功能將這些 resource object 分為5類:
Workload 工作負載型
Pod 是Workload類型中的基礎, 負責運行容器, 注入共享或持久化的Volume, Config, Secret ... 等,
當Pod遇到非正常終止的狀況時, 就需要被重建, 重建pod是由Workload類型的控制器完成的, 也就是 Pod Controller。
有狀態跟無狀態兩個類型的應用程序,是由兩個不同類型的 Pod Controller來管理,
其中 ReplicaSet 和 Deployment 負責管理無狀態的應用程序,StatefulSet則負責管理有狀態的應用程式。
* Pod Controller 類型的用途:
Discovery and Load Balance 發現和均衡負載
在Pod因為不正常終止而被重建的過程中, 需要可以被發現的方式, 同時如果要把Pod暴露出去給外面使用也需要為同一種工作負載的請求進行load balance,在K8s中負責這些工作的就是為工作負載添加發現機制與 load balance 的Service 和 Endpoint, 以及通過七層代理實現request load balance 的ingress。
Config and Storage 配置與儲存
K8s 設計了Volume來解決容器內部存放持久性數據的問題,Volume支持多種類型的儲存系統, 同時支援 CSI (Container Storage Interface)接口。
ConfigMap可以透過掛載Volume的方式被不同的Pod共用, 實現一次修改一起生效的概念, 但要注意不應該將敏感數據存放在ConfigMap中。
Cluster
Cluster層級的資源是用來定義K8s cluter管理員層級設定相關配置資訊的object, 主要有幾個類型如下:
default
, 用來定義object的作用範圍。Metadata 元數據型資源
HorizontalPodAutoscaler可用於自動伸縮工作負載類型的對象, Pod模板資源可用於預製Pod模板, LimitRange則可用來為Namespace的資源設置CPU和Memory的數量限制等。
Workload 資源類型用於確保Pod在使用容器化應用時更有效率, 具有同一種負載的 pods 需要以load balance的方式分配處理client端過來的請求,而各種容器化應用之間需要彼此發現才能共同完成工作;Storage類型的資源能夠在Pod重新建立時提供持久化數據的儲存機制;共享同一配置的Pod可以從配置型資源中統一獲得配置異動訊息;Cluster類型資源為管理cluster本身的工作提供了配置接口,Metadata類型的資源用於配置cluster中其他資源的行為。
套入應用時可以這樣理解: Deployment負責管理Pod, ConfigMap負責儲存配置, Secret 負責存放鑰匙, Volume 負責存放持久化數據, Service 和 Ingress 負責暴露服務。
先依照功能了解各個物件在整個架構中分別扮演什麼角色, 然後就繼續啃K8s吧