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