为什么 Kubernetes 变得如此流行(2020版)
在寫本文的時候,Kubernetes已經有6年左右的歷史了,在過去兩年中,Kubernetes的知名度不斷上升,成為工程師最愛的平臺之一。今年,它被列為最受歡迎的平臺的第三位。如果你還沒聽說過Kubernetes的話,那么它是一個允許你運行容器和協調容器負載的平臺。
容器最初是作為Linux內核進程隔離的產物,包含了2007就支持的cgroups和2002年就支持的命名空間。2008年,當LXC可用時,容器變得更加重要了,Google開發了“Borg” 好城市 "在容器中運行一切 "的機制。很快來到2013年,Docker發布了,徹底普及了容器。在當時,Mesos是調度容器的主要工具,然而,它并沒有那么廣泛流行起來。Kubernetes于2015年發布,并迅速成為事實上的容器調度標準。
為了試圖理解Kubernetes的普及,讓我們考慮一些問題。上一次開發者們能夠就部署應用的方式達成一致是什么時候?你知道有多少開發人員按開箱即用的方式運行工具?現在有多少云運維工程師不了解應用程序是如何工作的?我們將在這篇文章中探討這些問題的答案。
?
基礎設施使用YAML表達
?
從Puppet和Chef的世界里走出來,Kubernetes的一個重要轉變是,從以代碼為基礎的基礎架構轉向了以數據為基礎的基礎架構—具體來說,就是YAML。Kubernetes中的所有資源,包括Pod、Configurations、Deployments、Volumes等,都可以簡單地用YAML文件來表達。比如。
apiVersion: v1 kind: Pod metadata:name: sitelabels:app: web spec:containers:- name: front-endimage: nginxports:- containerPort: 80這種表示方式使DevOps或SRE工程師更容易完全表達工作負載,而不需要在Python、Ruby或Javascript等語言中用代碼表示。
將基礎架構作為數據的好處還包括。
-
GitOps或Git操作版本控制。使用這種方法,你可以將所有的Kubernetes YAML文件都保存在git倉庫下,這樣你就可以準確地知道何時進行了更改,誰做了更改,以及具體更改了什么。這使得整個組織的透明度更高,并且通過避免團隊成員弄不清楚去哪里尋找配置,從而提高了效率。同時,只需合并一個拉動請求,就可以更方便地自動化更改Kubernetes資源。
-
可擴展性。將資源定義為YAML,使得集群操作人員在Kubernetes資源中改變一兩個數字來擴容或者縮容集群。Kubernetes有水平pod自動縮放器,可以指定給定部署所需要的最小和最大pod數量,以便能自動縮容/擴容應對流量低谷/高峰。例如,如果你正在運行的部署可能因為流量突增而需要更多的容量,你可以將maxReplicas從10個改為20個。
- ?
- 安全和控制。YAML是驗證在Kubernetes中部署什么和如何部署的好方法。例如,當涉及到安全問題時,一個重要的關注點就是你的工作負載是否以非root用戶的身份運行。我們可以利用像conftest這樣的工具(YAML/JSON驗證器),再加上Open Policy Agent這樣的策略驗證器,來檢查你的工作負載的SecurityContext是否不允許容器作為root用戶運行。為此,用戶可以使用一個簡單的Open Policy Agent rego策略,如下。
-
云供應商的整合??萍夹袠I的主要趨勢之一就是在公有云供應商中運行工作負載。在云供應商組件的幫助下,Kubernetes允許每個集群與它所運行的云供應商進行集成。例如,如果用戶在AWS中的Kubernetes中運行某應用程序,并希望該應用程序可以通過服務訪問,云供應商會幫助自動創建一個LoadBalancer服務,該服務會自動提供一個Amazon Elastic Load Balancer來將流量轉發到應用程序的pods。
?
可擴展性
?
Kubernetes的可擴展性很強,開發者很喜歡這一點。Kubernetes已經內置了很多資源,如Pods、Deployments、StatefulSets、Secrets、ConfigMaps等。然而用戶和開發者可以通過自定義資源定義的形式添加更多的資源。例如,如果我們想定義一個CronTab資源,我們可以這樣做。
apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata:name: crontabs.my.org spec:group: my.orgversions:- name: v1served: truestorage: trueSchema:openAPIV3Schema:type: objectproperties:spec:type: objectproperties:cronSpec:type: stringpattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$'replicas:type: integerminimum: 1maximum: 10scope: Namespacednames:plural: crontabssingular: crontabkind: CronTabshortNames:- ct 我們以后可以用如下的方式創建一個CronTab資源。 apiVersion: "my.org/v1" kind: CronTab metadata:name: my-cron-object spec:cronSpec: "* * * * */5"image: my-cron-imagereplicas: 5Kubernetes可擴展性的另一種形式是開發者可以編寫自己的Operator,這是一個在Kubernetes集群中運行的特定進程,遵循控制循環模式。一個Operator允許用戶通過與Kubernetes API對話來自動管理CRD(自定義資源定義)。
社區有幾個工具,允許開發者創建自己的Operator。其中一個工具是Operator Framework及其Operator SDK。該SDK為開發者提供了一個框架,讓他們可以非??焖俚亻_始創建Operator。例如,您可以通過以下命令行開始創建Operator。
然后用另一個命令來調整kafka參數。
$ kubectl kudo install kafka --instance=my-kafka-name \-p ZOOKEEPER_URI=zk-zookeeper-0.zk-hs:2181 \-p ZOOKEEPER_PATH=/my-path -p BROKER_CPUS=3000m \-p BROKER_COUNT=5 -p BROKER_MEM=4096m \-p DISK_SIZE=40Gi -p MIN_INSYNC_REPLICAS=3 \-p NUM_NETWORK_THREADS=10 -p NUM_IO_THREADS=20創新
在過去的幾年里,Kubernetes每隔三四個月就會有一次大版本發布,也就是說,每年都會有三四個大的版本。新功能的引入速度并沒有放緩,上一次發布的版本就有超過30種不同的新增功能和改進。此外,即使在困難時期,代碼貢獻也沒有放緩的跡象,正如Kubernetes項目Github的活動所示。
新功能讓集群運維人員在面對各種不同的工作負載時有了更多的靈活性。軟件工程師也喜歡有更多的控制權,可以直接將應用部署到生產環境中。
?
社區
Kubernetes受歡迎的另一大方面是其強大的社區。對于初學者來說,Kubernetes在2015年進入1.0版本的時候,就被捐給了云原生計算基金會(CNCF)。
此外,隨著項目的推進,還有大量的社區SIG(特殊興趣小組),它們針對Kubernetes的不同領域進行研究。他們不斷地添加新的功能,以方便其他用戶使用。
云原生基金會還組織了CloudNativeCon/KubeCon,截止到本文寫作時,它是有史以來最大的開源活動。該活動一般每年舉辦三次,聚集了數千名相關技術專家和專業人士。
此外,云原生基金會有一個技術監督委員會,該委員會和它的SIGs一起研究基金會在云原生生態系統中的新項目和現有項目。這些項目大多有助于提升Kubernetes的價值。
最后,我相信,如果沒有社區有意識地互相包容、歡迎任何新人的加入,Kubernetes就不會有今天的成功。
?
未來
開發人員在未來面臨的主要挑戰之一是如何更多地關注代碼的細節,而不是代碼運行的基礎設施。為此,無服務器架構正在成為解決這一挑戰的主要架構范式之一。已經有一些非常先進的框架,比如Knative和OpenFaas,使用Kubernetes將基礎架構從開發者那里抽象出來。
在這篇文章中,我們已經展示了Kubernetes的簡單介紹,但這只是冰山一角。用戶可以利用更多的資源、功能和配置。我們將繼續看到新的開源項目和技術來增強或發展Kubernetes,正如我們提到的那樣,這些貢獻和社區無處不在。
?
原文鏈接:https://stackoverflow.blog/2020/05/29/why-kubernetes-getting-so-popular/
總結
以上是生活随笔為你收集整理的为什么 Kubernetes 变得如此流行(2020版)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 刚毕业的我,参与了一场大厂之间的争夺之战
- 下一篇: 说了这么多次 I/O,可你知道其中的原理