一、 ?簡介
Kubernetes,也稱為K8s,是一個開源的容器編排系統,用于自動部署、擴展和管理容器化應用程序,幫助開發者更高效地跨集群管理應用。本文總結了 k8s 的基礎概念和技術架構。
二、基礎概念
1.??云原生(Cloud Native)
云原生是在云計算環境中構建、部署和管理現代應用程序的軟件方法。云原生架構基于以下幾個核心要素:
- 微服務:將應用分解為一組更小的輕量級服務,而這些服務可通過應用編程接口 (API) 輕松組合并相互連接。
-?容器和編排
- DevOps
- 持續集成和持續交付 (CI/CD)
2.??容器化(Containerization)
容器化是指將應用程序及其依賴項打包成一個容器,使其可以在任何支持容器的環境中運行,方便部署和管理。
- 容器本身不需要運行一個完整的操作系統,因此比虛擬機更輕量。
- 容器可以共享同一個操作系統內核,減少資源浪費。
- 容器可以在任何支持容器的環境中運行,無論是本地、云端還是其他環境。
- 容器提供了應用程序之間的隔離,確保應用程序不會相互影響。
3.??編排(Orchestration)
容器編排指自動化和管理容器化應用程序的部署、擴展、管理和監控的過程。編排涉及到多個容器之間的協調和管理,以確保應用程序的正常運行和高可用性。
-?容器生命周期管理,包括創建、啟動、停止和刪除。
-?容器路由發現與網絡管理,確保服務之間可以相互通信。
-?容器負載均衡與彈性伸縮,流量分發,自動增加或減少容器實例。
-?監控和日志:監控應用程序的性能和日志,確保應用程序的正常運行。
二、??集群架構
kubectl: 使用 Kubernetes API 與 Kubernetes 集群的控制面進行通信的命令行工具
API server:公開 Kubernetes HTTP API?,負責處理接受請求的工作,是 Kubernetes 控制平面的前端
controller manager:負責運行控制器進程
schedular: 節點調度器,查找尚未綁定到節點的 Pod,并將每個 Pod 分配給合適的節點。
etcd: key-value 數據庫,負責?Kubernetes 所有集群數據的持久化存儲
pod: 一個或多個應用容器的組合,并且包含共享的存儲、IP 地址和有關如何運行它們的信息,只有容器緊耦合并且需要共享磁盤等資源時,才應將其編排在一個 Pod 中。
runtime: 運行容器的啟動器,負責解析容器鏡像并創建隔離的運行環境。
kubelet:節點管理器,負責 Kubernetes 控制面和節點之間通信的進程,確保 Pod 及其容器正常運行
kube-proxy: 在每個節點上所運行的網絡代理,允許從集群內部或外部的網絡會話與 Pod 進行網絡通信
1.??集群與節點
集群是指一組計算機或節點,共同工作以提供一種分布式計算環境。集群中的節點可以是物理機或虛擬機,集群可以提供高可用性、可擴展性和負載均衡等特性。一個 Kubernetes 實例是一個集群,這些節點由控制面負責管理。
2.??工作負載(workload)
一個工作負載是運行在 Kubernetes 上的一個應用,通常你不需要直接創建 Pod,甚至單實例 Pod。相反,你會使用工作負載資源來創建和管理一組 Pod 副本。Kubernetes?提供了以下幾種工作負載資源:
- Deployments 通常適用于不保持狀態的負載,任何 Pod 都是可替換的
-?StatefulSets 用來管理有狀態應用的工作負載,每個 Pod 都有一個永久不變的 ID
-?DaemonSets 確保每個節點 node 上都運行有 pod,適用于需要在每個節點上部署的系統級任務:日志收集、節點監控(采集 CPU、內存、磁盤等指標),網絡插件(確保每個節點運行網絡組件,實現 Pod 間網絡互通),安全掃描工具等。
-?Jobs 一次性任務,運行完成后就會停止,CronJob 通過重復調度啟動一次性的 Job。
容器鏡像:一個隨時可以運行的軟件包, 包含運行應用程序所需的一切:代碼和它需要的所有運行時、應用程序和系統庫,以及一些基本設置的默認值。
引用依賴:一個工作負載依賴于另一個工作負載的運行狀態或輸出。
灰度發布:同時維護新舊版本,是將新版本逐漸推廣到生產環境中的一種發布策略。將一部分用戶路由到新版本,一部分用戶路由到舊版本,若新版本表現較好,則逐漸增加路由到新版本的用戶流量,直到所有用戶都使用新版本。
Scaling?擴縮容
-?Horizontal Scaling 垂直擴縮,將更多資源(例如:內存或 CPU)分配給已經為工作負載運行的 Pod,是通過替換容器鏡像來實現的。
-?Vertical Scaling 橫向擴縮,是通過改變工作負載中的副本數量來實現的。Pod 自動擴縮容實現為一個間歇運行的控制回路,默認間隔為 15 秒。在每個時間段內,控制器管理器都會根據每個 HorizontalPodAutoscaler 定義中指定的指標查詢資源利用率,進而計算出目標副本數。
3.??存儲
Volume 卷為 Pod 中的容器提供了一種通過文件系統訪問和共享數據的方式,數據共享可以發生在容器內不同本地進程之間,或在不同容器之間,或在多個 Pod 之間。容器中的文件在磁盤上是臨時存放的,而卷可以提供持久化存儲數據,這樣即使 Pod 重啟或被替換,存儲的數據仍然可用。當 Pod 被啟動時,容器中的進程看到的文件系統視圖是由它們的容器鏡像 的初始內容以及掛載在容器中的卷所組成的。
Storage Class?存儲類,可以理解為存儲系統的配置文件,定義了如何創建 PV,例如,使用哪種存儲卷(塊存儲或文件系統)。
Volume Snapshot?卷快照是數據卷在某個時間點的副本,可以用于創建新的數據卷或恢復數據卷到之前的狀態。卷快照是只讀的,可以被用來創建新的 PVC。
Persistent Volume 持久卷是集群中的一塊存儲資源,可以由管理員事先制備, 或者使用存儲類來動態制備。PVC 存儲聲明是用戶創建的,用于請求一定量的存儲空間,描述了所需的存儲空間的大小、訪問模式(例如,讀寫或只讀)和新建方式,會耗用 PV 資源。
4.??網絡
Pod:集群中的每個 Pod 都會獲得自己的、獨一無二的集群范圍 IP 地址。Pod 有自己的私有網絡命名空間,Pod 內的所有容器共享這個命名空間,?運行在同一個 Pod 中的不同容器的進程彼此之間可以通過?localhost?進行通信。
集群網絡 處理 Pod 之間的通信,所有 Pod 可以與所有其他 Pod?直接進行通信, 無論它們是在同一個節點還是在不同的節點上。
Service?為由一個或多個后端 Pod 實現的服務提供一個穩定長效的 IP 地址或主機名, 其中組成服務的各個 Pod 可以隨時變化。Service 的暴露方式是四層,只關心 TCP/UDP 協議的流量轉發,用 IP 端口暴露服務。
●?ClusterIP 通過集群的內部 IP 公開 Service,只能夠在集群內部訪問,可以使用 Ingress 或者 Gateway API 向公共互聯網公開服務。
●?NodePort 通過每個節點上的 IP 和靜態端口公開 Service,作用域可以為集群內或集群外,可以自由設置自己的負載均衡解決方案 。
●?LoadBalancer 使用云平臺的負載均衡器向外部公開 Service,來自外部負載均衡器的流量將被直接重定向到后端各個 Pod 上,是一種更簡單但可配置性較低的 Ingress 機制。
Ingress?為集群外部到集群內部服務提供 HTTP(S)?流量路由,并將流量分發到各個關聯的 service 上。Ingress 的暴露方式是七層,使用 URL 暴露服務,可以按權重/header/cookie?切分流量,從而將同一個 url 路由到多個服務中進行灰度發布。
5.??調度
在 Kubernetes 中,調度是指將 Pod 放置到合適的節點上,以便對應節點上的 Kubelet 能夠運行這些 Pod。調度器通過 Kubernetes 的監測機制來發現集群中新創建且尚未被調度到節點上的 Pod,然后選擇一個最佳節點來運行新創建的或尚未調度的 Pod。?
節點調度:pod 與節點間的調度策略
-?親和調度:將 Pod 調度到具有特定標簽或屬性的節點上
-?反親和調度:將 Pod 調度到不具有特定 CPU 架構/內存大小/存儲類型的節點上
可用區打散:打散策略將工作負載的 Pod 平均打散部署在各個可用區,提高應用的高可用性,至少需要兩個可用區。
Pod 調度:pod 間的調度策略
-?親和調度:將 Pod 調度到與其他 Pod 相同的節點上,以共享資源
-?反親和調度:確保多個 Pod 被調度到不同的節點上,以提高可用性
容忍調度:容忍度是指 Pod 對節點上的污點(節點上的資源不足/網絡不穩定/存儲空間不足)的容忍程度,容忍度可以被設置為:
-?NoSchedule:Pod 將不會被調度到具有該污點的節點上
-?PreferNoSchedule:Pod 將盡量避免被調度到具有該污點的節點上,但如果沒有其他選擇,仍然可以被調度到該節點上
-?NoExecute:Pod 將不會被調度到具有該污點的節點上,并且如果已經被調度到該節點上,將被驅逐