在撰写本文时,Kubernetes已有6年历史了,在过去的两年中,它的流行度不断提高,并逐渐成为最受欢迎的平台之一。今年,它成为了最受欢迎的第三大平台(仅次于linux和docker)。如果您还没有听说过Kubernetes,那么我告诉你:它是一个平台,可以让您运行和编排容器工作负载。

容器最初是一个用于Linux内核进程隔离的构建结构,它整合了2007年的cgroup和2002年的命名空间(namespace)。当LXC在2008年可用时,容器变得越来越重要。而Google开发了自己内部使用的“在容器中运行所有”的机制,称为Borg。快进到2013年,Docker正式发布,并完全面向大众普及。当时,Mesos是编排容器的主要工具,但是,它并没有被广泛采用。Kubernetes于2015年发布,并迅速成为事实上的容器编排标准。

为了理解Kubernetes的流行,让我们考虑一些问题。开发人员上一次是在何时就应用部署在生产环境的方式达成共识?您知道有多少开发人员开箱即用地运行工具?如今又有多少云运维工程师不了解应用程序如何工作?我们将在本文中探讨答案。

基础设施即YAML

和来自Puppet和Chef世界的理念不同,Kubernetes的重大转变之一就是从基础设施即代码过渡到基础设施即数据(以YAML形式存在的数据)。Kubernetes中的所有资源,包括Pod,配置,部署,卷等,都可以简单地在YAML文件中表示。例如:

apiVersion: v1kind: Podmetadata:  name: site  labels:    app: webspec:  containers:    - name: front-end      image: nginx      ports:        - containerPort: 80

这种表示形式使DevOps或SRE工程师可以更轻松地表达其工作负载,而无需使用Python,Ruby或Javascript等编程语言编写代码。

基础设施即数据理念的其他好处包括:

•GitOps或Git运维版本控制。使用这种方法,您可以将所有Kubernetes YAML文件保存在git存储库下,这使您可以准确地知道何时进行了更改,由谁进行了更改以及究竟进行了哪些更改。这样提升了跨组织的透明性,避免了成员寻找所需内容时的模棱两可,,提高了效率。同时,通过合并请求,可以更轻松地自动更改Kubernetes资源。•可扩展性。将资源定义为YAML,使集群管理员可以非常轻松地通过更改Kubernetes资源中的一个或两个数字来更改应用缩放行为。Kubernetes具有水平Pod自动缩放器,可帮助您确定特定部署在处理低流量和高流量时所需Pod的最小和最大数量。例如,如果您正在运行的部署由于流量突然增加而可能需要更多容量,则可以将maxReplicas从10更改为20:

apiVersion: autoscaling/v2beta2kind: HorizontalPodAutoscalermetadata:  name: myapp  namespace: defaultspec:  scaleTargetRef:    apiVersion: apps/v1    kind: Deployment    name: myapp-deployment  minReplicas: 1  maxReplicas: 20  metrics:  - type: Resource    resource:      name: cpu      target:        type: Utilization        averageUtilization: 50

•安全和控制。YAML是验证在Kubernetes中部署什么以及如何部署的好方法。例如,有关安全性的主要问题之一是您的工作负载是否以非root用户身份运行。我们可以使用conftest(一种YAML / JSON验证器)以及Open Policy Agent(一种策略验证器)之类的工具来检查你的工作负载的SecurityContext是否不允许容器作为根运行。为此,用户可以使用一个简单的开放策略代理[rego]策略,像下面这样:

package maindeny[msg] {  input.kind = "Deployment"  not input.spec.template.spec.securityContext.runAsNonRoot = true  msg = "Containers must not run as root"}

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

可扩展性

Kubernetes具有很好的可扩展性,开发人员对此非常满意。K8s内置一组资源,例如Pod,Deployment、StatefulSets、Secrets、ConfigMaps等。但是,用户和开发人员也可以以“Custom Resource Definition”的形式添加更多自定义资源。例如,如果我们想定义一个CronTab资源,我们可以用以下方法做到这一点:

apiVersion: apiextensions.k8s.io/v1kind: CustomResourceDefinitionmetadata:  name: crontabs.my.orgspec:  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: CronTabmetadata:  name: my-cron-objectspec:  cronSpec: "* * * * */5"  image: my-cron-image  replicas: 5

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

社区有几种工具帮助开发人员创建自己的operator,其中就包括Operator Framework及其Operator SDK。SDK为开发人员提供了一个框架,使他们可以快速开始创建Operator。例如,您可以使用以下命令行命令开始:

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

它将为您的operator创建一个模板,包括YAML文件和Go代码:

.|____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推送到您的container registry:

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

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

另一个项目KUDO允许您仅使用声明性YAML文件来创建operator。例如,我们可以像这样定义一个Apache kafka的operator,然后通过下面命令让用户在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项目的Github活动表明,即使在目前困难时期,对k8s的贡献也没有显示出放缓的迹象。

这些新功能使集群运营商在运行各种不同的工作负载时具有更大的灵活性。软件工程师还喜欢拥有更多控件,以将其应用程序直接部署到生产环境中。

社区

Kubernetes受欢迎的另一个重要方面是其强大的社区。首先,Kubernetes在2015年达到1.0版本时就捐赠给了与供应商无关的基金会:Cloud Native Computing Foundation。

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

Cloud Native Foundation还组织了CloudNativeCon/KubeCon,截至撰写本文时,CloudNativeCon/KubeCon是世界上最大的开源活动。该活动通常每年举行三届,吸引了数千名希望改善Kubernetes及其生态系统以及利用每三个月发布的新功能的技术人员和专业人士。

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

最后,我相信,如果没有社区的有意识的努力来互相包容并欢迎任何新来者,Kubernetes不会取得成功。

未来

开发人员未来面临的主要挑战之一是如何将更多的精力放在代码的细节上,而不是代码运行所在的基础设施上。为此,无服务器(serverless)正在成为应对这一挑战的领先架构范例之一。已经有非常高级的框架,例如Knative和OpenFaas,它们从Kubernetes做进一步抽象,让开发人员原理基础设施。

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

本文翻译自《Why is Kubernetes getting so popular? - https://stackoverflow.blog/2020/05/29/why-kubernetes-getting-so-popular/ 。

往期推荐

Go语言联合作者Rob Pike专访:Go确实已成为云基础架构的语言

图解Go运行时调度器

可视化Go内存管理

Go语言之禅

Go语言包管理简史

kafka集群 kubernetes_为什么Kubernetes如此受欢迎?相关推荐

  1. kafka集群 kubernetes_为什么 Kubernetes 如此受欢迎?

    点击上方蓝色"火丁笔记"关注我们,设个星标,每天学习全栈知识 在撰写本文时,Kubernetes 已有 6 年历史[1]了,在过去的两年中,它的流行度不断提高,一直是最受欢迎的平台 ...

  2. 【K8S】 基于Kubernetes部署Kafka集群

    主要参考了https://stackoverflow.com/questions/44651219/kafka-deployment-on-minikube和https://github.com/ra ...

  3. Kubernetes搭建Zookeeper和Kafka集群

    2019独角兽企业重金招聘Python工程师标准>>> 主要参考了https://www.cnblogs.com/00986014w/p/9561901.html 这篇博文,但他zo ...

  4. kafka集群管理工具kafka-manager

    一.kafka-manager简介 kafka-manager是目前最受欢迎的kafka集群管理工具,最早由雅虎开源,用户可以在Web界面执行一些简单的集群管理操作.具体支持以下内容: 管理多个集群 ...

  5. Kafka Without ZooKeeper ---- 不使用zookeeper的kafka集群

    不使用zookeeper的kafka集群 前言 ZooKeeper的缺点 Kakfa Without ZooKeeper简介 Kakfa Without ZooKeeper的优势 总结 参考链接 前言 ...

  6. 记一次Kafka集群的故障恢复

    女主宣言 本文是作者根据实际经验总结出的关于Kafka集群的故障恢复相关的总结,希望对大家有所帮助. PS:丰富的一线技术.多元化的表现形式,尽在"HULK一线技术杂谈",点关注哦 ...

  7. 备份k8s_树莓派k8s集群安装kafka集群及监控

    安装准备 树莓派k8s集群 root@pi4-master01:~# kubectl get nodes -o wideNAME STATUS ROLES AGE VERSION INTERNAL-I ...

  8. 避坑指南:Kafka集群快速扩容的方案总结

    什么是数据迁移 Apache Kafka 对于数据迁移的官方说法是分区重分配.即重新分配分区在集群的分布情况.官方提供了kafka-reassign-partitions.sh脚本来执行分区重分配操作 ...

  9. 如何为一个kafka集群选择topics/partitions的数量

    2019独角兽企业重金招聘Python工程师标准>>> How to choose the number oftopics/partitions in a Kafka cluster ...

最新文章

  1. Cpp6 封装、继承和多态
  2. oracle11关闭账户验证,Windows下Oracle11g中使用外部操作系统账户验证
  3. 中文分词之正向最大匹配算法
  4. 苹果是c语言安卓是什么语言,主流app是用什么语言开发的苹果和安卓的主流开...
  5. Jackson学习笔记
  6. Unicode与UTF-8的区别
  7. unity 启动相机_Unity3D研究院之打开照相机与本地相册进行裁剪显示(三十三)...
  8. nullnull使用PL/SQL获取创建用户的语句
  9. 回溯算法和贪心算法_回溯算法介绍
  10. .NET进行客户端Web开发又一利器 - Ant Design Blazor
  11. 手机下载Python_将安卓手机打造成 Python 全栈开发利器
  12. 关于Mathematica 的cdf 文件的嵌入应用
  13. marquee命令的基本用法
  14. Github上传代码到main分支
  15. Vue router 默认加载 views 文件夹下全部vue文件
  16. 如何辨别3C标志的真伪!
  17. linux对指定ip限速,使用tc对linux中某ip段限速
  18. Go 语言高质量编程
  19. 2021完整版:Kubernetes Deployment故障排除的可视化指南
  20. 微型计算机aspire1600x,终结性能过剩时代 评Acer 1600X小型机

热门文章

  1. ajax提交时“加载中”提示的处理方法
  2. 记录Yii2代码调试中出现的两个问题(截图展示)
  3. 【转载】shell实例手册
  4. perl lwp 超时问题
  5. Opengl编程指南第二章:状态管理、几何绘图
  6. 推荐一个很棒的JS绘图库Flot
  7. (转)C 语言高效编程的几招
  8. MFC初探 —— 设置软件开机自启
  9. VS2010 书签 工具的使用方法
  10. 大数据_Flink_数据处理_命令行提交Job---Flink工作笔记0014