1. Kubernetes簡介
作為一個目前在生產環境已經廣泛使用的開源項目 Kubernetes 被定義成一個用于自動化部署、擴容和管理容器應用的開源系統;它將一個分布式軟件的一組容器打包成一個個更容易管理和發現的邏輯單元。
Kubernetes 是希臘語『舵手』的意思,它最開始由 Google 的幾位軟件工程師創立,深受公司內部 Borg 和 Omega 項目的影響,很多設計都是從 Borg 中借鑒的,同時也對 Borg 的缺陷進行了改進,Kubernetes 目前是 Cloud Native Computing Foundation (CNCF) 的項目并且是很多公司管理分布式系統的解決方案。
在 Kubernetes 統治了容器編排這一領域之前,其實也有很多容器編排方案,例如 compose 和 Swarm,但是在運維大規模、復雜的集群時,這些方案基本已經都被 Kubernetes 替代了。
2. Node
Node 可以是一臺物理機,也可以是虛擬機。
2.1 Node狀態
當我們拿到這臺服務器后,首先我們登錄服務器查看下服務器的基本配置和信息。其實對于一個新加入 K8S 集群的 Node 也是一樣,需要先檢查它的狀態,并將狀態上報至集群的 master 。
2.1.1 IP地址
首先,我們所關心的是我們服務器的 IP 地址,包括內網 IP 和外網 IP。對應于 K8S 集群的話這個概念是類似的,內部 IP 可在 K8S 集群內訪問,外部 IP 可在集群外訪問。
2.1.2 信息
我們需要看下服務器的基本信息,比如看看系統版本信息, cat /etc/issue 或者 cat /etc/os-release 等方法均可查看。對于 K8S 集群會將每個 Node 的這些基礎信息都記錄下來。
2.1.3 容量
我們通常也都會關注下,我們有幾個核心的 CPU ,可通過 cat /proc/cpuinfo 查看,有多大的內存 通過 cat /proc/meminfo 或 free 等查看。對于 K8S 集群,會默認統計這些信息,并計算在此 Node 上可調度的 Pod 數量。
2.1.4 條件
對于我們拿到的服務器,我們根據上述的一些基本信息進行判斷,這臺機器是否能滿足我們的需要。對 K8S 集群也同樣,當判斷上述信息均滿足要求時候,便將集群內記錄的該 Node 信息標記為 Ready (Ready = True),這樣我們的服務器便正式的完成交付。
3. Deployment 和 Pod
3.1 Pod
作為 Kubernetes 集群中的基本單元,Pod 就是最小并且最簡單的 Kubernetes 對象,這個簡單的對象其實就能夠獨立啟動一個后端進程并在集群的內部為調用方提供服務。
3.2 Deployment
提供了一種對 Pod 和 ReplicaSet 的管理方式,每一個 Deployment 都對應集群中的一次部署,是非常常見的 Kubernetes 對象。
3.3 例如
在使用一臺服務器時,我們通常需要編寫一個主頁index.html以及將其部署在web服務器上,對于 K8S 而言,我們想要的,能提供對 index.html 訪問的服務便可理解為 Deployment 的概念,表明一種我們預期的目標狀態。
而對于 web服務器 和 index.html 這個組合可以理解為其中的 Pod 概念,作為最小的調度單元。
4. Container Runtime
Docker 已經是容器技術的事實標準了,它讓開發者將自己的應用以及依賴打包到一個可移植的容器中,讓應用程序的運行可以實現環境無關。
如果我們想要將當前主頁部署在多臺服務器上,我們可以在服務器上安裝docker,此時,我們需要做的事情,也便只是將我們的服務構建成一個鏡像,需要編寫一個 Dockerfile,構建一個鏡像并部署到每臺服務器上便可。
我們能夠通過 Docker 實現進程、網絡以及掛載點和文件系統隔離的環境,并且能夠對宿主機的資源進行分配,這能夠讓我們在同一個機器上運行多個不同的 Docker 容器,任意一個 Docker 的進程都不需要關心宿主機的依賴,都各自在鏡像構建時完成依賴的安裝和編譯等工作,這也是為什么 Docker 是 Kubernetes 項目的一個重要依賴。
而 Docker 如果對應于 K8S 集群中的概念,便是 Container Runtime,這里還有其他的選擇,比如 rkt,runc 和其他實現了 OCI 規范的運行時。
參考資料
《Kubernetes 從上手到實踐》