k8s——核心概念篇

代码你敲我不敲發表於2024-05-08

服務的分類

有狀態

img

  • 代表應用
    • nginx
    • apache
  • 優點
    • 對客戶端透明,無依賴關係,可以高效實現擴容,遷移
  • 缺點
    • 不能儲存資料,需要額外的資料服務支撐

無狀態

img

  • 代表應用
    • MYSQL
    • Redis
  • 優點
    • 可以獨立儲存資料,實現資料管理
  • 缺點
    • 叢集環境下需要實現主從,資料同步,備份,水平擴容負載。

資源和物件

資源等於類,物件等於透過類建立出來的物件
kubernetes中的所有內容都被抽象為“資源”,如pod,service,node等都是資源。
“物件”就是“資源”的例項,是持久化的實體。如某個具體的pod,某個具體的node。kubernetes使用這些實體去表示整個叢集的狀態。
物件的建立,刪除,修改都是透過kubernetes的API介面實現的。這些是“restful”風格的api,與k8s的萬物皆物件的思想對應。命令列工具“kubectl”,實際上也是呼叫kubernetes的api介面。
k8s中資源的型別有很多種,kubectl可以透過配置檔案來建立。這些“物件”,配置檔案更像是描述物件“屬性”的檔案,配置檔案格式可以是“json”或“yaml”,常用“yaml”。

物件規約和狀態

規約

規約(spec),規格的意思,spec是必需的,它描述了物件的期望狀態(Desired State) —— 希望物件所具有的特徵,當建立物件時,必須提供物件的規約,用來描述該物件的期望狀態,以及關於物件的一些基本資訊。

狀態

表示物件的實際狀態,該屬性由k8s自己維護,k8s會透過一系列的控制器對應物件進行管理,儘可能的將物件的實際狀態與期望狀態重合。

資源和物件

img

後設資料

對於資源的後設資料描述,每一個資源都可以使用源空間的資料

  • Horizontal Pod Autoscaler(HPA)

    pod自動擴容,可以根據cpu使用率或自定義指標(metrics)自動對pod進行擴/縮容

    控制器每30s(可以透過horizontal pod autoscaler sync period修改),查詢metrics的資源使用情況

    支援三種metrics型別

    • 預定義metrics(比如pod的cpu)以利用率的方式計算
    • 自定義的pod metrics 以原始值的方式計算
    • 自定義的object metrics

    支援兩種metrics查詢方式,heapster和自定義的rest api
    支援多metrics
    使用場景類似於京東十點秒殺搶蘋果20,這個時候就需要加伺服器

  • PodTemplate

    PodTemplate是關於pod的定義,但是被包含在其他的kubernetes物件中(例如,Deployment,StatefulSet,Job等控制器)。控制器透過PodTemplate的資訊來建立pod。

  • LimitRange

    可以對叢集內的Request和Limit的配置做一個全國的同意的限制,相當於批次設定了某一個範圍內(某個名稱空間)的pod的資源使用限制

叢集級

叢集級別的資源,作用在叢集之上,叢集下的所有資源都可以共享使用

  • Namespace

    名稱空間本身就屬於叢集級別的資源,用來隔離叢集內的資源,每個名稱空間都有自己的資源配額,資源配額可以設定在名稱空間級別,也可以設定在叢集級別。

  • Node

    節點相當於一臺伺服器的概念,不同於其他的資源(pod和namespace),node的本質上不是kubernetes來建立的,kubernetes只是管理node上的資源,雖然可以透過manifest建立一個node物件(如json所示),但是kubernetes也只是去檢查是否真有該node的存在,如果檢查失敗,也並不會去往上排程pod。

  • ClusterRole

    宣告資源
    ClusterRole和Role的區別在於,ClusterRole是叢集級別的,而Role是名稱空間級別的。

  • ClusterRoleBinding

    上面只是宣告資源,這個是用來進行繫結。(只能繫結叢集級別的資源)

名稱空間

名稱空間級別的資源,作用在名稱空間之上,通常只能在該名稱空間範圍內使用

工作負載型

pod
![img](https://img2023.cnblogs.com/blog/3303148/202405/3303148-20240505201334362-730976802.png)
> 簡單理解為容器組
> pod(容器組)是kubernetes中最小的可部署單元,一個pod(容器組)包含了一個應用程式容器(某些情況下是多個容器,儲存資源。一個唯一的網路ip地址,以及一些確定容器該如何執行的選項,pod容器組代表了kubernetes中一個獨立的應用程式執行例項,該例項可能由單個的容器或者幾個緊耦合在一起的容器組成)
docker 是 kubernetes pod 中使用最廣泛的容器引擎;kubernetes pod 同時也支援其他型別的容器引擎。
kubernetes叢集中的pod存在如下兩種使用途徑:
 > 1. 一個pod中值執行一個容器。這種是kubernetes最常用的方式。此時,我們可以認為pod容器組是該容器的wapper。kubernetes透過pod管理容器而不是直接管理容器。
 > 2. 一個pod中執行多個需要互相協作的容器。可以想多個緊密耦合,共享資源且始終在一起執行的容器編排在同一個pod中。
副本(replicas)

副本的概念: 一個pod可以被複製成多份,每一份可以被稱之為一個副本。這些副本除了一些描述性資訊(pod的名字,uid等)不一樣之外,其他的資訊都是一樣的,譬如pod內部的容器,容器數量,容器裡面執行的應用等,這些資訊都是一樣的,這些副本提供同樣的功能。
pod的“控制器”通常包含一個名為“replicas”的屬性。該屬性則指定了特定pod的副本數量。噹噹前叢集中該pod的數量與該屬性指定的值不一致時,k8s會猜去一些策略去使得當前狀態滿足配置的要求。

控制器
  • 控制器的型別

適用於無狀態服務

  1. ReplicationController(RC):幫助我們動態更新pod的副本數,也就是說實現擴容和縮容的效果(在1.11版本被棄用)
  2. ReplicaSet(RS):幫助我們動態更新pod的副本數,與RC類似,但是RS可以透過selector和label來選擇對哪些pod生效(RS只有擴容和縮容)
  3. Deployment
    是針對RS的更高層次的封層。
    1. 可以建立ReplicaSet,然後透過RS建立pod。
    2. 可以滾動升級和回滾pod
      3.平滑擴容和縮容
    3. 暫停和恢復
      適用於有狀態服務

StatefulSet
主要特點:

  1. 穩定的持久化儲存
  2. 穩定的網路識別符號
  3. 有序部署,有序擴充套件
  4. 有序收縮,有序刪除
    組成:
  5. Headless Service
    用於定義網路標誌(DNS domain,域名服務,將域名與ip繫結對映關係)
  6. VolumeClaimTemplate
    用於建立持久化卷的模板
    img

守護程序
DaemonSet
DaemonSet是保證在每個node上都執行的一個容器副本,常用來部署一些叢集的日誌,監控或者其他系統管理應用。典型的應用包括(日誌收集,系統監控,系統程式)
類似於:為每一個匹配的node都部署一個守護程序
任務/定時任務

  1. Job
    • 一次性任務,執行完pod銷燬,不再重新啟動新容器
  2. CronJob
    • 是在job基礎上加上了定時功能

服務發現

img

service

pod不能直接提供給外網訪問,而是應該使用service,service就是吧pod暴露出來提供服務,service才是真正的服務,它的中文名就叫‘服務’。可以說service是一個應用服務的抽象,定義了pod邏輯集合和訪問這個pod集合的策略。service代理pod集合,對外表現為一個訪問入口,訪問該入口的請求將進過負載均衡,轉發到後端的容器中。

ingress

實現將k8s內部服務暴露給外網訪問的服務

配置與儲存

Volume

資料卷,共享pod中容器使用的資料。用來放持久化的資料,比如資料庫資料。(Volume ClaimTemplate 就是申請Volume。

CSI

標準介面之一,旨在將任意儲存系統暴露給容器化應用程式。
csi規範定義了儲存提供商實現csi相容的Volume Plugin的最小操作集和部署建議。csi規範的主要焦點是宣告volume plugin 必須實現的介面。

特殊型別配置

ConfigMap
  • 鍵值對型別的配置
Secret
  • 鍵值對型別的配置,同ConfigMap類似,但Secret中的資料會加密儲存
DownwardAPI

提供了兩種方式用於將pod的資訊直接注入容器內部

  • 環境變數
    • 用於單個變數,可以將pod資訊直接注入容器內部
  • volume掛載
    • 將pod資訊生成檔案,直接掛載到容器內部中。

Role

role是一組許可權的集合。例如,role可以包含列出pod許可權及列出Deployment許可權。role用於給某個名稱空間中的資源進行鑑權

RoleBinding

繫結role,將role繫結到某個使用者或者組上。(可以繫結role,也可以繫結clusterRole,他只是決定繫結到哪裡去,rolebinding繫結到某個名稱空間,clusterrolebinding繫結到整個叢集)

相關文章