Kubernetes 學習筆記----001整體概念和概述學習

Kubernetes 學習筆記----001整體概念和概述學習

Kubernetes 概念部分學習

概述

要使用 Kubernetes,你需要用 Kubernetes API 對象 來描述集羣的 預期狀態(desired state) :包括你需要運行的應用或者負載,它們使用的鏡像、副本數,以及所需網絡和磁盤資源等等。你可以使用命令行工具 kubectl 來調用 Kubernetes API 創建對象,通過所創建的這些對象來配置預期狀態。你也可以直接調用 Kubernetes API 和集羣進行交互,設置或者修改預期狀態。

一旦設置了所需的目標狀態,Kubernetes 控制面(control plane) 會通過 Pod 生命週期事件生成器(PLEG),促成集羣的當前狀態符合其預期狀態。爲此,Kubernetes 會自動執行各類任務,比如運行或者重啓容器、調整給定應用的副本數等等。Kubernetes 控制面由一組運行在集羣上的進程組成:

  • Kubernetes 主控組件(Master) 包含三個進程,都運行在集羣中的某個節上,主控組件通常這個節點被稱爲 master 節點。這些進程包括:kube-apiserverkube-controller-managerkube-scheduler
  • 集羣中的每個非 master 節點都運行兩個進程:
    • kubelet,和 master 節點進行通信。
    • kube-proxy,一種網絡代理,將 Kubernetes 的網絡服務代理到每個節點上。(底層是下發iptables規則實現)

Kubernetes 對象

Kubernetes 包含若干用來表示系統狀態的抽象層,包括:已部署的容器化應用和負載、與它們相關的網絡和磁盤資源以及有關集羣正在運行的其他操作的信息。這些抽象使用 Kubernetes API 對象來表示。有關更多詳細信息,請參閱瞭解 Kubernetes 對象

基本的 Kubernetes 對象包括:

  • Pod ----(個人註解:最小資源實例
  • Service -----(個人註解:對外提供服務,負載均衡入口,有配置可查
  • Volume
  • Namespace

Kubernetes 也包含大量的被稱作 Controller 的高級抽象。控制器基於基本對象構建並提供額外的功能和方便使用的特性。具體包括:

Kubernetes 控制面

關於 Kubernetes 控制平面的各個部分,(如 Kubernetes 主控組件和 kubelet 進程),管理着 Kubernetes 如何與你的集羣進行通信。控制平面維護着系統中所有的 Kubernetes 對象的狀態記錄,並且通過連續的控制循環來管理這些對象的狀態。在任意的給定時間點,控制面的控制環都能響應集羣中的變化,並且讓系統中所有對象的實際狀態與你提供的預期狀態相匹配。

比如, 當你通過 Kubernetes API 創建一個 Deployment 對象,你就爲系統增加了一個新的目標狀態。Kubernetes 控制平面記錄着對象的創建,並啓動必要的應用然後將它們調度至集羣某個節點上來執行你的指令,以此來保持集羣的實際狀態和目標狀態的匹配。

Kubernetes Master 節點

Kubernetes master 節點負責維護集羣的目標狀態。當你要與 Kubernetes 通信時,使用如 kubectl 的命令行工具,就可以直接與 Kubernetes master 節點進行通信。

“master” 是指管理集羣狀態的一組進程的集合。通常這些進程都跑在集羣中一個單獨的節點上,並且這個節點被稱爲 master 節點。master 節點也可以擴展副本數,來獲取更好的可用性及冗餘。

Kubernetes Node 節點

集羣中的 node 節點(虛擬機、物理機等等)都是用來運行你的應用和雲工作流的機器。Kubernetes master 節點控制所有 node 節點;你很少需要和 node 節點進行直接通信。

***個人註解:使用kubectl get pods --all-namespaces -o wide 選項 -o wide 顯示詳細信息可以看到相關pod 所在的node節點,實際運維中,會遇到 單個node 節點故障影響服務的狀態;***

Kubernetes 是什麼?——kubernetes概述

此頁面是 Kubernetes 的概述。

Kubernetes 是一個可移植的、可擴展的開源平臺,用於管理容器化的工作負載和服務,可促進聲明式配置和自動化。Kubernetes 擁有一個龐大且快速增長的生態系統。Kubernetes 的服務、支持和工具廣泛可用。

名稱 Kubernetes 源於希臘語,意爲 “舵手” 或 “飛行員”。Google 在 2014 年開源了 Kubernetes 項目。Kubernetes 建立在 Google 在大規模運行生產工作負載方面擁有十幾年的經驗的基礎上,結合了社區中最好的想法和實踐。

言歸正傳

讓我們回顧一下爲什麼 Kubernetes 如此有用。

傳統部署時代: 早期,組織在物理服務器上運行應用程序。無法爲物理服務器中的應用程序定義資源邊界,這會導致資源分配問題。例如,如果在物理服務器上運行多個應用程序,則可能會出現一個應用程序佔用大部分資源的情況,結果可能導致其他應用程序的性能下降。一種解決方案是在不同的物理服務器上運行每個應用程序,但是由於資源利用不足而無法擴展,並且組織維護許多物理服務器的成本很高。

虛擬化部署時代: 作爲解決方案,引入了虛擬化功能,它允許您在單個物理服務器的 CPU 上運行多個虛擬機(VM)。虛擬化功能允許應用程序在 VM 之間隔離,並提供安全級別,因爲一個應用程序的信息不能被另一應用程序自由地訪問。

因爲虛擬化可以輕鬆地添加或更新應用程序、降低硬件成本等等,所以虛擬化可以更好地利用物理服務器中的資源,並可以實現更好的可伸縮性。

每個 VM 是一臺完整的計算機,在虛擬化硬件之上運行所有組件,包括其自己的操作系統。

容器部署時代: 容器類似於 VM,但是它們具有輕量級的隔離屬性,可以在應用程序之間共享操作系統(OS)。因此,容器被認爲是輕量級的。容器與 VM 類似,具有自己的文件系統、CPU、內存、進程空間等。由於它們與基礎架構分離,因此可以跨雲和 OS 分發進行移植。

容器因具有許多優勢而變得流行起來。下面列出了容器的一些好處:

  • 敏捷應用程序的創建和部署:與使用 VM 鏡像相比,提高了容器鏡像創建的簡便性和效率。
  • 持續開發、集成和部署:通過快速簡單的回滾(由於鏡像不可變性),提供可靠且頻繁的容器鏡像構建和部署。
  • 關注開發與運維的分離:在構建/發佈時而不是在部署時創建應用程序容器鏡像,從而將應用程序與基礎架構分離。
  • 可觀察性不僅可以顯示操作系統級別的信息和指標,還可以顯示應用程序的運行狀況和其他指標信號。
  • 跨開發、測試和生產的環境一致性:在便攜式計算機上與在雲中相同地運行。
  • 雲和操作系統分發的可移植性:可在 Ubuntu、RHEL、CoreOS、本地、Google Kubernetes Engine 和其他任何地方運行。
  • 以應用程序爲中心的管理:提高抽象級別,從在虛擬硬件上運行 OS 到使用邏輯資源在 OS 上運行應用程序。
  • 鬆散耦合、分佈式、彈性、解放的微服務:應用程序被分解成較小的獨立部分,並且可以動態部署和管理 - 而不是在一臺大型單機上整體運行。
  • 資源隔離:可預測的應用程序性能。
  • 資源利用:高效率和高密度。

個人註解:這裏需要理解,傳統的物理機部署 , 虛擬化 vm 部署 ,容器化部署 三種部署模式下,受到各自技術特點,會有有的優缺點,進一步理解虛擬化技術和容器化技術的優勢和適用場景;

爲什麼需要 Kubernetes,它能做什麼?

容器是打包和運行應用程序的好方式。在生產環境中,您需要管理運行應用程序的容器,並確保不會停機。例如,如果一個容器發生故障,則需要啓動另一個容器。如果系統處理此行爲,會不會更容易?

這就是 Kubernetes 的救援方法!Kubernetes 爲您提供了一個可彈性運行分佈式系統的框架。Kubernetes 會滿足您的擴展要求、故障轉移、部署模式等。例如,Kubernetes 可以輕鬆管理系統的 Canary 部署。

Kubernetes 爲您提供:

  • 服務發現和負載均衡
    Kubernetes 可以使用 DNS 名稱或自己的 IP 地址公開容器,如果到容器的流量很大,Kubernetes 可以負載均衡並分配網絡流量,從而使部署穩定。

  • 存儲編排
    Kubernetes 允許您自動掛載您選擇的存儲系統,例如本地存儲、公共雲提供商等。

  • 自動部署和回滾
    您可以使用 Kubernetes 描述已部署容器的所需狀態,它可以以受控的速率將實際狀態更改爲所需狀態。例如,您可以自動化 Kubernetes 來爲您的部署創建新容器,刪除現有容器並將它們的所有資源用於新容器。

  • 自動二進制打包
    Kubernetes 允許您指定每個容器所需 CPU 和內存(RAM)。當容器指定了資源請求時,Kubernetes 可以做出更好的決策來管理容器的資源。

  • 自我修復
    Kubernetes 重新啓動失敗的容器、替換容器、殺死不響應用戶定義的運行狀況檢查的容器,並且在準備好服務之前不將其通告給客戶端。

  • 密鑰與配置管理
    Kubernetes 允許您存儲和管理敏感信息,例如密碼、OAuth 令牌和 ssh 密鑰。您可以在不重建容器鏡像的情況下部署和更新密鑰和應用程序配置,也無需在堆棧配置中暴露密鑰。

個人註解:分佈式 容器 管理平臺,運維人員不用直接管理容器,依賴kubernetes 完成管理;

Kubernetes 不是什麼

Kubernetes 不是傳統的、包羅萬象的 PaaS(平臺即服務)系統。由於 Kubernetes 在容器級別而不是在硬件級別運行,因此它提供了 PaaS 產品共有的一些普遍適用的功能,例如部署、擴展、負載均衡、日誌記錄和監視。但是,Kubernetes 不是單一的,默認解決方案是可選和可插拔的。Kubernetes 提供了構建開發人員平臺的基礎,但是在重要的地方保留了用戶的選擇和靈活性。

Kubernetes:

  • Kubernetes 不限制支持的應用程序類型。Kubernetes 旨在支持極其多種多樣的工作負載,包括無狀態、有狀態和數據處理工作負載。如果應用程序可以在容器中運行,那麼它應該可以在 Kubernetes 上很好地運行。

  • Kubernetes 不部署源代碼,也不構建您的應用程序。持續集成(CI)、交付和部署(CI/CD)工作流取決於組織的文化和偏好以及技術要求。

  • Kubernetes 不提供應用程序級別的服務作爲內置服務,例如中間件(例如,消息中間件)、數據處理框架(例如,Spark)、數據庫(例如,mysql)、緩存、集羣存儲系統(例如,Ceph)。這樣的組件可以在 Kubernetes 上運行,並且/或者可以由運行在 Kubernetes 上的應用程序通過可移植機制(例如,開放服務代理)來訪問。

  • Kubernetes 不指定日誌記錄、監視或警報解決方案。它提供了一些集成作爲概念證明,並提供了收集和導出指標的機制。

  • Kubernetes 不提供或不要求配置語言/系統(例如 jsonnet),它提供了聲明性 API,該聲明性 API 可以由任意形式的聲明性規範所構成。

  • Kubernetes 不提供也不採用任何全面的機器配置、維護、管理或自我修復系統。

  • 此外,Kubernetes 不僅僅是一個編排系統,實際上它消除了編排的需要。編排的技術定義是執行已定義的工作流程:首先執行 A,然後執行 B,再執行 C。相比之下,Kubernetes 包含一組獨立的、可組合的控制過程,這些過程連續地將當前狀態驅動到所提供的所需狀態。從 A 到 C 的方式無關緊要,也不需要集中控制,這使得系統更易於使用且功能更強大、健壯、彈性和可擴展性。

Kubernetes 組件

當部署完 Kubernetes, 即擁有了一個完整的集羣。

一個 Kubernetes 集羣包含 集羣由一組被稱作節點的機器組成。這些節點上運行 Kubernetes 所管理的容器化應用。集羣具有至少一個工作節點和至少一個主節點。(***註解:master節點和node節點***)

工作節點託管作爲應用程序組件的 Pod 。主節點管理集羣中的工作節點和 Pod 。多個主節點用於爲集羣提供故障轉移和高可用性。

本文檔概述了交付正常運行的 Kubernetes 集羣所需的各種組件。

這張圖表展示了包含所有相互關聯組件的 Kubernetes 集羣。

控制平面組件(Control Plane Components)

控制平面的組件對集羣做出全局決策(比如調度),以及檢測和響應集羣事件(例如,當不滿足部署的 replicas 字段時,啓動新的 pod)。

控制平面組件可以在集羣中的任何節點上運行。然而,爲了簡單起見,設置腳本通常會在同一個計算機上啓動所有控制平面組件,並且不會在此計算機上運行用戶容器。請參閱構建高可用性集羣中對於多主機 VM 的設置示例。

kube-apiserver

主節點上負責提供 Kubernetes API 服務的組件;它是 Kubernetes 控制面的前端。

kube-apiserver 在設計上考慮了水平擴縮的需要。 換言之,通過部署多個實例可以實現擴縮。 參見構造高可用集羣

systemctl status kube-apiserver.service

etcd

etcd 是兼具一致性和高可用性的鍵值數據庫,可以作爲保存 Kubernetes 所有集羣數據的後臺數據庫。

您的 Kubernetes 集羣的 etcd 數據庫通常需要有個備份計劃。要了解 etcd 更深層次的信息,請參考 etcd 文檔

systemctl status [email protected]

kube-scheduler

主節點上的組件,該組件監視那些新創建的未指定運行節點的 Pod,並選擇節點讓 Pod 在上面運行。

調度決策考慮的因素包括單個 Pod 和 Pod 集合的資源需求、硬件/軟件/策略約束、親和性和反親和性規範、數據位置、工作負載間的干擾和最後時限。

systemctl status kube-scheduler.service

kube-controller-manager

在主節點上運行控制器的組件。

從邏輯上講,每個控制器都是一個單獨的進程,但是爲了降低複雜性,它們都被編譯到同一個可執行文件,並在一個進程中運行。

這些控制器包括:

  • 節點控制器(Node Controller): 負責在節點出現故障時進行通知和響應。
  • 副本控制器(Replication Controller): 負責爲系統中的每個副本控制器對象維護正確數量的 Pod。
  • 端點控制器(Endpoints Controller): 填充端點(Endpoints)對象(即加入 Service 與 Pod)。
  • 服務帳戶和令牌控制器(Service Account & Token Controllers): 爲新的命名空間創建默認帳戶和 API 訪問令牌.

systemctl status kube-controller-manager.service

雲控制器管理器-(cloud-controller-manager)

cloud-controller-manager 運行與基礎雲提供商交互的控制器。cloud-controller-manager 二進制文件是 Kubernetes 1.6 版本中引入的 alpha 功能。

cloud-controller-manager 僅運行雲提供商特定的控制器循環。您必須在 kube-controller-manager 中禁用這些控制器循環,您可以通過在啓動 kube-controller-manager 時將 --cloud-provider 參數設置爲 external 來禁用控制器循環。

cloud-controller-manager 允許雲供應商的代碼和 Kubernetes 代碼彼此獨立地發展。在以前的版本中,核心的 Kubernetes 代碼依賴於特定雲提供商的代碼來實現功能。在將來的版本中,雲供應商專有的代碼應由雲供應商自己維護,並與運行 Kubernetes 的雲控制器管理器相關聯。

以下控制器具有云提供商依賴性:

  • 節點控制器(Node Controller): 用於檢查雲提供商以確定節點是否在雲中停止響應後被刪除
  • 路由控制器(Route Controller): 用於在底層雲基礎架構中設置路由
  • 服務控制器(Service Controller): 用於創建、更新和刪除雲提供商負載均衡器
  • 數據卷控制器(Volume Controller): 用於創建、附加和裝載卷、並與雲提供商進行交互以編排卷

Node 組件

節點組件在每個節點上運行,維護運行的 Pod 並提供 Kubernetes 運行環境。

kubectl get nodes --all-namespaces

kubelet

一個在集羣中每個節點上運行的代理。它保證容器都運行在 Pod 中。

kubelet 接收一組通過各類機制提供給它的 PodSpecs,確保這些 PodSpecs 中描述的容器處於運行狀態且健康。kubelet 不會管理不是由 Kubernetes 創建的容器。

systemctl status kubelet.service

kube-proxy

kube-proxy 是集羣中每個節點上運行的網絡代理,實現 Kubernetes Service 概念的一部分。

kube-proxy 維護節點上的網絡規則。這些網絡規則允許從集羣內部或外部的網絡會話與 Pod 進行網絡通信。

如果操作系統提供了數據包過濾層並可用的話,kube-proxy會通過它來實現網絡規則。否則,kube-proxy 僅轉發流量本身。

systemctl status kube-proxy.service

容器運行環境(Container Runtime)

容器運行環境是負責運行容器的軟件。

Kubernetes 支持多個容器運行環境: Dockercontainerdcri-orktlet 以及任何實現 Kubernetes CRI (容器運行環境接口)

插件(Addons)

插件使用 Kubernetes 資源 (DaemonSet, Deployment等) 實現集羣功能。因爲這些提供集羣級別的功能,所以插件的命名空間資源屬於 kube-system 命名空間。

所選的插件如下所述:有關可用插件的擴展列表,請參見插件 (Addons)

DNS

儘管並非嚴格要求其他附加組件,但所有示例都依賴集羣 DNS,因此所有 Kubernetes 集羣都應具有 DNS。

除了您環境中的其他 DNS 服務器之外,集羣 DNS 還是一個 DNS 服務器,它爲 Kubernetes 服務提供 DNS 記錄。

Cluster DNS 是一個 DNS 服務器,和您部署環境中的其他 DNS 服務器一起工作,爲 Kubernetes 服務提供DNS記錄。

Kubernetes 啓動的容器自動將 DNS 服務器包含在 DNS 搜索中。

DNS在kubernetes 中非常重要,很多pod 對應的域名都需要dns解析,並且當前運維環境中,dns 物理機是選擇的對應的node節點;

用戶界面(Dashboard)

Dashboard 是 Kubernetes 集羣的通用基於 Web 的 UI。它使用戶可以管理集羣中運行的應用程序以及集羣本身並進行故障排除。

容器資源監控

容器資源監控將關於容器的一些常見的時間序列度量值保存到一個集中的數據庫中,並提供用於瀏覽這些數據的界面。

集羣層面日誌

集羣層面日誌 機制負責將容器的日誌數據保存到一個集中的日誌存儲中,該存儲能夠提供搜索和瀏覽接口。

A Kubernetes cluster consists of 集羣由一組被稱作節點的機器組成。這些節點上運行 Kubernetes 所管理的容器化應用。集羣具有至少一個工作節點和至少一個主節點。

工作節點託管作爲應用程序組件的 Pod 。主節點管理集羣中的工作節點和 Pod 。多個主節點用於爲集羣提供故障轉移和高可用性。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章