关于 Kubernetes 的日益普及

嘿哈布尔!

在夏末,我们想提醒您,我们将继续致力于该主题 Kubernetes 并决定在 XNUMX 月初从 Stackoverflow 发布一篇文章来展示该项目的状况。

关于 Kubernetes 的日益普及

享受阅读!

在撰写本文时,Kubernetes 的历史大约为 XNUMX 年。 六岁,在过去的两年里,它的受欢迎程度不断提高,一直名列前茅。 最喜欢的 平台。 Kubernetes 今年排名第三。 回顾一下:Kubernetes 是一个专为运行和编排容器化工作负载而设计的平台。

容器最初是一种用于隔离 Linux 进程的特殊设计; 自 2007 年以来,容器已包括在内 小组,以及自 2002 年以来的命名空间。 到 2008 年,容器的设计变得更好了 LXC,谷歌开发了自己的内部企业机制,称为 博格,其中“所有工作都在容器中完成”。 从这里我们快进到 2013 年,当时 Docker 首次发布,容器最终成为流行的大众解决方案。 当时容器编排的主要工具是 梅索斯,尽管他并没有广受欢迎。 Kubernetes于2015年首次发布,此后该工具成为容器编排领域事实上的标准。

为了尝试了解 Kubernetes 为何如此受欢迎,让我们尝试回答几个问题。 开发人员最后一次就如何将应用程序部署到生产环境达成一致是什么时候? 您知道有多少开发人员使用开箱即用的工具? 如今有多少云管理员不了解应用程序的工作原理? 我们将在本文中看看这些问题的答案。

YAML 形式的基础设施

在从 Puppet 和 Chef 到 Kubernetes 的世界中,最大的变化之一是从“基础设施即代码”到“基础设施即数据”的转变——特别是 YAML。 Kubernetes 中的所有资源,包括 Pod、配置、部署的实例、卷等,都可以在 YAML 文件中轻松描述。 例如:

apiVersion: v1
kind: Pod
metadata:
  name: site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80

这种视图使 DevOps 或 SRE 专业人员可以更轻松地充分表达他们的工作负载,而无需使用 Python 或 Javascript 等语言编写代码。

将基础设施组织为数据的其他优势包括:

  • GitOps 或 Git 操作版本控制。 这种方法允许您将所有 Kubernetes YAML 文件保存在 git 存储库中,以便您可以准确跟踪更改的时间、更改者以及更改的具体内容。 这提高了整个组织运营的透明度,并通过消除歧义提高运营效率,特别是在员工应该寻找所需资源的地方。 同时,通过简单地合并拉取请求,自动更改 Kubernetes 资源变得更加容易。
  • 可扩展性。 当资源被定义为 YAML 时,集群操作员可以非常轻松地更改 Kubernetes 资源中的一两个数字,从而改变其扩展方式。 Kubernetes 提供了一种 pod 水平自动缩放机制,可用于方便地确定特定部署配置中处理低流量和高流量所需的最小和最大 pod 数量。 例如,如果您部署的配置由于流量突然激增而需要额外容量,则 maxReplicas 可以从 10 更改为 20:

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  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

  • 安全和管理。 YAML 非常适合评估 Kubernetes 中的部署方式。 例如,一个主要的安全问题涉及您的工作负载是否以非管理员用户身份运行。 在这种情况下,我们可能需要诸如 会议测试,YAML/JSON 验证器,加上 开放策略代理,一个策略验证器,以确保上下文 安全上下文 您的工作负载不允许容器以管理员权限运行。 如果需要,用户可以应用一个简单的策略 雷哥,像这样:

package main

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

  • 与云提供商集成的选项。 当今高科技最显着的趋势之一是在公共云提供商上运行工作负载。 使用组件 云提供商 Kubernetes 允许任何集群与其运行的云提供商集成。 例如,如果用户在 AWS 上的 Kubernetes 中运行应用程序并希望通过服务公开该应用程序,云提供商会帮助自动创建该服务 LoadBalancer这将自动提供负载均衡器 亚马逊弹性负载均衡器将流量重定向到应用程序 Pod。

可扩展性

Kubernetes 的可扩展性非常好,开发人员喜欢它。 有一组可用资源,例如 Pod、部署、 StatefulSets, 秘密, ConfigMaps, ETC。 确实,用户和开发人员可以在表单中添加其他资源 自定义资源定义.

例如,如果我们要定义一个资源 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(自定义资源定义)的管理。

社区中有多种工具可以让开发人员轻松创建自己的运算符。 他们之中 - 算子框架运营商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

如果开发人员想要更多控制,可以更改 Go 文件中的样板代码。 例如,要修改控制器的细节,您可以更改文件 controller.go.

另一个项目 工藤,允许您仅使用声明性 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 的主要版本每隔几个月就会发布一次,即每年发布三到四个主要版本。 它们各自引入的新功能数量并没有减少。 而且,即使在这些困难时期,也没有放缓的迹象——看看现在的情况 Github 上的 Kubernetes 项目活动.

新功能使您能够更灵活地跨不同工作负载进行集群操作。 此外,程序员在将应用程序直接部署到生产环境时享有更大的控制权。

社区

Kubernetes 受欢迎的另一个主要方面是其社区的实力。 2015 年,Kubernetes 达到 1.0 版本后,得到了以下机构的赞助: 云原生计算基金会.

还有各种社区 SIG的 随着项目的发展,(特别兴趣小组)专注于 Kubernetes 的不同领域。 这些团体不断添加新功能,使使用 Kubernetes 变得更加方便和方便。

云原生基金会还主办 CloudNativeCon/KubeCon,在撰写本文时,这是世界上最大的开源会议。 它通常每年举办三次,汇聚了数千名想要改进 Kubernetes 及其生态系统的专业人士,并学习每三个月出现的新功能。

此外,云原生基金会还 技术监督委员会,与 SIG 一起审查新的和现有的 项目 资金专注于云生态系统。 这些项目大多数都有助于提高 Kubernetes 的优势。

最后,我相信,如果没有整个社区的自觉努力,Kubernetes 不会如此成功,人们团结在一起,但同时也欢迎新人加入。

未来

开发人员未来必须应对的主要挑战之一是能够专注于代码本身的细节,而不是其运行的基础设施。 它符合这些趋势 无服务器架构范式,这是当今领先的之一。 先进的框架已经存在,例如 Knative и OpenFaas,它使用 Kubernetes 从开发人员那里抽象出基础设施。

在本文中,我们只触及了 Kubernetes 当前状态的表面——事实上,这只是冰山一角。 Kubernetes 用户可以使用许多其他资源、功能和配置。

来源: habr.com

添加评论