Kubernetes

无敌小鲁班發表於2024-07-28

目錄
  • 1.Kubernetes 概述
  • 2.K8s的架構
    • (1)Master 節點的元件
      • (1)Kube-apiserver
      • (2)Kube-controller-manager
      • (3)Kube-scheduler
      • (4)Etcd
    • (2)worker node 節點的元件
      • (1)Kubelet
      • (2)Kube-Proxy
      • (3)Container Runtime容器執行時/容器引擎
    • (3)Kubernetes工作流程
  • 3.K8S資源物件
    • (1)Pod
    • (2)Pod 控制器
      • (1)deployment
      • (2)statefulset
      • (3)daemonset
      • (4)job
      • (5)cronjob
    • (3)service
    • (4)ingress
    • (5)volume
    • (6)Name
    • (7)namespace
    • (8)label
    • (9)label selector
    • (10)annotation

K8S 的全稱為 Kubernetes (K12345678S),PS:“嘛,寫全稱也太累了吧,不如整個縮寫”。

1.Kubernetes 概述

Google旗下的容器跨主機編排工具,佔據了80%以上的市場份額,已經成為容器編排工具的事實標準

作用:
用於自動部署、擴充套件和管理“容器化(containerized)應用程式”的開源系統。
可以理解成 K8S 是負責自動化運維管理多個容器化程式(比如 Docker)的叢集,是一個生態極其豐富的容器編排框架工具。

由來:
K8S由google的Borg系統(博格系統,google內部使用的大規模容器編排工具)作為原型,後經GO語言延用Borg的思路重寫並捐獻給CNCF基金會開源。

官網:
https://kubernetes.io

GitHub:
https://github.com/kubernetes/kubernetes

K8S是一款強大的容器編排平臺,可以幫助企業實現容器化的業務部署和管理,提升效率和可靠性。

K8S是一個容器叢集管理系統,在Docker等容器技術的基礎上,為容器化的應用提供部署執行、資源排程、服務發現和動態伸縮等一系列完整功能,提高了大規模容器叢集管理的便捷性。

K8S 的特點包括:
●自動化管理:大大減少了人工干預,提高了應用部署和管理的效率。
●彈性伸縮:能夠根據負載自動調整容器的副本數量,實現資源的高效利用。
●高可用性:透過副本和故障轉移機制,確保應用的持續可用。
●負載均衡:可以在多個節點上自動分配負載,實現負載均衡。
●跨平臺支援:可以在不同的基礎設施上執行,包括物理機、虛擬機器和雲平臺。

2.K8s的架構

k8s有 master 和 worker node 兩類節點

(1)Master 節點的元件

負責K8S叢集的管理和資源排程等運維工作

(1)Kube-apiserver

是所有服務請求的統一訪問入口,負責接收、驗證和轉發請求

工作原理:
1)API Server 監聽特定的埠,接收來自客戶端的 HTTP 請求。
2)對請求進行認證和授權,確保只有合法的使用者能夠執行相應的操作。
3)驗證請求中的資料格式和內容是否合法。
4)將請求中的資訊儲存到 Etcd 中,並更新叢集的狀態。
5)提供其他模組之間的資料互動和通訊的樞紐(其他模組透過API Server查詢或修改資料,只有API Server才直接操作etcd)。

(2)Kube-controller-manager

控制器管理器,負責管理K8S各種資源物件的控制器;並透過apiserver監控整個K8S叢集的資源狀態,並確保資源始終處於預期的工作狀態

常見的控制器
Node Controller(節點控制器) 負責在節點出現故障時發現和響應
Replication Controller(副本控制器) 負責保證叢集中一個 RC(資源物件 Replication Controller)所關聯的 Pod 副本數始終保持預設值。可以理解成確保叢集中有且僅有 N 個 Pod 例項,N 是 RC 中定義的 Pod 副本數量
Endpoints Controller(端點控制器) 填充端點物件(即連線 Services 和 Pods),負責監聽 Service 和對應的 Pod 副本的變化。 可以理解端點是一個服務暴露出來的訪問點,如果需要訪問一個服務,則必須知道它的 endpoint
Service Account & Token Controllers(服務帳戶和令牌控制器) 為新的名稱空間建立預設帳戶和 API 訪問令牌
ResourceQuota Controller(資源配額控制器) 確保指定的資源物件在任何時候都不會超量佔用系統物理資源
Namespace Controller(名稱空間控制器) 管理 namespace 的生命週期
Service Controller(服務控制器) 屬於 K8S 叢集與外部的雲平臺之間的一個介面控制器

工作原理:
1)透過 API Server 定期獲取資源的狀態資訊。
2)根據資源的定義和當前狀態,計算出期望的狀態。
3)如果當前狀態與期望狀態不一致,控制器會採取相應的行動,例如建立、刪除或更新資源。

(3)Kube-scheduler

資源排程器,負責Pod資源的排程,透過排程演算法(預選/優選策略)為待部署的Pod選擇最適合的node節點

•預選策略(predicate):過濾不符合條件的節點
•優選策略(priorities):優先順序排序,選擇優先順序最高的節點

工作原理:
1)從 API Server 獲取尚未分配到節點的 Pod 資訊。
2)根據 Pod 的資源需求和節點的可用資源,篩選出符合條件的節點。
3)為符合條件的節點計算優先順序,考慮因素包括節點的負載、親和性和反親和性等。
4)選擇優先順序最高的節點,並將 Pod 排程到該節點上。

(4)Etcd

K8S叢集的資料庫,是一種鍵值對儲存結構的分散式資料庫,負責儲存K8S叢集所有配置和狀態資訊,僅apiserver擁有訪問和讀寫許可權

工作原理:
1)將K8S叢集的配置資料、資源物件的定義和狀態等以鍵值對的形式儲存。
2)透過 Raft 一致性演算法確保資料的一致性和可靠性。
3)在多個Etcd節點之間同步資料,以實現高可用性。

(2)worker node 節點的元件

負責執行工作負載,即容器應用

(1)Kubelet

接收apiserver的指令,建立和管理Pod及其容器的生命週期;定期收集節點的資源使用情況,並上報給apiserver

工作原理:
1)向 API Server 註冊所在節點的資訊,包括節點的資源容量和狀態。
2)根據 API Server 的指令,啟動、停止和監控 Pod 中的容器。
3)定期收集節點的資源使用情況,並上報給 API Server。

(2)Kube-Proxy

負責實現Pod網路代理,維護網路規則和四層負載均衡

工作原理:
1)監聽 API Server 中 service 資源物件的定義和更新。
2)根據 service 的定義,在節點上配置網路規則,實現請求的分發和負載均衡。
3)定期檢查後端 Pod 的健康狀況,確保服務的可用性。

(3)Container Runtime容器執行時/容器引擎

執行容器

工作原理:
1)根據 Pod 中容器的定義,從映象倉庫拉取所需的映象。
2)建立和啟動容器,並配置相應的網路和儲存。
3)實現容器之間的資源隔離和限制,確保每個容器都能獲得所需的資源。

(3)Kubernetes工作流程

(1)使用者透過客戶端傳送建立Pod的請求給apiserver
(2)apiserver接收到請求並進行認證後,將請求資訊儲存到etcd中
(3)controller-manager透過list-watch監聽到apiserver的指令後,會根據請求資訊中的資料配置模板建立Pod資源
(4)scheduler也透過list-watch監聽到apiserver的指令後,開始排程新建立的Pod,會根據排程演算法的預選策略和優選策略選擇出最適合的node節點來部署Pod
(5)node節點上的kubelet透過list-watch監聽到apiserver的指令後,會在指定的節點上建立Pod,並管理其容器的生命週期
(6)使用者還可以透過apiserver在kube-proxy上配置相應的網路規則,實現Pod網路代理和負載均衡

3.K8S資源物件

(1)Pod

是K8S能夠建立和管理的最小單元。一個Pod裡可以包含一個或多個應用容器,同一個Pod裡的容器之間共享網路、儲存等資源(容器之間可以透過localhost相互訪問,還可以共享Pod的儲存卷)

(2)Pod 控制器

(1)deployment

部署無狀態應用(沒有實時資料需要儲存);同時也負責管理replicase(維持Pod副本數量始終符合預期狀態)和Pod(容器化的應用程式)

(2)statefulset

部署有狀態應用(有實時資料需要儲存)

(3)daemonset

在每個node節點上都部署一個Pod副本

(4)job

一次性的部署短期任務的Pod(執行完任務後會自動退出)

(5)cronjob

週期性的部署短期任務的Pod(執行完任務後會自動退出)

(3)service

在K8S叢集內部,為透過標籤選擇器相關聯的一組Pod提供一個統一的訪問入口(clusterIP)和負載均衡(只支援四層)
service 透過標籤選擇器關聯Pod的標籤,從而自動發現相關聯Pod的端點(Pod的IP和埠)

(4)ingress

作為K8S叢集外部的訪問入口,可定義ingress規則根據不同的域名或URL路徑繫結並轉發請求給指定的service,支援七層負載均衡

(5)volume

Pod中容器可以訪問的檔案系統

(6)Name

資源名稱
由於 K8S 內部,使用 “資源” 來定義每一種邏輯概念(功能),所以每種 “資源”,都應該有自己的 “名稱”。

K8S資源配置資訊
apiversion 指定資源物件使用的api介面版本
kind 指定資源物件的型別
metadata 指定資源物件的後設資料資訊,比如name(資源名稱)、namespace(名稱空間)、annotation(註釋)、label(標籤)
spec 指定資源物件的配置屬性,比如副本數、映象、網路模式、儲存卷
status 資源物件在當前的執行狀態資訊

(7)namespace

名稱空間,用於隔離資源名稱的。在同一個名稱空間中,同型別的資源名稱是唯一的

(8)label

標籤,將一個或多個鍵值對標識關聯到某個資源物件,用於對資源物件進行分組

(9)label selector

標籤選擇器,用於查詢和篩選擁有指定標籤的資源物件

標籤選擇器目前有兩種:基於等值關係(等於、不等於)和基於集合關係(屬於、不屬於、存在)。

(10)annotation

註釋,用於資源物件的註釋資訊;還可以用於開啟一些特殊資源物件的功能特性

有效的標籤值必須為63個字元或更少,並且必須為空或以字母數字字元([a-z0-9A-Z])開頭和結尾,中間可以包含橫槓(-)、下劃線(_)、點(.)和字母或數字。註釋值則沒有字元長度限制。

相關文章