發(fā)布于:2020-12-24 16:14:39
0
180
0
在撰寫本文時,Kubernetes已經(jīng)有6年的歷史了,在過去的兩年中,它的受歡迎程度不斷上升,一直是最受歡迎的平臺之一。今年,它在最受歡迎的平臺中排名第三。如果您還沒有聽說過Kubernetes,那么它是一個允許您運行和編排容器工作負(fù)載的平臺。
容器最初是一種Linux內(nèi)核進程隔離構(gòu)造,包含2007年的cgroup和2002年的名稱空間。當(dāng)2008年LXC可用時,容器變得更加普及,谷歌開發(fā)了自己的內(nèi)部“在容器中運行一切”機制,稱為Borg??爝M到2013年,Docker發(fā)布,為大眾徹底普及了容器。在那個時候,Mesos是編排容器的主要工具,然而,它并沒有被廣泛采用。Kubernetes于2015年發(fā)布,并迅速成為事實上的容器編排標(biāo)準(zhǔn)。
為了理解Kubernetes的流行,讓我們考慮一些問題。開發(fā)人員上一次就部署生產(chǎn)應(yīng)用程序的方式達成一致是在什么時候?您知道有多少開發(fā)人員是開箱即用地運行工具的?今天有多少云操作工程師不了解應(yīng)用程序是如何工作的?我們將在本文中探索答案。
基礎(chǔ)設(shè)施是YAML
Kubernetes來自于Puppet和Chef的世界,它的一個重大轉(zhuǎn)變就是從作為代碼的基礎(chǔ)設(shè)施轉(zhuǎn)向作為數(shù)據(jù)的基礎(chǔ)設(shè)施——特別是YAML。Kubernetes中的所有資源(包括Pods、配置、部署、卷等)都可以簡單地表示為YAML文件。例如:
這種表示方式使DevOps或站點可靠性工程師更容易完全表達他們的工作負(fù)載,而不需要用Python、Ruby或Javascript等編程語言編寫代碼。
使用基礎(chǔ)設(shè)施作為數(shù)據(jù)的其他好處包括:
apiVersion: v1
kind: Pod
metadata:
name: site
labels:
app: web
spec:
containers:
- name: front-end
image: nginx
ports:
- containerPort: 80
1.apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
2.GitOps或Git操作版本控制。使用這種方法,您可以將所有Kubernetes YAML文件保存在git存儲庫中,這允許您準(zhǔn)確地知道什么時候進行了更改、是誰進行了更改,以及到底更改了什么。這將使整個組織更加透明,并通過避免不明確的成員需要去哪里找到他們需要的東西來提高效率。同時,通過合并一個pull請求,它可以更容易地自動更改Kubernetes資源。
3.可伸縮性。通過將資源定義為YAML,集群操作符可以非常容易地更改Kubernetes資源中的一個或兩個數(shù)字來更改伸縮行為。Kubernetes有水平吊艙自動測量器,可以幫助您確定一個特定部署在處理低流量和高流量時所需要的吊艙的最小和最大數(shù)量。例如,如果您運行的部署可能需要更多的容量,因為流量突然增加,您可以將maxReplicas從10更改為20: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
4.安全與控制。YAML是驗證在Kubernetes中部署什么以及如何部署的一種很好的方法。例如,涉及安全性的一個重要問題是,您的工作負(fù)載是否以非根用戶的身份運行。我們可以使用像conftest這樣的工具(一個YAML/JSON驗證器)和Open Policy Agent(一個策略驗證器)來檢查您的工作負(fù)載的SecurityContext不允許容器作為根運行。為此,用戶可以使用一個簡單的開放策略代理rego策略,如下所示:
package main
deny[msg] {
input.kind = "Deployment"
not input.spec.template.spec.securityContext.runAsNonRoot = true
msg = "Containers must not run as root"
}
5.云提供商集成。技術(shù)行業(yè)的主要趨勢之一是在公共云提供商中運行工作負(fù)載。在云提供商組件的幫助下,Kubernetes允許每個集群與它運行的云提供商集成。例如,如果用戶在AWS的Kubernetes中運行應(yīng)用程序,并且希望通過服務(wù)訪問該應(yīng)用程序,云提供商將幫助自動創(chuàng)建LoadBalancer服務(wù),該服務(wù)將自動提供Amazon彈性負(fù)載均衡器,以將流量轉(zhuǎn)發(fā)給應(yīng)用程序pods。
可擴展性
Kubernetes具有很強的可擴展性,開發(fā)人員非常喜歡這一點。有一組現(xiàn)有的資源,比如Pods、deployment、statefulset、Secrets、ConfigMaps等。但是,用戶和開發(fā)人員可以以自定義資源定義的形式添加更多資源。例如,如果我們想定義一個CronTab資源,我們可以這樣做:
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
name: crontabs.my.org
spec:
group: my.org
versions:
- name: v1
served: true storage: true Schema:
openAPIV3Schema:
type: object
properties:
spec:
type: object
properties:
cronSpec:
type: string
pattern: '^(d+|*)(/d+)?(s+(d+|*)(/d+)?){4}$'
replicas:
type: integer
minimum: 1
maximum: 10
scope: Namespaced
names:
plural: crontabs
singular: crontab
kind: CronTab
shortNames:
- ct
我們稍后可以創(chuàng)建一個CronTab資源,如下所示:
apiVersion: "my.org/v1"
kind: CronTab
metadata:
name: my-cron-object
spec:
cronSpec: "* * * * */5"
image: my-cron-image
replicas: 5
Kubernetes可擴展性的另一種形式是,開發(fā)人員可以編寫自己的操作符,即運行在Kubernetes集群中遵循控制循環(huán)模式的特定進程。通過與Kubernetes API對話,操作符允許用戶自動管理crd(自定義資源定義)。
社區(qū)提供了一些工具,允許開發(fā)人員創(chuàng)建他們自己的操作符。其中一個工具是Operator框架及其Operator SDK。SDK為開發(fā)人員快速創(chuàng)建操作符提供了框架。例如,你可以像這樣從命令行開始:
$ operator-sdk new my-operator --repo github.com/myuser/my-operator
它為您的操作符創(chuàng)建了完整的樣板文件,包括YAML文件和Golang代碼:
.
|____cmd
| |____manager
| | |____main.go
|____go.mod
|____deploy
| |____role.yaml
| |____role_binding.yaml
| |____service_account.yaml
| |____operator.yaml
|____tools.go
|____go.sum
|____.gitignore
|____version
| |____version.go
|____build
| |____bin
| | |____user_setup
| | |____entrypoint
| |____Dockerfile
|____pkg
| |____apis
| | |____apis.go
| |____controller
| | |____controller.go
然后你可以像這樣添加api和控制器:
$ operator-sdk add api --api-version=myapp.com/v1alpha1 --kind=MyAppService
$ operator-sdk add controller --api-version=myapp.com/v1alpha1 --kind=MyAppService
最后構(gòu)建并將操作符推到容器注冊表:
$ operator-sdk build your.container.registry/youruser/myapp-operator
如果開發(fā)人員需要更多的控制,他們可以修改Golang文件中的樣板代碼。例如,為了修改控制器的細節(jié),它們可以對控制器進行更改。文件。
另一個項目KUDO允許您通過使用聲明式Y(jié)AML文件來創(chuàng)建操作符。例如,Apache Kafka的操作符將被這樣定義,它允許用戶通過幾個命令在Kubernetes上安裝一個Kafka集群:
$ kubectl kudo install zookeeper
$ kubectl kudo install kafka
然后調(diào)整它也與另一個命令:
$ 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
創(chuàng)新
在過去的幾年中,Kubernetes每三到四個月發(fā)布一次主要的版本,這意味著每年都有三到四個主要的版本。新特性的數(shù)量并沒有減少,在上一個版本中有超過30個不同的添加和改變。此外,正如Kubernetes project Github活動所表明的那樣,即使在這些困難時期,貢獻也沒有放緩的跡象。
新特性允許集群操作符在運行各種不同的工作負(fù)載時具有更大的靈活性。軟件工程師也喜歡擁有更多的控制權(quán),以便將他們的應(yīng)用程序直接部署到生產(chǎn)環(huán)境中。
社區(qū)
Kubernetes受歡迎的另一個重要方面是它強大的社區(qū)。對于初學(xué)者來說,Kubernetes在2015年發(fā)布1.0版本時被捐贈給了一個中立的供應(yīng)商:云本地計算基金會。
隨著項目的推進,還有廣泛的針對Kubernetes中不同領(lǐng)域的社區(qū)SIGs(特殊利益團體)。他們不斷地添加新功能,使它更加用戶友好。
云本地基金會還組織了CloudNativeCon/KubeCon,這是迄今為止世界上最大的開源活動。該活動通常每年舉行三次,聚集了數(shù)千名技術(shù)人員和專業(yè)人士,他們希望改進Kubernetes及其生態(tài)系統(tǒng),并利用每三個月發(fā)布一次的一些新特性。
此外,云本機基金會有一個技術(shù)監(jiān)督委員會,與它的SIGs一起檢查基金會在云本機生態(tài)系統(tǒng)中的新項目和現(xiàn)有項目。大多數(shù)項目都有助于增強Kubernetes的價值主張。
最后,我認(rèn)為,如果社區(qū)不有意識地努力包容彼此并歡迎任何新來者,Kubernetes就不會取得現(xiàn)在這樣的成功。
未來
開發(fā)人員未來面臨的主要挑戰(zhàn)之一是如何更多地關(guān)注代碼的細節(jié),而不是代碼運行所在的基礎(chǔ)設(shè)施。為此,serverless正在成為解決這一挑戰(zhàn)的主要架構(gòu)范例之一。已經(jīng)有一些非常高級的框架,如Knative和OpenFaas,它們使用Kubernetes從開發(fā)人員那里抽象基礎(chǔ)設(shè)施。
在本文中,我們簡要地介紹了Kubernetes,但這只是冰山一角。用戶可以利用更多的資源、特性和配置。我們將繼續(xù)看到新的開源項目和技術(shù)來增強或發(fā)展Kubernetes,正如我們提到的,貢獻和社區(qū)不會離開任何地方。