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發行版移植。
容器已經變得很流行,由於它們提供了額外的好處,好比:
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爲構建開發人員平臺提供了構建塊,可是在重要的地方保留了用戶的選擇和靈活性。
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
運行控制器的組件,從邏輯上講,每一個控制器都是一個單獨的進程,可是爲了下降複雜性,它們都被編譯成一個單一的二進制文件,並在一個進程中運行。
這些控制器包括:
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/