为什么库伯内斯变得这么受欢迎?

2020-05-30 03:57:16

在撰写本文时,Kubernetes大约6岁,在过去的两年中,它的受欢迎程度不断上升,一直是最受欢迎的平台之一。今年,它成为第三大最受欢迎的平台。如果您还没有听说过Kubernetes,那么它是一个允许您运行和编排容器工作负载的平台。

容器最初是一个Linux内核进程隔离构造,它包含2007年的cgroup和2002年的名称空间。当LXC在2008年可用时,容器变得更像是一种东西,Google开发了自己的内部“在容器中运行所有东西的机制”,名为Borg。快进到2013年,Docker发布,彻底普及了面向群众的货柜。当时,Mesos是编排容器的主要工具,然而,它并没有被广泛采用。Kubernetes于2015年发布,并迅速成为事实上的容器编排标准。

为了试图理解库伯内斯的受欢迎程度,让我们考虑一些问题。开发人员上一次就部署生产应用程序的方式达成一致是什么时候?您知道有多少开发人员按开箱即用方式运行工具?今天有多少云运营工程师不了解应用程序的工作原理?我们将在本文中探索答案。

来自木偶和厨师的世界,Kubernetes的一个重大转变是从作为代码的基础设施转向作为数据的基础设施-具体地说,就是YAML。Kubernetes中的所有资源,包括实例、配置、部署、卷等,都可以简单地表示为一个YAML文件。例如:

apiVersion:v1Kind:PODMEDATA:名称:站点和标签:Podadata应用程序:WebSpec:容器:-Name:前端端口:nginx:nginx端口:-ContainerPort:80%-ContainerPort:80-ContainerPort:-ContainerPort:80。

这种表示使DevOps或站点可靠性工程师更容易完全表达他们的工作负载,而不需要用Python、Ruby或Javascript等编程语言编写代码。

GitOps或Git Operations版本控制。使用这种方法,您可以将所有的Kubernetes YAML文件保存在git存储库中,这样您就可以准确地知道何时进行了更改、由谁进行了更改,以及具体更改了哪些内容。这提高了整个组织的透明度,避免了成员需要去哪里查找他们需要的东西的模棱两可,从而提高了效率。同时,只需合并一个拉流请求,就可以更轻松地自动更改Kubernetes资源。

可扩展性。通过将资源定义为YAML,集群运营商可以非常轻松地更改Kubernetes资源中的一两个数字来改变伸缩行为。Kubernetes具有水平Pod Autoscaler,可帮助您确定特定部署必须能够处理低流量和高流量所需的最小和最大Pod数量。例如,如果您运行的展开可能需要更多容量,因为流量突然增加,则可以将maxReplicas从10更改为20:

apiVersion:autoscaling/v2beta2ind:HorizontalPodAutoscaler元数据:名称:myapp配置名称空间:defaultspec:配置比例TargetRef:配置配置apiVersion:app/v1配置配置类型:部署配置配置名称:myapp-Deployment:minReplicas:1配置maxReplicas:20配置规格:配置类型:配置类型:配置资源配置类型。

安全和控制。YAML是验证在Kubernetes中部署了什么以及如何部署内容的好方法。例如,当涉及到安全性时,一个重要的问题是您的工作负载是否以非root用户身份运行。我们可以使用像conftest这样的工具(一个YAML/JSON验证器)和Open Policy Agent(一个策略验证器)来检查您的工作负载的SecurityContext是否允许容器作为根运行。为此,用户可以使用简单的Open Policy Agent rego策略,如下所示:

软件包mainden[msg]{*input.ind=";Deployment";不是input.spec.template.spec.securityContext.runAsNonRoot=true。容器不能以根用户身份运行。}。

云提供商集成。科技行业的一个主要趋势是在公共云提供商中运行工作负载。在云提供商组件的帮助下,Kubernetes允许每个集群与其运行的云提供商集成。例如,如果用户在AWS的Kubernetes中运行应用程序,并希望可以通过服务访问该应用程序,云提供商将帮助自动创建LoadBalancer服务,该服务将自动调配Amazon Elastic Load Balizer以将流量转发到应用程序Pod。

Kubernetes具有很强的可扩展性,开发人员非常喜欢这一点。现有的资源有Pod、Deployment、StatefulSet、Secrets、ConfigMaps等,但用户和开发人员可以通过自定义资源定义的形式添加更多资源。例如,如果我们想定义一个CronTab资源,我们可以使用如下内容来实现:

apiVersion:apitensions.k8s.io/v1Kind:CustomResourceDefinitionMetadata:名称:crontdis.my.orgspec:ngroup:my.org;版本:apiversion1-name:v1;apiversions.k8s.io服务的类型:true;存储:true:crontab.my.orgspea:cstomResourceDefinitionMetadata:crontdis.my.orgspec:组:my.org;版本:-name:v1;类型:Object:True;存储:True;:Schema:;打开APIV3Schema:;类型:Object::Object:Object_。*类型:对象*属性:*;^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$';*副本:*类型:整数*范围:命名空间名称:*复数:crontab:单数:crontab*。

apiVersion:";my.org/v1";Kind:CronTabMetadata:名称:my-cron-objectspec:cronSpec:";*/5";cronSpec:";*/5";图片:my-cron-image和副本:5。

Kubernetes可扩展性的另一种形式是开发人员能够编写自己的运算符,该运算符是在遵循控制循环模式的Kubernetes集群中运行的特定进程。运营商允许用户通过与Kubernetes API对话来自动化CRD(自定义资源定义)的管理。

社区有几个工具,允许开发人员创建自己的运算符。其中一个工具是Operator Framework及其Operator SDK。SDK为开发人员快速开始创建操作符提供了一个框架。例如,您可以从它的命令行开始,如下所示:

.|_cmd||_Manager|_main.go|_go.mod|_Deploy||_role.yaml||_角色_binding.yaml||_服务帐户.yaml||_operator.yaml|_tools.go|_go.sum|_.gitignore|_version||_version.go|_Build||_bin|_。USER_SETUP|_入口点||_Dockerfile|_pkg||_API|_apis.go||_Controller|_Controler.go。

如果开发人员需要更多的控制,他们可以修改Golang文件中的样板代码。例如,要修改控制器的详细信息,他们可以对Controler.go文件进行更改。

另一个项目Kudo允许您只使用声明性YAML文件来创建操作符。例如,Apache Kafka操作员的定义如下所示,它允许用户使用以下几个命令在Kubernetes之上安装Kafka集群:

$kubectl kudo安装Kafka--instance=my-kafka-name\bnb_cpu_cpu=3000m\r nbc_cpu=zk-p zooKeeper_uri=zk-zooKeeper-0.zk-hs:2181\f25$kubectl kudo安装kafka--instance=my-kafka-name\cpu=3000m\p broker_cpu=3000m\**p broker_count=5-p broker*-p broker_count=5-p broker*。*-p NUM_NETWORK_THREADS=10-p NUM_IO_THREADS=20。

在过去的几年里,Kubernetes每隔三四个月就会有一次重大发布,这意味着每年都会有三到四个主要发布。新功能的引入数量并没有减慢,上一次发布的版本中有30多个不同的添加和更改就是明证。此外,就像Kubernetes项目Github活动所表明的那样,即使在这些困难的时期,捐款也没有显示出放缓的迹象。

新功能使群集操作员在运行各种不同的工作负载时更加灵活。软件工程师也喜欢有更多的控件来将他们的应用程序直接部署到生产环境中。

Kubernetes受欢迎的另一个重要方面是它强大的社区。首先,Kubernetes在2015年被捐赠给一个供应商中立的家庭,当时它发布了1.0版:云本地计算基金会(Cloud Native Computing Foundation)。

随着项目的推进,也有范围广泛的社区SIG(特殊利益集团)瞄准Kubernetes的不同区域。他们不断添加新功能,使其更加用户友好。

Cloud Native Foundation还组织了CloudNativeCon/KubeCon,在撰写本文时,这是世界上有史以来最大的开源活动。该活动通常每年举行三次,聚集了数千名技术专家和专业人士,他们希望改善Kubernetes及其生态系统,并利用每三个月发布的一些新功能。

此外,Cloud Native Foundation有一个技术监督委员会,该委员会与其SIG一起研究基金会在云本地生态系统中的新项目和现有项目。大多数项目都有助于提升Kubernetes的价值主张。

最后,我相信如果没有社会人士有意识地互相包容,欢迎任何新来者,库伯内斯便不会取得今天的成功。

开发人员未来面临的主要挑战之一是如何更多地关注代码的细节,而不是代码运行所在的基础设施。为此,无服务器正在成为解决这一挑战的领先架构范例之一。已经有非常先进的框架,比如Kative和OpenFaas,它们使用Kubernetes从开发人员那里抽象出基础设施。

我们在本文中简要介绍了Kubernetes,但这只是冰山一角。用户可以利用更多的资源、功能和配置。我们将继续看到新的开源项目和技术来增强或发展Kubernetes,正如我们所提到的,贡献和社区不会有任何进展。

标签:公告、容器、Kubernetes、无服务器、堆栈溢出