為什么Kubernetes這么受歡迎?
在本文發(fā)表時(shí),Kubernetes大約已經(jīng)有6年的歷史,在過(guò)去的兩年里,它的受歡迎程度不斷上升,成為最受歡迎的平臺(tái)之一。今年,它成為第三大最受歡迎平臺(tái)。如果你還沒(méi)聽(tīng)說(shuō)過(guò)Kubernetes,它是一個(gè)允許你運(yùn)行和協(xié)調(diào)容器工作負(fù)載的平臺(tái)。
容器最開(kāi)始是一種Linux內(nèi)核進(jìn)程隔離構(gòu)造,包含2007年的cgroups和2002年的namespaces。自LXC在2008年面世后,容器變得更為重要,谷歌也開(kāi)發(fā)了自己內(nèi)部的“在容器中運(yùn)行一切”的機(jī)制,名為Borg??爝M(jìn)到2013年,Docker發(fā)布,徹底普及了容器。當(dāng)時(shí)Mesos是編排容器的主要工具,然而它并沒(méi)有被廣泛采用。Kubernetes在2015年發(fā)布,并迅速成為容器編排的事實(shí)標(biāo)準(zhǔn)。
為了了解Kubernetes的流行度,我們來(lái)思考一些問(wèn)題。開(kāi)發(fā)人員最后一次就部署生產(chǎn)應(yīng)用程序的方式達(dá)成一致是什么時(shí)候?你知道有多少開(kāi)發(fā)者是按開(kāi)箱即用的方式運(yùn)行工具的?如今有多少云操作工程師不了解應(yīng)用程序的工作原理?我們將在本文中探討答案。
基礎(chǔ)設(shè)施即YAML
從Puppet和Chef的世界來(lái)看,Kubernetes的一大轉(zhuǎn)變就是從基礎(chǔ)設(shè)施即代碼轉(zhuǎn)向?yàn)榛A(chǔ)架構(gòu)即YAML。Kubernetes中所有的資源,包括Pod、配置、部署、數(shù)據(jù)卷等,都可以簡(jiǎn)單地用YAML文件來(lái)表示。例如:
apiVersion: v1 kind: Pod metadata: name: site labels: app: web spec: containers: - name: front-end image: nginx ports: - containerPort: 80
通過(guò)這種表示形式,DevOps或SRE無(wú)需使用Python、Ruby或JavaScript等編程語(yǔ)言編寫代碼,即可更輕松且充分表達(dá)其工作負(fù)載。
將基礎(chǔ)設(shè)施作為數(shù)據(jù)的其他好處包括:
GitOps或Git操作版本控制。通過(guò)這種方法,你可以將所有的Kubernetes YAML文件都保存在Git倉(cāng)庫(kù)下,這樣你就可以精確地知道什么時(shí)候進(jìn)行了更改,誰(shuí)進(jìn)行了更改,以及到底更改了什么。這使得整個(gè)組織更加透明,避免了成員需要到哪里去尋找所需內(nèi)容的歧義,提高了效率。同時(shí),只需合并一個(gè)拉取請(qǐng)求就可以更容易地自動(dòng)對(duì)Kubernetes資源進(jìn)行更改。
可伸縮性。將資源定義為YAML使群集操作員能夠非常輕松地更改Kubernetes資源中的一個(gè)或兩個(gè)數(shù)字來(lái)更改縮放行為。Kubernetes有Pod水平自動(dòng)縮放控制器來(lái)幫助你確定一個(gè)特定部署需要擁有的最小和最大的Pod數(shù)量,以便能夠處理低流量和高流量時(shí)間。例如,如果你正在運(yùn)行的部署可能因?yàn)榱髁客蝗辉黾佣枰嗟娜萘?,你可以將maxReplicas從10改為20:
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: myapp namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: myapp-deployment minReplicas: 1 maxReplicas: 20 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 50
安全和控制。YAML是驗(yàn)證在Kubernetes中部署了什么以及如何部署的好方法。例如,在安全性方面,其中一個(gè)主要關(guān)注點(diǎn)是工作負(fù)載是否以非root用戶身份運(yùn)行。我們可以利用conftest這樣的工具,一個(gè)YAML/JSON驗(yàn)證器,加上Open Policy Agent這個(gè)策略驗(yàn)證器,來(lái)檢查你的工作負(fù)載的SecurityContext是否允許容器以root身份運(yùn)行。為此,用戶可以使用一個(gè)簡(jiǎn)單的OPA rego策略表示,例如:
package main deny[msg] { input.kind = "Deployment" not input.spec.template.spec.securityContext.runAsNonRoot = true msg = "Containers must not run as root" }
云提供商集成。科技行業(yè)的主要趨勢(shì)之一是在公共云提供商中運(yùn)行工作負(fù)載。在云提供商組件的幫助下,Kubernetes允許每個(gè)集群與它所運(yùn)行的云提供商進(jìn)行集成。例如,如果用戶在AWS中的Kubernetes中運(yùn)行應(yīng)用程序,并希望該應(yīng)用程序可以通過(guò)Service訪問(wèn),云提供商可幫助自動(dòng)創(chuàng)建一個(gè)LoadBalancer服務(wù),該服務(wù)將自動(dòng)配置一個(gè)Amazon Elastic Load Balancer,以將流量轉(zhuǎn)發(fā)到應(yīng)用程序Pod中。