1. 程式人生 > >Kubernetes物件模型

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、金鑰等敏感資料的配置問題。

總結

本文主要對Kubernetes的物件模型進行一個初略的講解。後續文章會對重點物件模型進行一個詳細的講解或者實戰的演示。


掃碼關注有驚喜

(轉載本站文章請註明作者和出處 方誌朋的部落格