應用程式部署的演變過程
在部署應用程式的方式上,主要經歷了三個時代
- 傳統部署
網際網路早期,會直接將應用程式部署在物理機上
優點: 簡單,不需要其他技術的參與
缺點: 不能為應用程式定義資源使用邊界,很難合理的分配計算資源,而且程式之間容易產生影響
- 虛擬化部署
可以在一臺物理機上執行多個虛擬機器,每個虛擬機器都是一個獨立的環境
優點: 程式環境不會互相產生影響,提供了一定程式的安全性
缺點: 增加了作業系統,浪費了部分資源
- 容器化部署
與虛擬化類似,但是共享了作業系統
優點: 可以保證每個容器擁有自己的檔案系統,cpu,記憶體,程序空間等;執行應用程式所需要的資源都被容器包裝,並和底層基礎架構解藕;容器化的應用程式可以跨雲服務商,跨linux作業系統發行版進行部署
缺點: 一系列容器的管理問題,統稱為容器編排問題,為了解決這些容器編排問題,就產生了一些容器編排的軟體
“解耦”(Decoupling)是軟體開發和系統設計中一個常見的概念,指的是降低系統中不同部分之間的依賴程度,以便每個部分都可以更獨立地開發、測試、修改和擴充套件。當談到“和底層基礎架構解耦”時,這通常意味著將應用程式或服務的邏輯與其底層基礎設施(如資料庫、訊息佇列、雲服務等)的實現細節分離開來。
kubernetes的介紹
什麼是kubernetes
kubernetes本質是一組伺服器叢集。
他可以在叢集的每個節點上執行特定的程式,來對節點中的容器進行管理。他的目的就是實現資源管理的自動化。
kubernetes的主要功能:
- 自我修復:一單摸個容器崩潰,就能在1妙鐘左右迅速啟動新的容器
- 彈性伸縮:可以根據需要,自動對叢集中正在執行的容器數量進行調整
- 讀物發現:服務可以透過自動發現的形式找到它所依賴的服務
- 負載均衡:如果一個服務啟動了多個容器,能夠自動實現請求的負載均衡
- 版本回退,如果發現新發布的程式版本有問題,可以立即回退到原來的版本
- 儲存編排:可以根據容器自身的需求自動建立儲存卷
kubernetes的元件
一個kubernetes叢集主要是由控制節點,工作節點構成。每個節點上安裝的元件不同。
- master:叢集的控制平面,負責叢集的決策
- ApiServer:資源操作的唯一入口,接受使用者輸入的命令,提供認證、授權、API註冊和發現等機制
- Scheduler:負責叢集資源排程,按照預定的排程策略將pod排程到相應的node節點上
- ControllerManager:負責維護叢集的狀態,比如程式部署安裝,故障檢測,自動擴充套件,滾動更新等
- Etcd:負責儲存叢集中各種資源物件的資訊
- node:叢集的工作平面,負責為容器提供執行環境
- Kubelet:負責維護容器的生命週期,即透過控制docker,來建立、更新、銷燬容器
- KubeProxy:負責提供叢集內部的服務發現和負載均衡
- Docker:負責節點上容器的各種操作
例項:
部署一個nginx服務來說明kubernetes系統各個元件的呼叫關係
- 一旦kubernetes環境啟動之後,master和node都會將自身的資訊儲存在etcd中。(因為要知道誰決策,誰工作)
- 一個nginx服務的安裝請求首先會被髮送到master節點的ApiServer元件。
- ApiServer元件會呼叫schedule元件來決定到底把服務安裝到哪個node節點上(scheduler元件會去etcd讀取各個node節點的資訊,然後按照一定的演算法進行選擇,並將結果告知aoiserver)
- apiserver元件會呼叫controller-manager元件,去排程node節點安裝nginx服務
- node節點上的kubelet元件接受到指令後,會通知docker,然後由dicker來啟動一個nginx的pod。(pod是kubernetes中一個最小的操作單元,容器必須跑在pod中)
- 【nginx服務搭建完成】
- 訪問ngixn,需要透過node節點上的kubu-proxy來對pod產生訪問代理。外界使用者才可以訪問叢集中的nginx服務
kubernetes的概念
- master:叢集控制節點,每個叢集需要至少一個master節點負責叢集的管控
- node:工作負責節點,由master分配容器到這些node工作節點上,然後node節點上的docker負責容器的執行
- pod:kubernetes的最小控制單元,容器都是執行在pod中,一個pod中可以有1個或者多個容器
- controller:控制器,透過它來實現對pod的管理,比如啟動pod、停止pod、伸縮pod的數量dd等等
- service:pod對外服務的同意入口,下面可以維護著同一類的多個pod
- label:標籤,用於對pod進行分類,同一類的pod會擁有相同的標籤
- namspace:名稱空間,用來隔離pod的執行環境