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支持多個容器運行時:Docker、containerd、crio、rktlet和Kubernetes 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所有的應用都運行在容器上
https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/55425.html
標籤:其他
上一篇:Kubernetes 環境搭建
