在夏季末,我们想提醒您,我们将继续致力于Kubernetes主题,并决定在6月初发布有关Stackoverflow的文章,以证明该项目的状况。
享受阅读!
在撰写本文时,Kubernetes已有6年历史了,并且在过去两年中非常流行,以至于它一直是最受欢迎的平台之一。 Kubernetes今年排名第三。概括地说,Kubernetes是一个用于运行和编排容器化工作负载的平台。
容器起源于Linux中用于进程隔离的特殊构造。自2007年以来,容器一直是cgroup,自2002年以来一直是命名空间。到2008年LXC可用时,这些容器的形状甚至更好了,Google开发了自己的内部机制Borg。其中“所有工作都在容器中完成”。从这里开始,快速发展到2013年,当时Docker的第一个发行版发布,容器最终移到了流行的大众解决方案类别。当时,Mesos是编排容器的主要工具,尽管它不是很流行。 Kubernetes的第一版发布于2015年,此后成为容器编排领域的事实上的标准。
为了尝试理解Kubernetes为什么如此受欢迎,让我们尝试回答一些问题。开发人员上一次何时能够就如何将应用程序部署到生产环境达成一致?您知道有多少开发人员使用现成的工具?今天有多少云管理员不了解应用程序的工作方式?我们将在本文中考虑这些问题的答案。
作为YAML的基础架构
在从Puppet和Chef到Kubernetes的世界中,最大的变化之一就是从以代码为基础的基础架构过渡到以数据为基础的基础架构的转变-特别是像YAML。可以在YAML文件中轻松描述Kubernetes中的所有资源,包括容器,配置,部署的实例,卷等。例如:
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 Operations Version. YAML- Kubernetes git, , , , . , , , , . , Kubernetes – pull-.
- . YAML, Kubernetes, . Kubernetes , , , , . , , - , 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. , , , , - , . conftest, YAML/JSON, Open Policy Agent, , , SecurityContext . , rego, :
package main
deny[msg] {
input.kind = "Deployment"
not input.spec.template.spec.securityContext.runAsNonRoot = true
msg = "Containers must not run as root"
}
- . – . cloud-provider Kubernetes , . , Kubernetes AWS ,
LoadBalancer
, Amazon Elastic Load Balancer, .
Kubernetes是非常可扩展的,开发人员喜欢它。有可用资源的集合,例如吊舱,扫掠,
StatefulSets
秘密ConfigMaps
等。但是,用户和开发人员可以以自定义资源定义的形式添加其他资源。
例如,如果我们想定义一个资源
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(自定义资源定义)的管理。
社区中有几种工具可以使开发人员轻松创建自己的运算符。其中包括Operator Framework及其Operator 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。例如,要修改控制器的详细信息,可以对file进行更改
controller.go
。
另一个项目KUDO允许您仅使用声明性YAML文件创建语句。例如,为Apache卡夫卡操作者将被定义这样。有了它,您只需几个命令就可以在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版后,由Cloud Native Computing Foundation赞助。随着项目的发展,
还有各种各样的SIG(特殊兴趣小组)社区正在探索Kubernetes的不同领域。这些团队不断增加新功能,以使与Kubernetes的合作更加便捷。
Cloud Native Foundation还将托管CloudNativeCon / KubeCon,这是撰写本文时世界上最大的开源会议。通常,它每年举行三届,聚集成千上万希望改善Kubernetes及其生态系统的专家,并掌握每三个月出现的新功能。
此外,Cloud Native Foundation拥有一个技术监督委员会,该委员会与SIG一起审查了该基金会针对云生态系统的新项目和现有项目。这些项目大多数都有助于提高Kubernetes的优势。
最后,我相信,如果没有整个社区的共同努力,人们之间相互依存,Kubernetes不会取得如此成功,但与此同时,我们很乐意接受新来者加入他们的行列。
未来
开发人员将来必须应对的主要挑战之一是能否专注于代码本身的细节,而不是代码运行所在的基础结构。正是这些趋势回应了当今最重要的服务器无服务器架构范例。已经有诸如Knative和OpenFaas之类的高级框架,它们使用Kubernetes从开发人员那里提取基础架构。
在本文中,我们仅粗略了解了Kubernetes的当前状态-实际上,这只是冰山一角。Kubernetes用户可以使用许多其他资源,功能和配置。