20200115 k8s的原理

Docker:開源的容器引擎。

Images(Docker鏡像)

Container(容器)容器是鏡像的可運行實例。鏡像和容器的關係有點類似於面向對象中,類和對象的關係。

Docker Registry是一個集中存儲與分發鏡像的服務。構建完Docker鏡像後,就可在當前宿主機上運行。但如果想要在其他機器上運行這個鏡像,就需要手動複製。此時可藉助Docker Registry來避免鏡像的手動複製。

一個Docker Registry(看作Maven倉庫)可包含多個Docker倉庫(看作jar包路徑),每個倉庫可包含多個鏡像標籤(看作jar包版本號),每個標籤對應一個Dokcer鏡像。

Docker Registry可分爲公有(Docker Hub)和私有。

 

爲什麼需要 k8s?容器集羣管理系統

應用部署模式的演進:虛擬化模式,容器化模式。容器內的應用程序進程直接運行在宿主機(真實物理機)的內核上.傳統:虛擬出的虛擬機裝操作系統、Docker:容器引擎管理下的容器。

相比虛擬機 1)容器更加輕量級,啓動更快(秒級);2)容器可移植性更好。

微服務運行在容器中。把鏡像運行在容器中。

管理大量的容器帶來了新的挑戰,容器編排調度引擎 k8s。

優勢:簡化應用部署;提高硬件資源利用率;健康檢查和自修復;自動擴容縮容;服務發現和負載均衡。

k8s的集羣架構1)主節點,承載 k8s 的控制和管理整個集羣系統的控制面板;2)工作節點,運行用戶實際的應用。

pod:k8s 調度的最小單元。

1)pod 相當與邏輯主機,每個 pod 都有自己的 IP 地址;

2)pod 內的容器共享相同的 IP 和端口空間;

3)默認情況下,每個容器的文件系統與其他容器完全隔離;

 

k8s是一個編排容器的工具,其實也是管理應用的生命週期的一個工具,從創建應用,應用的部署,應用提供服務,擴容縮容應用,應用更新,都非常的方便,而且可以做到故障自愈,例如一個服務器掛了,可以自動將這個服務器上的服務調度到另外一個主機上進行運行,無需進行人工干涉。

k8s可以更快的更新新版本,打包應用,更新的時候可以做到不用中斷服務,服務器故障不用停機,從開發環境到測試環境到生產環境的遷移極其方便,一個配置文件搞定,一次生成image,到處運行。

 

k8s的全生命週期管理

在k8s進行管理應用的時候,基本步驟是:創建集羣,部署應用,發佈應用,擴展應用,更新應用。

 

1、創建集羣:爲什麼要使用集羣?( k8s集羣 )

要想屏蔽底層的細節,增強可靠性和穩定性,從而需要創建集羣。統一對外提供接口,無須進行各種複雜的調用。提供更好的性能,組合集羣中各個機器的計算存儲網絡資源,提供更好的TPS和PS;提供橫向擴容的能力,在進行橫向擴容的時候,性能基本上能呈線性增長。

在k8s只要使用兩條指令就可以創建一個集羣,一個是kubectl init進行初始化,創建一個master節點,第二條指令就是kubectl join xxx創建一個node節點,加入這個集羣。

在這邊可以看到k8s在物理上進行劃分的時候,劃分了兩種類型的主機,一個master節點,主要用來調度,控制集羣的資源等功能;而node節點,主要是用來運行容器的節點,也就是運行服務的節點。

主節點和從結點的功能不同。 

其實集羣都差不多,master用來控制,用來存儲各種元數據,node節點是一個工作節點,真正來幹活的;node節點定時與master進行通信,通過kubelet進程來彙報信息。

 

2、部署應用

使用集羣的主要目標是啥?用來提供服務,讓開發開發的應用程序能在集羣上運行,從而需要讓開發能運行一個應用來進行測試。

在開發完成程序之後,需要將程序打包成image,然後放到registry中,然後就能夠運行應用了。

在k8s裏面,集羣調度的最小單元就是一個pod,一個pod可以是一個容器,也可以是多個容器,例如你運行一個程序,其中使用了nginx,使用mysql了,使用了jetty,那麼可以將這三個使用在同一個pod中,對他們提供統一的調配能力,一個pod只能運行在一個主機上,而一個主機上可以有多個pod。

pod,相當於一個邏輯主機,還記得創建一個vm,在vm上運行幾個進程麼,其實道理是一樣的,pod的存在主要是讓幾個緊密連接的幾個容器之間共享資源,例如ip地址,共享存儲等信息。如果直接調度容器的話,那麼幾個容器可能運行在不同的主機上,這樣就增加了系統的複雜性。

 

3、發佈應用

發佈應用主要就是對外提供服務,可能會有人提出疑問,我都運行了服務,爲什麼還不能提供服務,這是因爲在集羣當中,創建的ip地址等資源,只有在同一個集羣中才能訪問,每個pod也有獨一的ip地址,當有多個pod提供相同的服務的時候,就需要有負載均衡的能力,從而這裏就涉及到一個概念就是service,專門用來提供服務的。

服務主要是用來提供外界訪問的接口,服務可以關聯一組pod,這些pod的ip地址各不相同,而service相當於一個複雜均衡的vip,用來指向各個pod,當pod的ip地址發生改變之後,也能做到自動進行負載均衡,在關聯的時候,service和pod之間主要通過label來關聯,也就是標籤。

4、 擴容縮容。在業務上線之後,碰到了雙十一怎麼辦?擴容。。。萬劍歸宗,只要有一個pod,那麼就可以產生無數個pod。

 

k8s的基本入門,其實算是一種用戶視角,只是用來演示如何使用k8s,怎麼提高了生產力而已。

在給客戶演示的時候,爲啥要選擇k8s?主要就是如何提高了發佈的效率,更新版本的效率,更方便更快捷的上線新版本。舵手或飛行員.

 

我們用kubernetes去管理Docker集羣,即可以將Docker看成Kubernetes內部使用的低級別組件。

 

Cluster 集羣,Node 結點,結點分爲主結點(master)和工作結點(worker)。Pod K8s中的工作單元,K8s是以Pod而非容器爲單位排程的。Pod可以理解爲Docker單機環境,每個Pod中包含一至多個容器,總是被啓動在一個結點;一個Pod的容器在K8s集羣中有相同的地址和端口範圍,即容器暴露於K8s集羣的端口號不可重複。

K8s集羣由主結點和工作結點兩類構成。

etcd 一款開源軟件。提供可靠的分佈式數據存儲服務,用於持久化存儲K8s集羣的配置和狀態。主要用於保存集羣的配置和狀態。

K8s API server:K8s其它組件之間不直接通信,而是通過API server通信的。例如,只有API server連接了etcd,即其它組件更新K8s集羣的狀態時,只能通過API server讀寫etcd中的數據。

Controller Manager 執行集羣級別的功能,如複製組件、追蹤工作結點狀態、處理結點失敗等。Controller Manager組件是由多個控制器組成的,其中很多控制器是按K8s的資源類型劃分的,如Replication Manager(管理ReplicationController 資源),ReplicaSet Controller,PersistentVolume controller。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章