簡介:本文經過一個業務發展的故事,分享 K8s 出現的緣由以及它的運做方式。適合全部技術開發人員,尤爲是前端開發者。前端
去年下半年,我作了一次轉崗,開始接觸到 kubernetes,雖然對 K8s 的認識還很是的不全面,可是很是想分享一下本身的一些收穫,但願經過本文可以幫助你們對 K8s 有一個入門的瞭解。文中有不對的地方,還請各位老司機們幫助指點糾正。linux
其實介紹 K8s 的文章,網上一搜一大把,並且 kubernetes 官方文檔也寫的很是友好,因此直接上來說 K8s,我以爲我是遠遠不如網上的一些文章講的好的,因此我想換一個角度,經過一個業務發展的故事,來說一下 K8s 是怎麼出現的,它又是如何運做的。web
本文適合全部搞技術的同窗,特別是前端的同窗,由於前端工程化近幾年發展的很是迅猛,K8s 目前解決的問題和發展的形式,我相信假以時日也會出如今前端領域,畢竟不一樣領域的工程化發展實際上是異曲同工的。docker
隨着中國老百姓生活水平的不斷提升,家家戶戶都有了小汽車,小王預計 5 年後,汽車報廢業務將會迅速發展,並且國家在 19 年也出臺了新政策《報廢機動車回收管理辦法》,取消了汽車報廢回收的「特種行業」屬性,將開放市場化的競爭。前端工程化
小王以爲這是一個創業的好機會,因而找到了我和幾個志同道合的小夥伴開始了創業,決定作一個叫「淘車網」的平臺。api
淘車網一開始是一個 all in one 的 Java 應用,部署在一臺物理機上(小王同窗,如今都啥時候了,你須要瞭解一下阿里雲),隨着業務的發展,發現機器已經快扛不住了,就趕忙對服務器的規格作了升級,從 64C256G 一路升到了 160C1920G,雖然成本高了點,可是系統至少沒出問題。服務器
業務發展了一年後,160C1920G 也扛不住了,不得不進行服務化拆分、分佈式改造了。爲了解決分佈式改造過程當中的各類問題,引入了一系列的中間件,相似 hsf、tddl、tair、diamond、metaq 這些,在艱難的業務架構改造後,咱們成功的把 all in one 的 Java 應用拆分紅了多個小應用,重走了一遍阿里當年中間件發展和去 IOE 的道路。網絡
分佈式改完了後,咱們管理的服務器又多起來了,不一樣批次的服務器,硬件規格、操做系統版本等等都不盡相同,因而應用運行和運維的各類問題就出來了。架構
還好有虛擬機技術,把底層各類硬件和軟件的差別,經過虛擬化技術都給屏蔽掉啦,雖然硬件不一樣,可是對於應用來講,看到的都是同樣的啦,可是虛擬化又產生了很大的性能開銷。less
恩,不如咱們使用 docker 吧,由於 docker 基於 cgroup 等 linux 的原生技術,在屏蔽底層差別的同時,也沒有明顯的性能影響,真是一個好東西。並且基於 docker 鏡像的業務交付,使得咱們 CI/CD 的運做也很是的容易啦。
不過隨着 docker 容器數量的增加,咱們又不得不面對新的難題,就是大量的 docker 如何調度、通訊呢?畢竟隨着業務發展,淘車網已經不是一個小公司了,咱們運行着幾千個 docker 容器,而且按照如今的業務發展趨勢,立刻就要破萬了。
不行,咱們必定要作一個系統,這個系統可以自動的管理服務器(好比是否是健康啊,剩下多少內存和 CPU 可使用啊等等)、而後根據容器聲明所需的 CPU 和 memory 選擇最優的服務器進行容器的建立,而且還要可以控制容器和容器之間的通訊(好比說某個部門的內部服務,固然不但願其餘部門的容器也可以訪問)。
咱們給這個系統取一個名字,就叫作容器編排系統吧。
那麼問題來了,面對一堆的服務器,咱們要怎麼實現一個容器編排系統呢?
先假設咱們已經實現了這個編排系統,那麼咱們的服務器就會有一部分會用來運行這個編排系統,剩下的服務器用來運行咱們的業務容器,咱們把運行編排系統的服務器叫作 master 節點,把運行業務容器的服務器叫作 worker 節點。
既然 master 節點負責管理服務器集羣,那它就必需要提供出相關的管理接口,一個是方便運維管理員對集羣進行相關的操做,另外一個就是負責和 worker 節點進行交互,好比進行資源的分配、網絡的管理等。
咱們把 master 上提供管理接口的組件稱爲 kube apiserver,對應的還須要兩個用於和 api server 交互的客戶端,一個是提供給集羣的運維管理員使用的,咱們稱爲 kubectl;一個是提供給 worker 節點使用的,咱們稱爲 kubelet。
如今集羣的運維管理員、master 節點、worker 節點已經能夠彼此間進行交互了,好比說運維管理員經過 kubectl 向 master 下發一個命令,「用淘車網用戶中心 2.0 版本的鏡像建立 1000個 容器」,master 收到了這個請求以後,就要根據集羣裏面 worker 節點的資源信息進行一個計算調度,算出來這 1000 個容器應該在哪些 worker 上進行建立,而後把建立指令下發到相應的 worker 上。咱們把這個負責調度的組件稱爲 kube scheduler。
那 master 又是怎麼知道各個 worker 上的資源消耗和容器的運行狀況的呢?這個簡單,咱們能夠經過 worker 上的 kubelet 週期性的主動上報節點資源和容器運行的狀況,而後 master 把這個數據存儲下來,後面就能夠用來作調度和容器的管理使用了。至於數據怎麼存儲,咱們能夠寫文件、寫 db 等等,不過有一個開源的存儲系統叫 etcd,知足咱們對於數據一致性和高可用的要求,同時安裝簡單、性能又好,咱們就選 etcd 吧。
如今咱們已經有了全部 worker 節點和容器運行的數據,咱們能夠作的事情就很是多了。好比前面所說的,咱們使用淘車網用戶中心 2.0 版本的鏡像建立了 1000 個容器,其中有5個容器都是運行在 A 這個 worker 節點上,那若是 A 這個節點忽然出現了硬件故障,致使節點不可用了,這個時候 master 就要把 A 從可用 worker 節點中摘除掉,而且還須要把原先運行在這個節點上的 5 個用戶中心 2.0 的容器從新調度到其餘可用的 worker 節點上,使得咱們用戶中心 2.0 的容器數量可以從新恢復到 1000 個,而且還須要對相關的容器進行網絡通訊配置的調整,使得容器間的通訊仍是正常的。咱們把這一系列的組件稱爲控制器,好比節點控制器、副本控制器、端點控制器等等,而且爲這些控制器提供一個統一的運行組件,稱爲控制器管理器(kube-controller-manager)。
那 master 又該如何實現和管理容器間的網絡通訊呢?首先每一個容器確定須要有一個惟一的 ip 地址,經過這個 ip 地址就能夠互相通訊了,可是彼此通訊的容器有可能運行在不一樣的 worker 節點上,這就涉及到 worker 節點間的網絡通訊,所以每一個 worker 節點還須要有一個惟一的 ip 地址,可是容器間通訊都是經過容器 ip 進行的,容器並不感知 worker 節點的 ip 地址,所以在 worker 節點上須要有容器 ip 的路由轉發信息,咱們能夠經過 iptables、ipvs 等技術來實現。那若是容器 ip 變化了,或者容器數量變化了,這個時候相關的 iptables、ipvs 的配置就須要跟着進行調整,因此在 worker 節點上咱們須要一個專門負責監聽並調整路由轉發配置的組件,咱們把這個組件稱爲 kube proxy(此處爲了便於理解,就不展開引入 Service 的內容了)。
咱們已經解決了容器間的網絡通訊,可是在咱們編碼的時候,咱們但願的是經過域名或者 vip 等方式來調用一個服務,而不是經過一個可能隨時會變化的容器 ip。所以咱們須要在容器 ip 之上在封裝出一個 Service 的概念,這個 Service 能夠是一個集羣的 vip,也能夠是一個集羣的域名,爲此咱們還須要一個集羣內部的 DNS 域名解析服務。
另外雖然咱們已經有了 kubectl,能夠很愉快的和 master 進行交互了,可是若是有一個 web 的管理界面,這確定是一個更好的事情。此處以外,咱們可能還但願看到容器的資源信息、整個集羣相關組件的運行日誌等等。
像 DNS、web 管理界面、容器資源信息、集羣日誌,這些能夠改善咱們使用體驗的組件,咱們統稱爲插件。
至此,咱們已經成功構建了一個容器編排系統,咱們來簡單總結下上面提到的各個組成部分:
這些也正是 K8s 中的重要組成部分。固然 K8s 做爲一個生產級別的容器編排系統,這裏提到的每個組件均可以拿出來單獨講上不少內容,本文只是一個簡單入門,再也不展開講解。
雖然咱們已經成功實現了一個容器編排系統,而且也用的很舒服,可是淘車網的王總裁(已經不是當年的小王了)以爲公司花在這個編排系統上的研發和運維成本實在是過高了,想要縮減這方面的成本。王總想着有沒有一個編排系統,可以讓員工專一到業務開發上,而不須要關注到集羣的運維管理上,王總和技術圈的同窗瞭解了一下,發現 Serverless 的理念和他的想法不謀而合,因而就在想啥時候出一個 Serverless 的容器編排系統就好啦。
Serverless 的容器編排系統須要怎麼實現呢?歡迎你們在評論區給王總出謀劃策~