k8s是一個編排容器的工具,其實也是管理應用的全生命周期的一個工具,從建立應用,應用的部署,應用提供服務,擴容縮容應用,應用更新,都非常的友善,而且可以做到故障自愈,例如一個伺服器挂了,可以自動将這個伺服器上的服務排程到另外一個主機上進行運作,無需進行人工幹涉。那麼,問題來了,要運維何用?
k8s可以更快的更新新版本,打包應用,更新的時候可以做到不用中斷服務,伺服器故障不用停機,從開發環境到測試環境到生産環境的遷移極其友善,一個配置檔案搞定,一次生成image,到處運作。。。
k8s的全生命周期管理
在k8s進行管理應用的時候,基本步驟是:建立叢集,部署應用,釋出應用,擴充應用,更新應用。
1、建立叢集:為什麼要使用叢集?
有一句古話叫做三個臭皮匠,賽過諸葛亮,這就是建立叢集的原因。。。
使用叢集,create cluster是為了掩蓋底層的無能,在各種環境中,底層的硬體各不相同,有的是各種低廉的伺服器,有的各種雲環境,有的是各種vm,有的各種host machine,要想屏蔽底層的細節,增強可靠性和穩定性,進而需要建立叢集。
叢集看起來很牛,那麼建立起來很複雜麼?并不會,在k8s隻要使用兩條指令就可以建立一個叢集,一個是kubectl init進行初始化,建立一個master節點,第二條指令就是kubectl join xxx建立一個node節點,加入這個叢集。
在這邊可以看到k8s在實體上進行劃分的時候,劃分了兩種類型的主機,一個master節點,主要用來排程,控制叢集的資源等功能;而node節點,主要是用來運作容器的節點,也就是運作服務的節點。
其實叢集都差不多,master用來控制,用來存儲各種中繼資料,node節點是一個工作節點,真正來幹活的;node節點定時與master進行通信,通過kubelet程序來彙報資訊。
2、 部署應用
使用叢集的主要目标是啥?用來提供服務,讓開發開發的應用程式能在叢集上運作,進而需要讓開發能運作一個應用來進行測試。
一條指令就能運作一個服務,有了image之後就是這麼簡單。是以,在開發完成程式之後,需要将程式打包成image,然後放到registry中,然後就能夠運作應用了。
在部署完成應用之後,就可以看到應用的名稱,期望狀态是運作一個pod,目前有一個pod,活動的也是一個,還有啟動的時間,那麼什麼是pod呢?
在k8s裡面,叢集排程的最小單元就是一個pod,一個pod可以是一個容器,也可以是多個容器,例如你運作一個程式,其中使用了nginx,使用mysql了,使用了jetty,那麼可以将這三個使用在同一個pod中,對他們提供統一的調配能力,一個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來關聯,也就是标簽(-l表示為label)。
後話
k8s的基本入門,其實算是一種使用者視角,隻是用來示範如何使用k8s,怎麼提高了生産力而已。
在給客戶示範的時候,為啥要選擇k8s?主要就是如何提高了釋出的效率,更新版本的效率,更友善更快捷的上線新版本。
但是在運維關注的視角下,這些遠遠不夠。。。master?存儲了哪些中繼資料,存儲在etcd中?如何來進行監控?在很多很多系統情況下,怎麼來部署k8s,是一個項目一個k8s還是一個k8s多個項目?等等一系列的問題。。。