k8s資源對象及API群組


REST是representational state transfer的縮寫,意為“表征狀態轉移”,它是一種程序架構風格,基本元素為資源(resource)、表征(representation)和行為(action)。

資源可以分組為集合(collection),每個集合只包含單一類型的資源,並且各資源間是無序的。資源也可以部署於任何集合,它們稱為單體資源。事實上,集合本身也是資源,它可以部署於全局級別,位於api的頂層,也可以包含於某個資源中,表現為“子集合”。

k8s系統將一切事物都抽象為api資源,其遵循rest架構風格組織並管理這些資源及其對象,同時還支持通過標准的http方法對資源進行增刪改查等管理操作。

1、k8s的資源對象

依據資源的主要功能作為分類標准,k8s的api對象大體可分為工作負載(workload)、發現(discovery)和負載均衡(loadbalance)、配置(config)和存儲(storage)、集群(cluster)以及元數據(metadate)五個類別。它們基本上都是圍繞一個核心目的而設計:如何更好的運行和豐富pod資源,從而為容器化應用提供更靈活、更完善的操作與管理組件。

(1)工作負載型資源:

pod是工作負載型資源中的基礎資源,應用程序分為無狀態和有狀態兩種類型,它們對環境的依賴及工作特性有很大不同,因此,分屬兩種不同類型的pod控制器來管理,replicationcontroller、replicaset和deployment負責管理無狀態應用,statefulset用於管理有狀態應用。還有些應用較為獨特,他們需要在集群中的每個節點上運行單個pod資源,負責收集日志或運行系統服務等任務,這些pod資源的管理則屬於daemonset控制器的分內之事。另外,有些容器化應用需要繼續運行以守護進程不間斷地提供服務,而有些則應該在正常完成后推出,這些在正常完成后就應該退出的容器化應用則由job控制器負責管控。

replicationcontroller:用於確保每個pod副本在任一時刻均能滿足目標數量,保證每個容器或容器組總是運行並且可訪問;它是上一代的無狀態pod應用控制器。

replicaset:新一代replicationcontroller,它與replicationcontroller的唯一不同之處僅在於支持的標簽選擇器不同,replicationcontroller只支持等值選擇器,而replicaset還額外支持基於集合的選擇器。

deployment:用於管理無狀態的持久化應用,它用於為pod和replicaset提供聲明式更新,是建構在replicaset之上的更為高級的控制器。

statefulset:用於管理有狀態的持久化應用,其與deployment的不同之處在於statefulset會為每個pod創建一個獨有的持久性標識符,並會確保各pod之間的順序性。

daemonset:用於確保每個節點都運行了某pod的一個副本,新增的節點一樣會被添加此類pod;在節點移除時,此類pod會被回收;daemonset通常用於運行集群存儲守護進程,如glusterfs和ceph,還有日志收集進行,如fluentd和logstash,以及監控進程,如prometheus的nodeexporter、collected等

job:用於管理運行完成后即可終止的應用,例如批處理作業任務,job創建一個或多個pod,並確保其符合目標數量,直到pod正常結束而終止。

(2)發現和負載均衡:

pod資源可能會因為任何意外故障而被重建,於是它需要固定的可被發現的方式。另外pod資源僅在集群內可見,它的客戶端也可能是集群內的其他pod資源,若要開放給外部網絡中的用戶訪問,則需要事先將其暴露到集群外部,並且要為同一種工作負載的訪問流量進行負載均衡。k8s使用標准的資源對象來解決此類問題,它們時用於為工作負載添加發現機制及負載均衡功能的service資源和endpoint資源,以及通過七層代理實現請求流量負載均衡的ingress資源。

(3)配置與存儲:

k8s的volume資源支持眾多類型的存儲設備或存儲系統,如glusterfs、ceph rdb和flocker等。configmap資源能夠以環境變量或存儲卷的方式接入到pod資源的容器中,並且可被多個同類的pod共享引用,從而實現“一次修改,多處生效”。不過,這種方式不適用於存儲敏感數據,那是另一類資源類型secret的功能

(4)集群級資源:

pod、deployment、service和configmap等資源屬於名稱空間級別,k8s還存在一些集群級別的資源,用於定義集群自身配置信息的對象,集群級資源主要包含以下幾種類型:

namespace:資源對象名稱的作用范圍,默認為“default”。

node:k8s集群的工作節點,在當前集群中時唯一的。

role:名稱空間級別的由規則組成的權限集合,可被rolebingding引用。

clusterrole:cluster級別的由規則組成的權限集合,可被rolebinding和clusterrolebinding引用

rolebinding:將role中的許可權限綁定在一個或一組用戶之上,它隸屬於且僅能作用於一個名稱空間;綁定時,可以引用同一名稱空間中的role,也可以引用全局名稱空間中的clusterrole

clusterrolebinding:將clusterrole中定義的許可權限綁定在一個或一組用戶之上,它能夠引用全局名稱空間的clusterrole,並能夠通過subject添加相關信息

(5)元數據型資源

此類資源對象用於為集群內部的其他資源配置其行為或特性,如horizontalpodautoscaler資源可用於自動伸縮工作負載類型的資源對象的規模,pod模板資源可用於為pod資源的創建預制模板,而limitrange則可為名稱空間的資源設置其cpu和內存等系統級資源的數量限制等。

2、資源及其在api中的組織形式

k8s通常利用標准的resteful術語來描述api概念:

資源類型是指在url中使用的名稱,如pod、namespace和service等。

所有資源類型都有一個對應的json表示格式。

隸屬於同一種資源類型的對象組成的列表稱為集合。

某種類型的單個實例稱為資源或對象

kind代表資源對象所屬的類型,而這些資源類型大體可以分為三類:對象類、列表類、簡單類。

k8s將api分割為多個邏輯集合,稱為api群組,它們支持單獨啟用或禁用,並能夠再次分解。apiserver支持在不同的群組中使用不同的版本,允許各組以不同的速度演進,而且也支持同一群組同事存在不同的版本,如apps/v1、apps/v1beta2、apps/v1beta1等。也因此能夠在不同的群組中使用同一個資源類型。群組化管理的api使得其可以更輕松地進行擴展。

k8s的api以層級結構組織在一起,每個api群組表現為一個以/apis為根路徑的rest路徑,不過核心群組core有一個專用的簡化路徑“/api/v1”.目前,常用的api群組分為兩類:

核心群組:rest路徑為/api/v1,在資源的配置信息apiversion字段中引用時可以不指定路徑,而僅給出版本,如“apiVersion:v1”。

命名的群組:rest路徑為/apis/$GROUP_NAME/$VERSION,例如/apis/apps/v1,它在apiversion字段中引用的格式為:“apiVersion:$GROUP_NAME/$VERSION”

另外,k8s還支持用戶自定義資源類型,目前常用的方式由三種:修改k8s源代碼自定義類型、創建一個自定義的apiserver並將其聚合至集群中、使用自定義資源

3、訪問k8s rest api

一種常用的方式是使用curl作為http客戶端直接通過apiserver在集群上操作資源對象模擬請求和響應的過程。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM