Kubernetes概述

1. Kubernetes是什麼

Kubernetes是一個可移植的、可擴展的、用於管理容器化工作負載和服務的開源平台,它簡化(促進)了聲明式配置和自動化。它有一個龐大的、快速增長的生態系統。Kubernetes的服務、支持和工具隨處可見。

Kubernetes一詞源於希臘語,意為舵手或飛行員。2014年,谷歌開放了Kubernetes項目的源代碼。Kubernetes基於谷歌在大規模運行生產工作負載方面的15年經驗,以及來自社區的最佳想法和實踐。

使用 Kubernetes, 我們可以快速高效地響應客戶需求:

  • 快速、可預測地部署你的應用程序
  • 擁有即時擴展應用程序的能力
  • 不影響現有業務的情況下,無縫地發布新功能
  • 優化硬件資源,降低成本

Kubernetes的目標是構建一個軟件和工具的生態系統,以減輕你在公共雲或私有雲運行應用程序的負擔。

1.1. 時光倒流

讓我們把時間回溯到從前,看看為什麼Kubernetes是如此有用。

傳統部署時代在早期,組織在物理服務器上運行應用程序。無法為物理服務器中的應用程序定義資源邊界,這導致了資源分配問題。例如,如果一個物理服務器上運行多個應用程序,那麼在某些情況下,一個應用程序將佔用大部分資源,從而導致其他應用程序性能下降。對此的解決方案是在不同的物理服務器上運行每個應用程序。但是,由於資源沒有得到充分利用,而且維護許多物理服務器的成本很高,所以無法進行擴展。

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

虛擬化可以更好地利用物理服務器中的資源,並提供更好的可伸縮性,因為可以方便地添加或更新應用程序,從而降低硬件成本,等等。通過虛擬化,你可以將一組物理資源表示為一次性虛擬機集群。

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

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

容器已經變得很流行,因為它們提供了額外的好處,比如:

  • 敏捷應用程序創建和部署:與使用VM鏡像相比,增加了容器鏡像創建的方便性和效率
  • 持續開發、集成和部署:提供可靠且頻繁的容器鏡像構建和部署,具有快速且輕鬆的回滾
  • 開發和運維關注點分離:在構建/發布時而不是部署時創建應用程序容器鏡像,從而將應用程序與基礎設施分離
  • 可觀察性:不僅能显示操作系統級的信息和指標,還能显示應用程序的健康狀況和其他信號
  • 跨開發、測試和生產的環境一致性:在筆記本電腦上運行與在雲上運行完全相同
  • 雲和操作系統發布的可移植性:運行在Ubuntu, RHEL, CoreOS, on-prem,谷歌Kubernetes引擎,和其他任何地方
  • 以應用程序為中心的管理:將抽象級別從在虛擬硬件上運行操作系統提高到使用邏輯資源在操作系統上運行應用程序
  • 鬆散耦合、分佈式、彈性、解放的微服務:應用程序被分解成更小的獨立部分,可以動態地部署和管理——而不是運行在一台大型單用途機器上的單片堆棧
  • 資源隔離:可預測的應用程序性能
  • 資源利用:效率高,密度大 

1.2. 為什麼需要Kubernetes?它能做什麼?

容器是捆綁和運行應用程序的好方法。在生產環境中,你需要管理運行應用程序的容器,並確保沒有停機時間。例如,如果一個容器發生故障,則需要啟動另一個容器。如果這個行為由一個系統來處理不是更容易嗎?

Kubernetes為你提供了一個能夠彈性地運行分佈式系統的框架。它負責處理應用程序的擴展和故障轉移,提供部署模式,等等。

Kubernetes為你提供:

服務發現和負載平衡

  Kubernetes可以使用DNS名稱或自己的IP地址公開容器。如果到容器的通信量很高,Kubernetes能夠實現負載平衡並分配網絡通信量,從而使部署保持穩定

存儲編排

  Kubernetes允許你自動掛載自己選擇的存儲系統,比如本地存儲、公有雲提供商等等

自動滾動更新和回滾

  可以使用Kubernetes描述所部署容器的期望狀態,並且可以以受控的速率將實際狀態更改為期望狀態

自動包裝

  你只需為Kubernetes提供一組節點,它便可以使用這些節點來運行容器化的任務。告訴Kubernetes每個容器需要多少CPU和內存(RAM)。Kubernetes可以在你的節點上放置容器,以充分利用你的資源。 

自動重啟 

  Kubernetes會重新啟動失敗的容器,替換容器,殺死不響應用戶定義的健康檢查的容器,並且在它們準備好服務之前不會將他們暴露給客戶端。

秘密和配置管理

  Kubernetes允許你存儲和管理敏感信息,比如密碼、OAuth令牌和ssh密鑰。你可以部署和更新秘密和應用程序配置,而無需重新構建容器映像,也無需在堆棧配置中公開秘密。 

1.3. Kubernetes不是什麼

Kubernetes不是一個傳統的、包羅萬象的PaaS(平台即服務)系統。由於Kubernetes是在容器級別而不是在硬件級別操作的,所以它提供了一些PaaS產品常見的通用特性,例如部署、擴展、負載平衡、日誌記錄和監視。但是,Kubernetes不是單片的,這些默認的解決方案是可選的和可插拔的。Kubernetes為構建開發人員平台提供了構建塊,但是在重要的地方保留了用戶的選擇和靈活性。

  • 不限制所支持的應用程序類型。Kubernetes的目標是支持非常多樣化的工作負載,包括無狀態、有狀態和數據處理工作負載。如果一個應用程序可以在容器中運行,那麼它應該可以在Kubernetes上運行。
  • 不部署源代碼,也不構建應用程序。持續集成、交付和部署(CI/CD)工作流由組織文化和偏好以及技術需求決定。
  • 不提供應用級服務,如中間件(例如消息總線)、數據處理框架(例如Spark)、數據庫(例如mysql)、緩存,也不提供集群存儲系統(例如Ceph)作為內置服務。這些組件可以運行在Kubernetes上,並且/或者可以由運行在Kubernetes上的應用程序通過可移植的機制(如Open Service Broker)訪問。
  • Kubernetes 允許用戶選擇其他的日誌記錄,監控和告警系統 
  • 不提供也不強制要求配置語言/系統(例如,jsonnet)。它提供了一個聲明性API,可以被任意形式的聲明性規範作為目標。
  • 不提供也不採用任何全面的機器配置、維護、管理或自修復系統。
  • 此外,Kubernetes不僅僅是一個編排系統。事實上,它消除了對編排的需要。編排的技術定義是執行一個已定義的工作流:首先執行a,然後執行B,然後執行c。相反,Kubernetes包括一套獨立、可組合的控制過程,通過聲明式語法使其連續地朝着期望狀態驅動當前狀態。你怎麼從A點到c點都不重要,只要告訴到C的狀態即可。 

2. Kubernetes組件

當你部署Kubernetes的時候,你會得到一個集群。

一個集群是一組機器,稱為節點(nodes),它們運行由Kubernetes管理的容器化應用程序。

一個集群至少有一個工作節點(worker node)和一個主節點(master node)。

工作節點承載應用程序的組件。主節點管理集群中的工作節點和pods。多個主節點用於提供具有故障轉移和高可用性的集群。

下面是Kubernetes集群的關係圖: 

2.1. Master組件

Master組件提供集群的控制面板。Master組件對集群做出全局決策(例如,調度),Master組件檢測並響應集群事件(例如,當部署的replicas字段不滿足時啟動一個新的pod)

Master組件可以在集群中的任何機器上運行。但是,為了簡單起見,設置腳本通常在同一台機器上啟動所有Master組件,並且不在這台機器上運行用戶容器。

kube-apiserver 

  API服務器是一個Kubernetes面板控制組件,用於公開Kubernetes API。它是Kubernetes控制面板的前端。

  Kubernetes API服務器的主要實現是kube-apiserver。kube-apiserver被設計成水平伸縮——也就是說,它通過部署更多實例來伸縮。你可以運行kube-apiserver的多個實例,並在這些實例之間平衡流量。

etcd 

  一致性和高可用的鍵值存儲用作Kubernetes的所有集群數據備份存儲。

  如果你的Kubernetes集群使用etcd作為其備份存儲,請確保對這些數據有備份計劃。

kube-scheduler

  監視沒有分配節點的新創建的pod,併為它們選擇要運行的節點。 

kube-controller-manager

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

這些控制器包括:

  • Node Controller:節點控制器負責發現和響應節點故障
  • Replication Controller:副本控制器負責為系統中的每個副本控制器對象維護正確的pod數量
  • Endpoints Controller:端點控制器填充端點對象(即,連接服務和pod)
  • Service Account & Token Controllers:為新的名稱空間創建默認帳戶和API訪問令牌 

cloud-controller-manager 

  雲控制器-管理器,運行與底層雲提供商交互的控制器

2.2. Node組件

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

kubelet

  kubelet是一個代理,它運行在集群中的每個節點上,它確保容器在一個pod中運行。kubelet只管理由Kubernetes創建的容器。 

kube-proxy

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

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

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

Container Runtime

  容器運行時是負責運行容器的軟件。

  Kubernetes支持多個容器運行時:DockercontainerdcriorktletKubernetes CRI(容器運行時接口)的任何實現。 

2.3. Addons(插件)

DNS

  雖然其他插件不是嚴格要求的,但所有Kubernetes集群都應該有集群DNS,因為許多示例都依賴於它。

Web UI (Dashboard)

  Dashboard是一個通用的、基於web的Kubernetes集群用戶界面。它允許用戶管理和排除集群中運行的應用程序和集群本身的故障。

Container Resource Monitoring

  容器資源監控記錄中央數據庫中容器的一般時間序列指標,並提供用於瀏覽該數據的UI。

Cluster-level Logging

  集群級別的日誌記錄機制負責將容器日誌保存到具有搜索/瀏覽界面的中央日誌存儲中。

3. 回顧&小結

Kubernetes:

  • 可移植: 無論公有雲、私有雲、混合雲還是多雲架構都全面支持
  • 可擴展: 它是模塊化、可插拔、可掛載、可組合的,支持各種形式的擴展
  • 自修復: 它可以自保持應用狀態、可自重啟、自複製、自縮放的,通過聲明式語法提供了強大的自修復能力

Kubernetes建立在Google公司15年的運維經驗基礎之上,Google所有的應用都運行在容器上 

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※想知道網站建置網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計後台網頁設計

※不管是台北網頁設計公司台中網頁設計公司,全省皆有專員為您服務

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※帶您來看台北網站建置台北網頁設計,各種案例分享

小三通物流營運型態?

※快速運回,大陸空運推薦?

您可能也會喜歡…