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 上運行應用程序。
  • 鬆散耦合、分佈式、彈性、解放的微服務:應用程序被分解成較小的獨立部分,並且可以動態部署和管理 - 而不是在一臺大型單機上整體運行。
  • 隔離:可預測的應用程序性能。
  • 資源利用:高效率和高密度

Kubernetes 可以爲您做些什麼?

通過現代的 Web 服務,用戶希望應用程序能夠 24/7 全天候使用,開發人員希望每天可以多次發佈部署新版本的應用程序。 容器化可以幫助軟件包達成這些目標,使應用程序能夠以簡單快速的方式發佈和更新,而無需停機。Kubernetes 幫助您確保這些容器化的應用程序在您想要的時間和地點運行,並幫助應用程序找到它們需要的資源和工具。Kubernetes 是一個可用於生產的開源平臺,根據 Google 容器集羣方面積累的經驗,以及來自社區的最佳實踐而設計。

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

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

Kubernetes 爲您提供:

  • 服務發現和負載均衡
    Kubernetes 可以使用 DNS 名稱或自己的 IP 地址公開容器,如果到容器的流量很大,Kubernetes 可以負載均衡並分配網絡流量,從而使部署穩定。
  • 存儲編排
    Kubernetes 允許您自動掛載您選擇的存儲系統,例如本地存儲、公共雲提供商等。
  • 自動部署和回滾
    您可以使用 Kubernetes 描述已部署容器的所需狀態,它可以以受控的速率將實際狀態更改爲所需狀態。例如,您可以自動化 Kubernetes 來爲您的部署創建新容器,刪除現有容器並將它們的所有資源用於新容器。
  • 自動二進制打包
    Kubernetes 允許您指定每個容器所需 CPU 和內存(RAM)。當容器指定了資源請求時,Kubernetes 可以做出更好的決策來管理容器的資源。
  • 自我修復
    Kubernetes 重新啓動失敗的容器、替換容器、殺死不響應用戶定義的運行狀況檢查的容器,並且在準備好服務之前不將其通告給客戶端。
  • 密鑰與配置管理
    Kubernetes 允許您存儲和管理敏感信息,例如密碼、OAuth 令牌和 ssh 密鑰。您可以在不重建容器鏡像的情況下部署和更新密鑰和應用程序配置,也無需在堆棧配置中暴露密鑰。

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 組件

Master 組件

Master 組件提供集羣的控制平面。Master 組件對集羣進行全局決策(例如,調度),並檢測和響應集羣事件(例如,當不滿足部署的 replicas 字段時,啓動新的 pod)。

Master 組件可以在集羣中的任何節點上運行。然而,爲了簡單起見,安裝腳本通常會啓動同一個計算機上所有 Master 組件,並且不會在計算機上運行用戶容器。

kube-apiserver

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

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

etcd

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

您的 Kubernetes 集羣的 etcd 數據庫通常需要有個備份計劃。

kube-scheduler

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

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

kube-controller-manager

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

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

這些控制器包括:

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

雲控制器管理器-(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 運行環境。

kubelet

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

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

kube-proxy

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

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

如果有 kube-proxy 可用,它將使用操作系統數據包過濾層。否則,kube-proxy 會轉發流量本身。

插件(Addons)

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

所選的插件如下所述:有關可用插件的擴展列表。
DNS

  • DNS儘管並非嚴格要求其他附加組件,但所有示例都依賴集羣 DNS,因此所有 Kubernetes 集羣都應具有 DNS。除了您環境中的其他 DNS 服務器之外,集羣 DNS 還是一個 DNS 服務器,它爲 Kubernetes 服務提供 DNS 記錄。

  • Cluster DNS 是一個 DNS 服務器,和您部署環境中的其他 DNS 服務器一起工作,爲 Kubernetes 服務提供DNS記錄。Kubernetes 啓動的容器自動將 DNS 服務器包含在 DNS 搜索中。
    用戶界面(Dashboard)
    Dashboard 是 Kubernetes 集羣的通用基於 Web 的 UI。它使用戶可以管理集羣中運行的應用程序以及集羣本身並進行故障排除。

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

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

Kubernetes 基礎模塊

  1. 創建一個 Kubernetes 集羣
    在這裏插入圖片描述
  2. 部署應用程序
    在這裏插入圖片描述
  3. 應用程序探索
    在這裏插入圖片描述
  4. 應用外部可見
    在這裏插入圖片描述
  5. 應用可擴展
    在這裏插入圖片描述
  6. 應用更新
    在這裏插入圖片描述

參考

Kubernetes跟着官方文檔從零構造
文檔地址:安裝kubeadm,kubelet和kubectl
學習 Kubernetes 基礎知識
Kubernetes手冊

發佈了78 篇原創文章 · 獲贊 34 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章