1. 程式人生 > >Kubernetes物件

Kubernetes物件

  Kubernetes物件
  
  在之前的文章已經講到了很多Kubernets物件,包括pod,service,deployment等等。Kubernets物件是一種持久化,表示叢集狀態的實體。它是一種宣告式的意圖的記錄,一般使用yaml檔案描述物件,它使用Kubernetes物件來表示叢集的狀態,通過API/kubectl管理Kubernetes物件。
  
  name和uid
  
  在Kubernetes物件模型中,使用了name和uid作為物件的唯一標識,其中name在同一種物件中是唯一的,在不同型別物件可以是相同的;uid是唯一標識的。
  
  在API中物件的訪問路徑:/api/{version}/namespaces/ www.ylouyi3.com {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 查詢和篩選建立物件間的關係的。
  
  如上圖所示,有兩個service1www.yinmaoyule178.com 和 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&www.yongshiyule178.com storage,嚮應用初始化配置話資訊
  
  configmap
  
  secret
  
  volume
  
  persistentVolumeClaim
  
  cluster,叢集類物件
  
  Node
  
  namespace
  
  persitence www.dasheng178.com Volume
  
  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三種類型。