Kubernetes物件模型
原文發表於https://www.fangzhipeng.com/kubernetes/2018/10/13/k8s-object-model/
歡迎訪問我的方誌朋的部落格
Kubernetes物件
在之前的文章已經講到了很多Kubernets物件,包括pod,service,deployment等等。Kubernets物件是一種持久化,表示叢集狀態的實體。它是一種宣告式的意圖的記錄,一般使用yaml檔案描述物件,它使用Kubernetes物件來表示叢集的狀態,通過API/kubectl管理Kubernetes物件。
name和uid
在Kubernetes物件模型中,使用了name和uid作為物件的唯一標識,其中name在同一種物件中是唯一的,在不同型別物件可以是相同的;uid是唯一標識的。
在API中物件的訪問路徑:/api/{version}/namespaces/{namespaxe/{object-kind}/name,比如:/api/v1/namespace/default/pods/hello-kubernetes
在Kubernetes叢集的整個生命週期內建立的每個物件例項都具有不同的UID.
Namespace(名字空間)
Namesapce,不僅僅是一個屬性,本身也是一個object。
- Namesapce:用於將物理叢集劃分為多個虛擬叢集。
- Namespace間完全隔離,因此也常被用來隔離不同的使用者以及許可權。
- Kubernetes內建了三個Namesapces:default、kube-system和kube-public,Node和PersistentVolume不屬於任何namespace。
Label(標籤)
Label用於建立叢集物件之間的靈活、鬆耦合的多維關聯關係。
- 一個label是一個鍵-值對,其中的key、value均由使用者自己定義。
- lable可以附著在任何物件上,每個物件也可以有任意個標籤。標籤可在物件定義時附加上,也可以通過命令動態管理標籤。
- label可以將有組織目的的結構對映到叢集物件上,從而形成一個與現實世界管理結構同步對應鬆耦合的、多維的物件管理結構。
通過lable selector 查詢和篩選建立物件間的關係的。
如上圖所示,有兩個service1和 service2,對應的pod有標籤release:stable和標籤release:rc-1,通過selector,就可以篩選出相應的標籤的pod。而pod由通過nodeselector篩選出不同環境的node。
Annotations
Annotations:可以將任意非標識性元資料附加到物件上。
- Annotations也是以鍵值對的形式呈現。
- 工具和庫可以檢索並使用這些Annotations元資料
- 將資料作為Annotations附著在物件上,有利於建立一些用於部署、管理和做內部檢查的共享工具和客戶端。
Kubernetes物件分類
常用的物件分類有以下幾種:
- workload類,即工作負載類
- pod
- controller
- deployment
- stateful
- daemonset
- job
- discovery&loadbalance類,與服務相關的物件
- service
- endpoint
- ingress
- config&storage,嚮應用初始化配置話資訊
- configmap
- secret
- volume
- persistentVolumeClaim
- cluster,叢集類物件
- Node
- namespace
- persitenceVolume
- clusterRole
- ClusterRoleVindeing
- ResoruceQuota
工作負載,以pod為中心
pod是一個有特定關係的容器集合。
- Pod是叢集中可以建立和部署的最小且最簡單的Kubernetes物件的單元。
- Pod也是一種封裝。它封裝了應用容器,儲存資源、獨立的網路IP以及決定容器如何執行的策略選項。
- 每個pod中預置了一個Pause容器,其namespace、IPC資源、網路和儲存資源被pod內其它容器共享。Pod中的所有容器緊密協作,並且作為一個整體被管理、排程和執行。
pod的生命週期
pod是一個非持久化實體。
如圖所示,pod有如下幾個生命週期:
- pending,即掛起,即pod物件已經被kubernetes所接受,但有一個或者多個pod尚未建立。
- running,執行中,pod已經繫結到node上,所有pod中所有容器已經建立
- succeed,成功狀態,pod的所有的容器已經成功終止。
- failed,失敗狀態,即有最少又一個容器正常退出。
service
pod是一個非持久化的實體,pod隨時都有可能被銷燬掉或者重新建立,所以pod的所在節點是不確定的,為了防止因pod的提供服務不確定性而採用了地址唯一的service用來提供服務,service可以通過負載均衡的呼叫它背後的pod物件,從而提供穩定的服務。
servie是與雲原生應用中“微服務”概念一一對應。
- kubernetes叢集為每一個service分配一個叢集唯一的IP地址,在 service的生命週期內,該ip地址不變;在內部DNS指出下,輕鬆實現服務發現機制。
- service通過label selector關聯到實際支撐業務執行的pod上,並通過叢集內建的服務負載均衡分發到後端pod上。
- 通過nodeport或者設定loadbalance機制實現叢集外部對service的訪問。
controllers
controller是kubernetes的核心物件之一。
- controller用於保證叢集內一組pod能始終按照某種期望的狀態正常執行
- 狀態包括:Pod副本數量、節點選擇、資源約束、持久化資料運維等
- kubernetes支援多種controller,常用的deployment、replicaseet、statefulset、daemonset等。
ReplicaSet
ReplicaSet:確保健康Pod的副本始終滿足使用者定義的數量。
- 前身是ReplicationController()rc
- 相比rc,增加了集合式label selector的支援。
- 支援單獨使用,但更多隱藏在Deployment控制器後面,由deployment自動管理。
Deployment
Deployment:為pod和 ReplicaSet提供宣告式的定義。
- 使用者在deployment檔案中描述期望狀態,Deployment Controller就會自動將Pod和Replica Set的實際狀態改變到期望狀態。
- Deployment支援Pod的滾動更新,並自動管理背後的ReplicaSet
- Deployment支援將Pod滾動到任意版本。
StatefulSet
StatefulSet:提供對有狀態應用的部署和控制的支援,1.9版本GA,正式畢業。可以用於生產環境中。
- 使用場景:文件的持久化儲存,穩定的網路標誌,有序部署有序擴充套件,有序收縮有序刪除,有序自動滾動升級等。
- Pod的儲存必須由PersistentVolume Provisioner根據請求的Storage Class 進行配置,或由管理員預先配置好。
- 考慮資料安全性,伸縮或刪除StatefulSey不會刪除關聯的儲存;另外StartefulSet目前要求Headless Service 負責Pod的網路身份,使用者有責任建立此服務。
DaemonSet
保證在每個Node上都執行一個Pod副本。
- 適用於系統Daemon程式、系統跟蹤、日誌收集等
- Kubernetes1.6之後,可設定更新策略:支援滾動更新
- 可指定Node:nodeSelector、nodeAffinity、podAffinity
ConfigMap
常用來向pod提供非敏感的配置資訊。
- ConfigMap用於儲存配置資料的鍵值對,可以用來儲存單個,也可以用來儲存配置檔案。
- ConfigMap可以使用命令列基於字面值、檔案或者目錄來建立或者通過configmap物件定義檔案建立。
- ConfigMap可以通過三種形式在pod中使用:環境變數、容器命令列引數貨以檔案形式通過資料卷外掛掛載到pod中。
Secret
secret解決的事叢集內密碼、token、金鑰等敏感資料的配置問題。
- 常用於與ServiceAccount關聯,儲存在tmpfs檔案系統中,Pod刪除後sercret檔案也會對應刪除
- 支援opaque,kubernetes.io/Service Account,kubernetes.io/dockerconfigjson三種類型。
總結
本文主要對Kubernetes的物件模型進行一個初略的講解。後續文章會對重點物件模型進行一個詳細的講解或者實戰的演示。
掃碼關注有驚喜
(轉載本站文章請註明作者和出處 方誌朋的部落格)