嘿哈布尔!
在夏末,我们想提醒您,我们将继续致力于该主题
享受阅读!
在撰写本文时,Kubernetes 的历史大约为 XNUMX 年。
容器最初是一种用于隔离 Linux 进程的特殊设计; 自 2007 年以来,容器已包括在内
为了尝试了解 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 中可扩展性的另一个选择是开发人员可以编写自己的语句。
社区中有多种工具可以让开发人员轻松创建自己的运算符。 他们之中 -
$ 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
.
另一个项目
$ 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 的主要版本每隔几个月就会发布一次,即每年发布三到四个主要版本。 它们各自引入的新功能数量并没有减少。 而且,即使在这些困难时期,也没有放缓的迹象——看看现在的情况
新功能使您能够更灵活地跨不同工作负载进行集群操作。 此外,程序员在将应用程序直接部署到生产环境时享有更大的控制权。
社区
Kubernetes 受欢迎的另一个主要方面是其社区的实力。 2015 年,Kubernetes 达到 1.0 版本后,得到了以下机构的赞助:
还有各种社区
云原生基金会还主办 CloudNativeCon/KubeCon,在撰写本文时,这是世界上最大的开源会议。 它通常每年举办三次,汇聚了数千名想要改进 Kubernetes 及其生态系统的专业人士,并学习每三个月出现的新功能。
此外,云原生基金会还
最后,我相信,如果没有整个社区的自觉努力,Kubernetes 不会如此成功,人们团结在一起,但同时也欢迎新人加入。
未来
开发人员未来必须应对的主要挑战之一是能够专注于代码本身的细节,而不是其运行的基础设施。 它符合这些趋势
在本文中,我们只触及了 Kubernetes 当前状态的表面——事实上,这只是冰山一角。 Kubernetes 用户可以使用许多其他资源、功能和配置。
来源: habr.com