Kubernetes概述

1. Kubernetes是什麼前端

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

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

使用 Kubernetes, 咱們能夠快速高效地響應客戶需求:web

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

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

1.1. 時光倒流數據庫

讓咱們把時間回溯到從前,看看爲何Kubernetes是如此有用。json

傳統部署時代在早期,組織在物理服務器上運行應用程序。沒法爲物理服務器中的應用程序定義資源邊界,這致使了資源分配問題。例如,若是一個物理服務器上運行多個應用程序,那麼在某些狀況下,一個應用程序將佔用大部分資源,從而致使其餘應用程序性能降低。對此的解決方案是在不一樣的物理服務器上運行每一個應用程序。可是,因爲資源沒有獲得充分利用,並且維護許多物理服務器的成本很高,因此沒法進行擴展。api

虛擬化部署時代做爲一種解決方案,引入了虛擬化。它容許你在單個物理服務器的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全部的應用都運行在容器上 

 

https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/ 

相關文章
相關標籤/搜索