1. 程式人生 > 其它 >k8s從容器到編排

k8s從容器到編排

K8s 是啥?

Production-Grade Container Orchestration

Kubernetes, also known as K8s, is an open-source system for automating deployment, scaling, and management of containerized applications.

 

K8s是啥,Kubernetes的縮寫,最早的原型來自google的Borg,很多產品的原型有google論文的影子吧,tidbmapreduce等。是一個開源軟體,用golang寫的,自動釋出,擴充套件,管理容器化應用。所謂自動化釋出,擴充套件,管理,用一個詞概括了,就是編排。

是企業級,產品級,生產級,反正是好用可用大規模用,事實標準的容器編排

 

總之,k8s是做容器編排的。那麼我們就從這兩個方面入手,容器和編排。

 

 

 

容器大家不陌生,docker嘛,經常跑啊,docker pull,docker run ,docker ps,docker exec。那容器本質是啥呢,為啥還需要編排呢?

 

當然,測試環境,跑一個起來,免去安裝依賴的麻煩,要知道在一個不確定的os上安裝一個不確定的版本軟體,沒有安裝指令碼的情況下,安裝一個軟體是及其繁瑣耗時的,因為要做各種適配,依賴,調整:

 

比如,前段時間我們在測試環境安裝一個redis:

wget http://download.redis.io/redis-stable.tar.gz

tar xvzf redis-stable.tar.gz

cd redis-stable

 

make USE_SYSTEMD=yes  PREFIX=/usr/local/redis/ install

 

就需要這倆:

yum install gcc -y  

yum install systemd-devel

 

然後安裝好了,結束了嗎?

make test 時還需要這個:

wget http://downloads.sourceforge.net/tcl/tcl8.6.1-src.tar.gz

tar xzvf tcl8.6.1-src.tar.gz  -C /usr/local/

cd  /usr/local/tcl8.6.1/unix/

./configure

make

make isntall

 

那在容器裡多好,一把起來,利用容器映象的移植性和一致性,一切都打包好的。但現在是方便了,redis也用容器跑起來了,但現在只有一個redis容器,那它掛了怎麼辦,手動拉起來嗎,如果想做容器化了的redis叢集怎麼辦,不然沒有可用性,不能上生產環境,那就白搭啊。實際上,非容器化的,也是一樣的,物理機上虛機上,redis有什麼主從,有哨兵,有redis cluster,有各種方案,做叢集,這個做叢集,可用簡單粗暴的理解在k8s裡就是做redis的容器編排。

 

 

要知道做安裝標準化,自動化,抽象出運維標準化,自動化,做叢集,做管理,這是技術之上的抽象,不管什麼技術,都需要。這其實是容器出現以前,後端一直在做的工作,做到極致就是做成了paas平臺,所謂平臺即服務,比如自動化運維平臺,自動化資料庫平臺等等。但這些做到極致,大多數情況下也沒有k8s那麼好用。傳統的paas平臺,運維平臺,為了自動化操作物理機虛機而生。k8s為了自動化操作容器管理容器而生。不過k8s創新性的引入了編排,控制器模式等等這些想法。

 

對容器,和編排,現在有了初步介紹。接下來,在展開一點說容器和k8s編排

 

 

 

那展開容器和編排之前呢,我們得先說一下作業系統,這一下就把高度拔起來了哈。計算機,咱們天天用,一個確定的輸入,經過計算,給一個確定的輸出,由CPU,記憶體,磁碟,輸入輸出裝置構成,如果聯網還有網路,當然大部分都聯網,我們都預設有網路。雖然這些東西我們天天打交道,在學校也學過什麼邏輯閘,觸發器,加法器,累加器,L1L2快取,暫存器,但工作後,除了極少部分工種,實際上在軟體和網際網路這個層面,我們比較少的用到。因為計算機軟體系統,是一個抽象封裝系統,我們在某一個點,使用下層已經給我們封裝好的東西。這個點,可以認為是作業系統,作業系統給我們提供了一個環境,遮蔽了剛才說的那些所有東西,我們大部分時候面向作業系統就可以。好比我們呼叫一個函式,使用某種語言的庫,我們安裝引數傳遞,拿return就可以了。(當然想深究,那才去看他們的原始碼,大部分時間不關心)

 

我們可以上圖,看一下:

 

 

作業系統定義,是一個系統軟體,管理計算機軟硬體資源,為程式提供公共服務。

說白了向下管理軟硬體資源,向上為應用程式提供服務。

 

我們一般在上層,從上層的視角看:

 

 

無論是Windows的圖形介面,什麼開始,控制面板,還是Linux shell,什麼ls,mkdir,都是使用者介面而已,包括我們自己寫的程式,ls,mkdir也是程式,這些最終都會呼叫作業系統提供的庫程式設計介面,最終呼叫系統呼叫來實現。所以我們就把這條基準線,拉到系統呼叫。

 

像系統呼叫之下這些東西:

 

 

 

 

 

 

什麼記憶體怎麼管理,段還是頁,什麼VFS怎麼抽象檔案系統,什麼網絡卡怎麼硬中斷,我們全不關心,拿來直接用。就是系統呼叫通過作業系統已經給我們搞好了。

 

Linux系統呼叫,64位的,大約有300多個,我們要關心的是和namespace及程序相關的系統呼叫,比如,#define __NR_clone 56 和建立容器程序指定namaspace引數相關,#define __NR_chroot 161 和容器映象相關,#define __NR_setns 308  和docker exec 這樣的命令相關。 
 
因為容器實際上就是一個通過namaspace引數,並設定相應的cgroup調起的一個程序而已。所謂把nginx放在docker裡跑,就是在啟動nginx這個程序的時候給它加上namespace引數,並把這個加了namespace啟動引數的程序放cgroup控制組裡,並chroot切換這個程序的跟檔案系統rootfs為下載的這個nginx的映象image,這樣這個nginx就隔離起來了,看到它自己的程序空間,檔案空間,只能使用被限制了的CPU資源。docker就只是一個call系統呼叫的管理程式而已。另外要注意,所有的容器共用一個作業系統核心,bootfs和rootfs是分開的,不同的東西。Bootfs作業系統引導載入核心那個過程的東西。
 
rootfs,這一部分我們稱為“容器映象”(Container Image),是容器的靜態檢視;
一個由 Namespace+Cgroups 構成的隔離環境,這一部分我們稱為“容器執行時”(Container Runtime),是容器的動態檢視。