发布于:2020-12-24 16:14:39
0
171
0
在撰写本文时,Kubernetes已经有6年的历史了,在过去的两年中,它的受欢迎程度不断上升,一直是最受欢迎的平台之一。今年,它在最受欢迎的平台中排名第三。如果您还没有听说过Kubernetes,那么它是一个允许您运行和编排容器工作负载的平台。
容器最初是一种Linux内核进程隔离构造,包含2007年的cgroup和2002年的名称空间。当2008年LXC可用时,容器变得更加普及,谷歌开发了自己的内部“在容器中运行一切”机制,称为Borg。快进到2013年,Docker发布,为大众彻底普及了容器。在那个时候,Mesos是编排容器的主要工具,然而,它并没有被广泛采用。Kubernetes于2015年发布,并迅速成为事实上的容器编排标准。
为了理解Kubernetes的流行,让我们考虑一些问题。开发人员上一次就部署生产应用程序的方式达成一致是在什么时候?您知道有多少开发人员是开箱即用地运行工具的?今天有多少云操作工程师不了解应用程序是如何工作的?我们将在本文中探索答案。
基础设施是YAML
Kubernetes来自于Puppet和Chef的世界,它的一个重大转变就是从作为代码的基础设施转向作为数据的基础设施——特别是YAML。Kubernetes中的所有资源(包括Pods、配置、部署、卷等)都可以简单地表示为YAML文件。例如:
这种表示方式使DevOps或站点可靠性工程师更容易完全表达他们的工作负载,而不需要用Python、Ruby或Javascript等编程语言编写代码。
使用基础设施作为数据的其他好处包括:
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存储库中,这允许您准确地知道什么时候进行了更改、是谁进行了更改,以及到底更改了什么。这将使整个组织更加透明,并通过避免不明确的成员需要去哪里找到他们需要的东西来提高效率。同时,通过合并一个pull请求,它可以更容易地自动更改Kubernetes资源。
3.可伸缩性。通过将资源定义为YAML,集群操作符可以非常容易地更改Kubernetes资源中的一个或两个数字来更改伸缩行为。Kubernetes有水平吊舱自动测量器,可以帮助您确定一个特定部署在处理低流量和高流量时所需要的吊舱的最小和最大数量。例如,如果您运行的部署可能需要更多的容量,因为流量突然增加,您可以将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中部署什么以及如何部署的一种很好的方法。例如,涉及安全性的一个重要问题是,您的工作负载是否以非根用户的身份运行。我们可以使用像conftest这样的工具(一个YAML/JSON验证器)和Open Policy Agent(一个策略验证器)来检查您的工作负载的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.云提供商集成。技术行业的主要趋势之一是在公共云提供商中运行工作负载。在云提供商组件的帮助下,Kubernetes允许每个集群与它运行的云提供商集成。例如,如果用户在AWS的Kubernetes中运行应用程序,并且希望通过服务访问该应用程序,云提供商将帮助自动创建LoadBalancer服务,该服务将自动提供Amazon弹性负载均衡器,以将流量转发给应用程序pods。
可扩展性
Kubernetes具有很强的可扩展性,开发人员非常喜欢这一点。有一组现有的资源,比如Pods、deployment、statefulset、Secrets、ConfigMaps等。但是,用户和开发人员可以以自定义资源定义的形式添加更多资源。例如,如果我们想定义一个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
我们稍后可以创建一个CronTab资源,如下所示:
apiVersion: "my.org/v1"
kind: CronTab
metadata:
name: my-cron-object
spec:
cronSpec: "* * * * */5"
image: my-cron-image
replicas: 5
Kubernetes可扩展性的另一种形式是,开发人员可以编写自己的操作符,即运行在Kubernetes集群中遵循控制循环模式的特定进程。通过与Kubernetes API对话,操作符允许用户自动管理crd(自定义资源定义)。
社区提供了一些工具,允许开发人员创建他们自己的操作符。其中一个工具是Operator框架及其Operator SDK。SDK为开发人员快速创建操作符提供了框架。例如,你可以像这样从命令行开始:
$ operator-sdk new my-operator --repo github.com/myuser/my-operator
它为您的操作符创建了完整的样板文件,包括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
最后构建并将操作符推到容器注册表:
$ operator-sdk build your.container.registry/youruser/myapp-operator
如果开发人员需要更多的控制,他们可以修改Golang文件中的样板代码。例如,为了修改控制器的细节,它们可以对控制器进行更改。文件。
另一个项目KUDO允许您通过使用声明式YAML文件来创建操作符。例如,Apache Kafka的操作符将被这样定义,它允许用户通过几个命令在Kubernetes上安装一个Kafka集群:
$ kubectl kudo install zookeeper
$ kubectl kudo install 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 project Github活动所表明的那样,即使在这些困难时期,贡献也没有放缓的迹象。
新特性允许集群操作符在运行各种不同的工作负载时具有更大的灵活性。软件工程师也喜欢拥有更多的控制权,以便将他们的应用程序直接部署到生产环境中。
社区
Kubernetes受欢迎的另一个重要方面是它强大的社区。对于初学者来说,Kubernetes在2015年发布1.0版本时被捐赠给了一个中立的供应商:云本地计算基金会。
随着项目的推进,还有广泛的针对Kubernetes中不同领域的社区SIGs(特殊利益团体)。他们不断地添加新功能,使它更加用户友好。
云本地基金会还组织了CloudNativeCon/KubeCon,这是迄今为止世界上最大的开源活动。该活动通常每年举行三次,聚集了数千名技术人员和专业人士,他们希望改进Kubernetes及其生态系统,并利用每三个月发布一次的一些新特性。
此外,云本机基金会有一个技术监督委员会,与它的SIGs一起检查基金会在云本机生态系统中的新项目和现有项目。大多数项目都有助于增强Kubernetes的价值主张。
最后,我认为,如果社区不有意识地努力包容彼此并欢迎任何新来者,Kubernetes就不会取得现在这样的成功。
未来
开发人员未来面临的主要挑战之一是如何更多地关注代码的细节,而不是代码运行所在的基础设施。为此,serverless正在成为解决这一挑战的主要架构范例之一。已经有一些非常高级的框架,如Knative和OpenFaas,它们使用Kubernetes从开发人员那里抽象基础设施。
在本文中,我们简要地介绍了Kubernetes,但这只是冰山一角。用户可以利用更多的资源、特性和配置。我们将继续看到新的开源项目和技术来增强或发展Kubernetes,正如我们提到的,贡献和社区不会离开任何地方。
作者介绍