五個熱愛Kubernetes的原因(上)_Kubernetes中文社群
簡 介
在柏林的LinuxCon上我發表過題為“我為什麼喜愛Kubernetes的十個原因”的演講,效果反響熱烈,好多人都讓我把這篇演講寫成部落格。那麼這篇部落格就圍繞這十個原因中關於前五個的展開,後五個將在下篇部落格進行。
簡明扼要地說,Kubernetes是一個“為了自動化部署、擴容和管理容器化應用的開源系統”,通常被看作是容器編排工具
背景
Kubernetes專案在2014年6月由Google創立,現在它在Github上擁有超過1000位貢獻者,超過3,7000次提交和超過1,7000顆星,並且目前由Linux Foundation下設的Cloud Native Computing Foundation管理。據Garnter近期的一次調查報告顯示,Kubernetes在所有管理大量容器的系統中處於領先地位(譯者注:該報告顯示Kubernetes佔到大約37%的份額,Docker Swarm大約16%,Mesos大約13%)。
為了在資料中心中執行任務而選擇合適的分散式系統並非易事,這是因為比較不同的解決方案要比閱讀關於特性和效能的文件更為複雜。觀測例如Kubernetes的效能存在很多變數,因此這是一項艱鉅的挑戰。我相信要做出這樣的選擇不僅需要考慮前面的這些因素,還需要考慮到過往的經歷,團隊中每個人的理解和技能。是的,這似乎不夠理性,但我就是這麼想的。
所以在這裡,下面列出熱愛Kubernetes的原因,排名不分前後:
1、Borg血統
Kubernetes(K8s)繼承自谷歌的祕密應用管理工具:Borg。我常說K8s是Borg的開源重寫版。k8s概述
Borg長久以來是一個祕密,直到被Borg論文所公佈。這個系統由谷歌著名的SRE團隊用來管理例如Gmail甚至GCE這樣的應用。
2、輕鬆部署
這一點看起來有些爭議。但當我在2015年早些時候就發現安裝部署非常直接。
首先, 你可以在單節點上執行K8s,我們會回到這點。但對於一個非高可用安裝,你只需要安裝一箇中心管理節點和一組工作節點。管理節點執行三個進行(API Server,Scheduler 和Controller Manager)加上一個鍵值對儲存etcd,工作節點執行兩個程序(監控容器變化的Kubelet和暴露服務的Kube-proxy)。
這個架構,從上層來看很像Mesos,CloudStack或者OpenStack等系統。如果用ZooKeeper替換掉etcd,用Mesos master替換掉API Server執行,並且用Mesos Worker替換掉kubelet/proxy,你就得到了Mesos。
我在開始的時候寫了一本Ansible Playbook,它使用CoreOS虛擬機器並安裝所有的K8s元件。CoreOS兼具覆蓋網路(例如Flannel)和Docker的優點。結果是在5分鐘內,我可以啟動一個K8s叢集。我一直在更新我的playbook,對於我來說,啟動k8s只需要一條命令:
$ ansible-playbook k8s.yml
注意如果你使用Google雲,你需要一個Kubernetes服務,GCE也可以讓你一條命令啟動叢集:
$ gcloud container clusters create foobar
從我來看這非常簡單,但我也知道這不是適用於每個人的。事情都是相對的,重用某人的playbook可能會很痛苦。
與此同時,Docker在做一件非常糟糕的事情,它重寫了Swarm,並且將它嵌入到Docker engine裡。它使得執行Swarm叢集只需要兩行bash命令。
如果你想要這種型別的啟動,Kubernetes目前也支援一個叫做kubeadm的命令,它使得你可以從命令列建立叢集。啟動一個主節點,並加入工作節點。就是這樣
$ kubeadm ini $ kubeadm join
我也同樣為它建立了playbook,戳這裡檢視。
3、使用minikube的開發方案
當你想盡快體驗一個系統,你又不全量部署在你的資料中心或雲上。你可能只是想在你本地的機器進行測試。
沒事,你可以使用minikube。
下載,安裝,你只需一條bash命令就可以搭建一個單節點、獨立的Kubernetes例項。
$ minikube start Staring local Kubernetes cluster... Kubectl is now configured to use the cluster.
在很短的時間內,minikube將為你啟動Kubernetes需要的每個程式,然後你就可以訪問你的單節點k8s例項了:
$ kubectl get ndoes NAME STATUS AGE minikube Ready 25s
預設情況下,它支援Virtualbox,並啟動一個只會執行單個程式(例如localkube)的VM,為你快速搭建Kubernetes。這個VM同時還會啟動Docker,你也可以使用它作為Docker宿主機。
Minikube同時允許你測試不同的Kubernetes版本,和配置不同的測試特徵。它也附帶了Kubernetes dashboard,你可以快速開啟:
$ minikube dashboard
4、易於學習的API
在REST之前的世界是痛苦的,學習痛苦、程式設計痛苦、使用痛苦、除錯痛苦。還包含了很多不斷完善的、相互競爭的標準。但這一去不復返。這就是為什麼我如此喜愛簡潔的REST
API,我可以檢視和使用curl進行測試。對我來說,Kubernetes
API很不錯。僅僅包含了一組資源(物件)和HTTP動作,通過基於JSON或YAML的請求和響應我可以操作這些物件。
Kubernetes發展迅猛,我喜歡這些被劃分到不同API組裡的多種不同的資源,它們還被很好地控制了版本。我可以知道我使用的是alpha、beta還是stable版本,同時我也知道去哪裡檢視這些定義。
如果你閱讀了第3個原因,那麼你已經擁有了minikube,是麼?那麼最快地檢視這些API的方法就是深入它們:
$ minikube ssh $ curl localhost:8080 { "path": [ "/api", "/api/v1", "
如果你看到了這些API分組,並且可以體驗它們包含的這些資源,請嘗試:
$ curl localhost:8080/api/v1 $ curl localhost:8080/api/v1/nodes
所有的資源都包含kind, apiVersion, metadata。
為了學習每個資源的定義,Swagger API browser非常實用。我也通常會去文件裡查詢一個特定的域等。學習API的下一步實際上是使用命令列介面kubectl,即原因5。
5、極好的命令列介面
不管是學習API還是編寫自己的客戶端,Kubernetes都不會把你扔下。K8s的命令列客戶端叫做kubectl,它基於語句,功能強悍。
你可以使用kubectl管理整個Kubernetes叢集和所有的資源。
可能對於kubectl最難的部分是安裝它或者找到它。這裡有提升的空間。
讓我們再次使用minikube,並且體驗kubectl的動作,例如get,describe和run。
$ kubectl get nodes $ kubectl get nodes minikube -o json $ kubectl describe nodes minkube $ kubectl run ghost --image=ghost
最後一條命令將會啟動一個Ghost部落格平臺。你很快就會見到一個pod出現,一個pod是Kubernetes最小的計算單元和最基本的資源。當使用run命令的時候,Kubernetes建立了另外一個叫做deployment的資源。Deployment提供了一個容器化服務(看作單個微服務)的宣告式的定義。對它的擴容通過下面的命令完成:
$ kubectl scale deployments/ghost --replicas=4
對於每個kubectl命令,你都可以使用兩個小技巧:–watch和–v=99。watch標記會等待事件發生,這就跟標準Linux命令watch類似。值為99的verbose標記會給你跟kubectl功能一樣的curl命令。這非常有助於學習API,找到它使用的資源和請求。
最後,你可以通過編輯deployment來更新它,這會出發一個滾動升級。
$ kubectl edit deployment/ghost
其它
其餘的5個熱愛Kubernetes的原因,敬請期待。
那麼你聽說了Kubernetes但卻對它是什麼和它怎麼工作的毫不知情?Linux Foundation的Kubernetes Fundamentals Course將帶你從零開始學習如何部署一個容器化應用和通過API進行操作。
原文連結:https://www.linux.com/blog/top-5-reasons-love-kubernetes
原文作者:https://twitter.com/sebgoa