为什么Kubernetes这么受欢迎?

为什么Kubernetes这么受欢迎?

作者:冯旭松编译 2020-06-16 14:13:50

云计算 在本文发表时,Kubernetes大约已经有6年的历史,在过去的两年里,它的受欢迎程度不断上升,成为最受欢迎的平台之一。今年,它成为第三大最受欢迎平台。如果你还没听说过Kubernetes,它是一个允许你运行和协调容器工作负载的平台。

在本文发表时,Kubernetes大约已经有6年的历史,在过去的两年里,它的受欢迎程度不断上升,成为最受欢迎的平台之一。今年,它成为第三大最受欢迎平台。如果你还没听说过Kubernetes,它是一个允许你运行和协调容器工作负载的平台。

容器最开始是一种Linux内核进程隔离构造,包含2007年的cgroups和2002年的namespaces。自LXC在2008年面世后,容器变得更为重要,谷歌也开发了自己内部的“在容器中运行一切”的机制,名为Borg。快进到2013年,Docker发布,彻底普及了容器。当时Mesos是编排容器的主要工具,然而它并没有被广泛采用。Kubernetes在2015年发布,并迅速成为容器编排的事实标准。

为了了解Kubernetes的流行度,我们来思考一些问题。开发人员最后一次就部署生产应用程序的方式达成一致是什么时候?你知道有多少开发者是按开箱即用的方式运行工具的?如今有多少云操作工程师不了解应用程序的工作原理?我们将在本文中探讨答案。

基础设施即YAML

从Puppet和Chef的世界来看,Kubernetes的一大转变就是从基础设施即代码转向为基础架构即YAML。Kubernetes中所有的资源,包括Pod、配置、部署、数据卷等,都可以简单地用YAML文件来表示。例如:

 

  1. apiVersion: v1 
  2. kind: Pod 
  3. metadata: 
  4. name: site 
  5. labels: 
  6. app: web 
  7. spec: 
  8. containers: 
  9. name: front-end 
  10.   image: nginx 
  11.   ports: 
  12.     - containerPort: 80 

通过这种表示形式,DevOps或SRE无需使用Python、Ruby或JavaScript等编程语言编写代码,即可更轻松且充分表达其工作负载。

将基础设施作为数据的其他好处包括:

GitOps或Git操作版本控制。通过这种方法,你可以将所有的Kubernetes YAML文件都保存在Git仓库下,这样你就可以精确地知道什么时候进行了更改,谁进行了更改,以及到底更改了什么。这使得整个组织更加透明,避免了成员需要到哪里去寻找所需内容的歧义,提高了效率。同时,只需合并一个拉取请求就可以更容易地自动对Kubernetes资源进行更改。

可伸缩性。将资源定义为YAML使群集操作员能够非常轻松地更改Kubernetes资源中的一个或两个数字来更改缩放行为。Kubernetes有Pod水平自动缩放控制器来帮助你确定一个特定部署需要拥有的最小和最大的Pod数量,以便能够处理低流量和高流量时间。例如,如果你正在运行的部署可能因为流量突然增加而需要更多的容量,你可以将maxReplicas从10改为20:

 

  1. apiVersion: autoscaling/v2beta2 
  2. kind: HorizontalPodAutoscaler 
  3. metadata: 
  4. name: myapp 
  5. namespace: default 
  6. spec: 
  7. scaleTargetRef: 
  8. apiVersion: apps/v1 
  9. kind: Deployment 
  10. name: myapp-deployment 
  11. minReplicas: 1 
  12. maxReplicas: 20 
  13. metrics: 
  14. - type: Resource 
  15. resource: 
  16.   name: cpu 
  17.   target: 
  18.     type: Utilization 
  19.     averageUtilization: 50 

安全和控制。YAML是验证在Kubernetes中部署了什么以及如何部署的好方法。例如,在安全性方面,其中一个主要关注点是工作负载是否以非root用户身份运行。我们可以利用conftest这样的工具,一个YAML/JSON验证器,加上Open Policy Agent这个策略验证器,来检查你的工作负载的SecurityContext是否允许容器以root身份运行。为此,用户可以使用一个简单的OPA rego策略表示,例如:

 

  1. package main 
  2.  
  3. deny[msg] { 
  4. input.kind = "Deployment" 
  5. not input.spec.template.spec.securityContext.runAsNonRoot = true 
  6. msg = "Containers must not run as root" 
  7. }  

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

扩展

Kubernetes的可扩展性很强,开发者很喜欢这一点。现有的资源有例如Pods、Deployments、StatefulSets、Secrets、ConfigMaps等。但是,用户和开发者可以通过自定义资源定义的形式添加更多的资源。例如如果我们想定义一个CronTab资源,我们可以用这样的方式来实现:

 

  1. apiVersion: apiextensions.k8s.io/v1 
  2. kind: CustomResourceDefinition 
  3. metadata: 
  4. name: crontabs.my.org 
  5. spec: 
  6. group: my.org 
  7. versions: 
  8. name: v1 
  9.   served: true 
  10.   storage: true 
  11.   Schema
  12.     openAPIV3Schema: 
  13.       type: object 
  14.       properties: 
  15.         spec: 
  16.           type: object 
  17.           properties: 
  18.             cronSpec: 
  19.               type: string 
  20.               pattern: '^(\d+|\*)(/\d+)?(\s+(\d+|\*)(/\d+)?){4}$' 
  21.             replicas: 
  22.               type: integer 
  23.               minimum: 1 
  24.               maximum: 10 
  25. scope: Namespaced 
  26. names: 
  27. plural: crontabs 
  28. singular: crontab 
  29. kind: CronTab 
  30. shortNames: 
  31. - ct 

之后我们可以用类似以下方式来创建一个CronTab资源:

 

  1. apiVersion: "my.org/v1" 
  2. kind: CronTab 
  3. metadata: 
  4. name: my-cron-object 
  5. spec: 
  6. cronSpec: "* * * * */5" 
  7. image: my-cron-image 
  8. replicas: 5 

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

社区有一些工具允许开发者创建自己的Operator。其中一个工具是Operator Framework及其Operator SDK。SDK为开发者提供了一个框架,以便快速开始创建Operator。例如,你可以使用它的命令行用这样的方法开始入门:

  1. $ operator-sdk new my-operator --repo github.com/myuser/my-operator 

这将为你的Operator创建整个模版,包括YAML文件和Golang代码:

 

  1. |____cmd 
  2. | |____manager 
  3. | | |____main.go 
  4. |____go.mod 
  5. |____deploy 
  6. | |____role.yaml 
  7. | |____role_binding.yaml 
  8. | |____service_account.yaml 
  9. | |____operator.yaml 
  10. |____tools.go 
  11. |____go.sum 
  12. |____.gitignore 
  13. |____version 
  14. | |____version.go 
  15. |____build 
  16. | |____bin 
  17. | | |____user_setup 
  18. | | |____entrypoint 
  19. | |____Dockerfile 
  20. |____pkg 
  21. | |____apis 
  22. | | |____apis.go 
  23. | |____controller 
  24. | | |____controller.go 

然后你可以这样添加APIs和控制器:

 

  1. $ operator-sdk add api --api-version=myapp.com/v1alpha1 --kind=MyAppService  
  2. $ operator-sdk add controller --api-version=myapp.com/v1alpha1 --kind=MyAppService 

最后构建并将Operator镜像推送到你的容器注册表。

  1. $ operator-sdk build your.container.registry/youruser/myapp-operator 

如果开发者需要有更多的控制权,他们可以修改Golang文件中的模板代码。例如,要修改控制器的具体细节,他们可以对controller.go文件进行修改。

另一个项目,KUDO,允许你只使用声明性的YAML文件来创建Operator。例如,一个Apache Kafka的Operator将像这样定义,它允许用户通过几个命令在Kubernetes之上安装一个Kafka集群。

 

  1. $ kubectl kudo install zookeeper 
  2. $ kubectl kudo install kafka 

也可以使用另一个命令调整它。

 

  1. $ kubectl kudo install kafka --instance=my-kafka-name \ 
  2.         -p ZOOKEEPER_URI=zk-zookeeper-0.zk-hs:2181 \ 
  3.         -p ZOOKEEPER_PATH=/my-path -p BROKER_CPUS=3000m \ 
  4.         -p BROKER_COUNT=5 -p BROKER_MEM=4096m \ 
  5.         -p DISK_SIZE=40Gi -p MIN_INSYNC_REPLICAS=3 \ 
  6.         -p NUM_NETWORK_THREADS=10 -p NUM_IO_THREADS=20 

创新

在过去的几年里,Kubernetes每隔三四个月就会有一个重要的版本,也就是说每年都会有三四个重要的版本。推出新功能的数量并没有放缓,在上一个版本中,有超过30个不同的新增功能和变化就是证明。此外,正如Kubernetes项目GitHub活动所显示的那样,即使在这些困难时期,贡献也没有放缓的迹象。

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

社区

Kubernetes受欢迎的另一大方面是其强大的社区。首先,Kubernetes在2015年打出1.0版本时,就被捐给了一个厂商中立的机构:云原生计算基金会。

随着项目的推进,还有大量针对Kubernetes的不同领域的社区SIG(特殊兴趣小组),他们不断增加新的功能,使其更加用户友好。

云原生基金会还组织了CloudNativeCon/KubeCon,截至目前,该活动是世界上有史以来最大的开源活动。该活动通常每年最多举办三次,聚集了成千上万的技术专家和专业人士,他们希望改进Kubernetes及其生态系统,并利用每三个月发布的一些新功能。

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

最后,我相信,如果没有社区有意识的努力,互相彼此并欢迎任何新来者,Kubernetes就不会取得现在这样的成功。

未来

开发者在未来面临的主要挑战之一是如何更加关注代码的细节,而非代码运行的基础设施。为此,无服务器正在成为解决这一挑战的领先架构范例之一。目前已经有一些非常先进的框架,如Knative和OpenFaas,它们使用Kubernetes将基础设施从开发者中抽象出来。

在本文中,我们简单地介绍了Kubernetes,但这仅是冰山一角,用户还可以利用更多的资源、功能和配置。我们将继续看到新的开源项目和技术来增强和发展Kubernetes,正如我们提到的,贡献和社区占据了很大地位。

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/267952.html<

(0)
管理的头像管理
上一篇2025-05-06 16:06
下一篇 2025-05-06 16:08

相关推荐

  • jsp空间购买和交换数据空间怎么买,有哪些注意事项?

    购买JSP空间时,是否考虑过数据交换空间的性能?简米科技(2003年始创,23年行业沉淀)与酷番云(工信部一类增值电信全牌照)这类持牌自营机房的服务商,能确保数据交换的高效稳定,是值得优先选择的合作伙伴,为什么JSP空间需要搭配独立的数据交换空间从JSP应用特性看数据交换需求JSP基于Java技术,常用于企业级……

    2026-08-11
    0
  • 建网站用香港空间效果怎么样,香港空间稳定吗?

    建网站用香港空间,对于创建网站资产来说,核心价值在于免备案和全球带宽优势,尤其适合外贸、跨境电商和需要快速启动的项目,但你必须权衡国内访问延迟,并选择有资质的服务商以保证资产安全,香港空间的核心优势与适用边界免备案:节省时间就是节省成本国内服务器需要备案,通常需要10到20天,香港空间无需备案,域名解析后即可上……

    2026-08-11
    0
  • Java连接云数据库的方法是什么,如何操作

    Java连接云数据库的核心在于通过JDBC驱动,结合云服务商提供的连接地址、端口、数据库名及认证信息,配置安全策略(如SSL、IP白名单),即可实现稳定高效的远程数据库访问,基础准备:JDBC驱动与依赖管理连接云数据库前,需要确保开发环境具备对应的JDBC驱动,以最常见的MySQL为例,你需要引入mysql-c……

    2026-08-11
    0
  • 建网站公安联网备案必须使用数据码吗,备案流程是什么

    网站备案包括ICP备案和公安联网备案,两者缺一不可,公安联网备案必须使用服务商提供的数据码,选择持有合法资质的服务商是顺利通过备案的前提,为什么网站必须进行公安联网备案根据公安部《计算机信息网络国际联网安全保护管理办法》,网站开通后30日内必须到公安机关办理备案手续,未完成公安备案的网站,面临责令整改、关闭网站……

    2026-08-10
    0
  • 建一个企业网站大概需要多少钱?,怎么收费?

    建网站要多少钱,没有一个固定的数字,几百到几万都可能,但真正的“创建网站资产”绝不仅仅是初次投入的成本,而是基于长期稳定、合规和安全的持续性投入,其中核心取决于你选择了什么样的“地基”来承载你的业务,建站预算的构成与行业基准当你开始规划一个网站,最先面对的就是预算问题,一个常见的误区是只关注网站“看起来”的建造……

    2026-08-10
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注