iT邦幫忙

第 12 屆 iT 邦幫忙鐵人賽

DAY 5
0
Software Development

K8S - 30天從擦槍到提槍上陣學習筆記。系列 第 5

day 5 認識 k8s 資源管理概念

Kubenetes 資源管理對象

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操作。

K8s 常用資源對象(resource object)

https://ithelp.ithome.com.tw/upload/images/20200908/20129656xWk0iicTFW.png

圖片參考書:【Kubernetes 進階實踐】

依照功能將這些 resource object 分為5類:

  1. Workload 工作負載型
    Pod 是Workload類型中的基礎, 負責運行容器, 注入共享或持久化的Volume, Config, Secret ... 等,
    當Pod遇到非正常終止的狀況時, 就需要被重建, 重建pod是由Workload類型的控制器完成的, 也就是 Pod Controller。
    有狀態跟無狀態兩個類型的應用程序,是由兩個不同類型的 Pod Controller來管理,
    其中 ReplicaSet 和 Deployment 負責管理無狀態的應用程序,StatefulSet則負責管理有狀態的應用程式。
  • Pod Controller 類型的用途:
    • ReplicaSet:
      用來確保每個Pod在任何時刻都能滿足設定的數量並且都能正常的運行
    • Deployment:
      負責管理無狀態的持久化應用, ex: HTTP 服務, Deployment會根據資源狀態分配Pod到各個節點, 並將服務流量隨機分散至管理的 Pod 內, 它可以確保Pod數量並且具備自我修復的功能。
    • StatefulSet:
      負責管理有狀態的持久化應用, ex: database 應用程序, 和Deployment不同的地方在它為每個Pod建立為一個持久性識別符, 並會確保各Pod之間的順序性。他會有順序性的擴展與刪除Pod, Pod 被刪除重生後會自動掛載 volume來維持原本的狀態(不含記憶體狀態), 適合應用在需要保持狀態的服務。
    • DaemonSet:
      用來確保每個Node都有運行一份Pod副本, 新增的Node都會被加上此類型的Pod, Node移除時也會回收,每個Node上同時只有一個 Daemonset Pod,Pod 命名為隨機字串, 通常被用來蒐集工作日誌與服務探索, 適合用在獨立運作且主動對外溝通的情境。
    • Job:
      用來管理工作完成後即可終止的應用, 他會創建一個或多個Pod, 直到Pod完成任務後就會正常終止, Pod 變成 Completed, 適合用在單次檢測型的服務。
  1. Discovery and Load Balance 發現和均衡負載
    在Pod因為不正常終止而被重建的過程中, 需要可以被發現的方式, 同時如果要把Pod暴露出去給外面使用也需要為同一種工作負載的請求進行load balance,在K8s中負責這些工作的就是為工作負載添加發現機制與 load balance 的Service 和 Endpoint, 以及通過七層代理實現request load balance 的ingress。

  2. Config and Storage 配置與儲存
    K8s 設計了Volume來解決容器內部存放持久性數據的問題,Volume支持多種類型的儲存系統, 同時支援 CSI (Container Storage Interface)接口。
    ConfigMap可以透過掛載Volume的方式被不同的Pod共用, 實現一次修改一起生效的概念, 但要注意不應該將敏感數據存放在ConfigMap中。

  3. Cluster
    Cluster層級的資源是用來定義K8s cluter管理員層級設定相關配置資訊的object, 主要有幾個類型如下:

    • Namespace:
      默認為default, 用來定義object的作用範圍。
    • Node:
      K8s work node, 在同一個cluster中的識別符須為唯一值。
    • Role:
      Namespace中的權限集合, 可被RoleBinding引用。
    • ClusterRole:
      Cluster 中的權限集合, 可被RoleBinding和ClusterRoleBinding引用。
    • RoleBinding:
      將Role中的許可權限綁定在一個或一組用戶上, 僅能作用於一個Namespace, 可以引用同一層Namespace中的Role, 也可以引用全域Namespace中的ClusterRole
    • ClusterRoleBinding:
      將ClusterRole中的許可權限綁定在一個或一組用戶上,它能引用全域Namespace中的ClusterRole, 並能透過subject添加相關訊息。
  4. 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吧


上一篇
day 4 在minikube上練習 kubectl 創建Pod, Service, Deployment
下一篇
day 6 YAML上的資源配置
系列文
K8S - 30天從擦槍到提槍上陣學習筆記。30

尚未有邦友留言

立即登入留言