当前位置: 首页 > 科技观察

为什么Kubernetes如此受欢迎?

时间:2023-03-13 19:35:25 科技观察

在撰写本文时,Kubernetes已有6年历史[1],并且在过去两年中越来越受欢迎,仍然是最受欢迎的平台之一[2]。今年,它成为第三大最受欢迎的平台[3]。如果您还没有听说过Kubernetes,它是一个可让您运行和编排容器工作负载的平台。容器最初是Linux内核进程隔离结构,2007年有cgroups[4],2002年有namespaces[5](命名空间)。2008年LXC[6]面世后,容器变得越来越重要,Google开发了自己的内部“runeverything”在容器中”系统称为Borg[7]。快进到2013年,Docker正式发布并完全可供大众使用。当时,Mesos[8]是编排容器的主要工具,但并没有被广泛采用。Kubernetes于2015年发布,并迅速成为容器编排的事实标准。要了解Kubernetes的受欢迎程度,请考虑一些问题。开发人员最后一次就部署生产应用程序的方式达成一致是什么时候?您知道有多少开发人员正在运行开箱即用的工具?今天有多少云运营工程师不了解应用程序的工作原理?我们将在本文中探索答案。基于数据(YAML)的架构来自Puppet[9]和Chef[10]的世界,Kubernetes的主要转变之一是从基于代码的基础设施向基于数据的基础设施(特别是YAML)的转变。Kubernetes中的所有资源,包括Pod、配置、部署、卷等,都可以简单地用YAML文件表示。apiVersion:v1kind:Podmetadata:name:sitelabels:app:webspec:containers:-name:front-endimage:nginxports:-containerPort:80这种表示形式使DevOps或站点可靠性工程师更容易充分表达他们的工作负载,而无需编写代码Python、Ruby或Javascript等编程语言。数据驱动架构的其他好处包括:GitOps或Git操作版本控制。使用这种方法,您可以将所有KubernetesYAML文件保存在一个git存储库中,这样您就可以准确了解更改的时间、更改人以及更改的具体内容。这避免了整个组织的成员寻找可能含糊不清的内容的需要,从而提高了整个组织的透明度和效率。同时,通过合并请求可以更轻松地自动化对Kubernetes资源的更改。可扩展性。将资源定义为YAML使得集群操作员很容易更改Kubernetes资源中的一两个数字以更改扩展行为。Kubernetes有一个水平pod自动缩放器,可帮助您确定特定部署必须能够处理的最小和最大pod数量,以处理低流量和高流量时间。例如,如果您正在运行的部署由于流量突然增加而可能需要更多容量,您可以将maxReplicas从10更改为20:apiVersion:autoscaling/v2beta2kind:Horizo??ntalPodAutoscalermetadata:name:myappnamespace:defaultspec:scaleTargetRef:apiVersion:apps/v1kind:Deploymentname:myapp-deploymentminReplicas:1maxReplicas:20metrics:-type:Resourceresource:name:cputtarget:type:UtilizationaverageUtilization:50安全和控制。YAML是验证在Kubernetes中部署什么以及如何部署的好方法。例如,关于安全性的主要问题之一是您的工作负载是否以非根用户身份运行。我们可以使用conftest[11](一种YAML/JSON验证器)和OpenPolicyAgent[12](一种策略验证器)等工具来检查您的工作负载的SecurityContext[13]是否允许容器以root方式运行。为此,用户可以使用如下简单的开放策略代理重新注册策略:packagemaindeny[msg]{input.kind="Deployment"notinput.spec.template.spec.securityContext.runAsNonRoot=truemsg="Containersmustnotrunasroot"}云提供商集成。科技行业的主要趋势之一是在公共云提供商中运行工作负载。通过云提供商组件,Kubernetes允许每个集群与其运行的云提供商集成。例如,如果用户在AWS中的Kubernetes中运行应用程序并希望通过服务访问该应用程序,云提供商将帮助自动创建一个LoadBalancer服务,该服务将自动设置一个AmazonElasticLoadBalancer以将流量转发到该应用程序豆荚。可扩展性Kubernetes具有很强的可扩展性,开发人员对此非常满意。一些内置的资源,如Pod、Deployment、StatefulSet、Secrets、ConfigMap等。同时,用户和开发者可以通过“自定义资源定义[14]”来添加更多的资源。例如,如果我们想定义一个CronTab资源,我们可以使用:apiVersion:apiextensions.k8s.io/v1kind:CustomResourceDefinitionmetadata:name:crontabs.my.orgspec:group:my.orgversions:-name:v1served:truestorage:trueSchema:openAPIV3Schema:type:objectproperties:spec:type:objectproperties:cronSpec:type:stringpattern:'^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$'replicas:type:integerminimum:1maximum:10scope:Namespacednames:plural:crontabssingular:crontabkind:CronTabshortNames:-ct我们稍后可以创建一个CronTab资源:apiVersion:"my.org/v1"kind:CronTabmetadata:name:my-cron-objectspec:cronSpec:"*****/5"image:my-cron-imagereplicas:5另一种形式的Kubernetes可扩展性是供开发人员编写自己的Operator[15],Operator运行在Kubernetes集群中,遵循控制循环模式[16]的具体过程。Operator允许用户通过与KubernetesAPI对话来自动管理CRD(自定义资源定义)。社区有多种工具可以让开发人员创建自己的Operator。这些工具之一是OperatorFramework[17]及其OperatorSDK[18]。SDK为开发人员提供了一个框架,可以快速开始创建算子。例如,您可以从命令行[19]输入以下命令开始:$operator-sdknewmy-operator--repogithub.com/myuser/my-operator它将为您的操作员创建整个样板,包括YAML文件和去代码:。|____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-sdkaddapi--api-version=myapp.com/v1alpha1--kind=MyAppService$operator-sdkaddcontroller--api-version=myapp.com/v1alpha1--kind=MyAppService最后构建并将操作员推送到您的容器注册表:$operator-sdkbuildyour.container.registry/youruser/myapp-operator如果开发人员需要更多控制权,他们可以修改Go文件中的样板代码。例如,要修改控制器的详细信息,他们可以更改controller.go文件。另一个项目KUDO[20]允许您仅使用声明性YAML文件创建运算符。例如,ApacheKafka的操作符将定义为以下[21],它允许用户使用以下命令在Kubernetes上安装Kafka集群:$kubectlkudoinstallzookeeper$kubectlkudoinstallkafka然后使用另一个命令对其进行调整:$kubectlkudoinstallkafka--instance=my-kafka-name\-pZOOKEEPER_URI=zk-zookeeper-0.zk-hs:2181\-pZOOKEEPER_PATH=/my-path-pBROKER_CPUS=3000m\-pBROKER_COUNT=5-pBROKER_MEM=4096m\-pDISK_SIZE=40Gi-pMIN_INSYNC_REPLICAS=\-pNUM_NETWORK_THREADS=10-pNUM_IO_THREADS=20在过去的几年里,Kubernetes每三四个月发布一次主要版本,也就是说每年有三四个主要版本。正在推出的新功能的数量并没有放缓,最新版本[22]中的30多项添加和更改就是明证。此外,Kubernetes项目GitHub活动显示[23]即使在这些困难时期,贡献也没有放缓的迹象。这些新功能在运行各种不同的工作负载时为集群操作员提供了更大的灵活性。软件工程师还喜欢拥有更多控制权,可以将他们的应用程序直接部署到生产环境中。社区Kubernetes流行的另一个重要方面是其强大的社区。首先,Kubernetes在2015年发布1.0版本时被捐赠给了一个供应商中立的家庭:云原生计算基金会[24]。随着项目的进展,还有针对Kubernetes不同领域的各种社区SIG[25](特殊兴趣小组)。他们不断添加新功能并使它们更加用户友好。CloudNativeFoundation还组织了CloudNativeCon/KubeCon,截至撰写本文时,这是世界上最大的开源活动。该活动通常每年举办三次,吸引了成千上万寻求改进Kubernetes及其生态系统并利用每三个月发布的新功能的技术专家和专业人士。此外,云原生基金会有一个技术监督委员会[26],它与SIG[27]一起研究基金会在云原生生态系统中的新项目和现有项目[28]。大多数项目都有助于提升Kubernetes的价值主张。最后,我相信如果没有社区有意识地相互包容和欢迎任何新来者,Kubernetes是不会成功的。未来开发人员面临的主要挑战之一是如何更多地关注代码的细节,而不是代码运行的基础设施。为此,无服务器[29]正在成为应对这一挑战的领先架构范例之一。已经有非常高级的框架,例如Knative[30]和OpenFaas[31],它们使用Kubernetes从开发人员那里抽象出基础设施。我们在本文中对Kubernetes进行了简要介绍,但这只是冰山一角。用户可以利用更多的资源、功能和配置。我们将继续看到增强或发展Kubernetes的新开源项目和技术,正如我们提到的,贡献和社区无处不在。