图片来自Pixabay上的 200 度

在 Kubernetes 上开发

简介

本文旨在作为创建 Kubernetes 清单文件的指南。

YAML代表 YAML 不是用于创建 Kubernetes 清单的标记语言。根据定义:

YAML 是一种人类友好的数据序列化语言,适用于所有编程语言。

确实,阅读 YAML 相当简单,一旦您意识到缩进是构建数据结构的方式。如果您熟悉 Python、F# 或其他可识别缩进的语言,这尤其容易。

另一方面,编写 YAML 就没那么有趣了。如果您熟悉无模式 REST API 开发,请以与 API 的 JSON 有效负载相同的方式考虑 Kubernetes YAML。没有要验证的架构,所有的旋钮都作为有效负载中的数据公开。

创建一个简单的 YAML 文件相对简单,但对于生产使用,需要更多设置。这是 Kubernetes部署清单的示例。如果您对 Kubernetes 有一点了解,那么大多数设置在您阅读文件时都会有意义。现在想象一下,您需要从头开始创建一些(入口、服务、配置映射、秘密......)

来源:作者 —Blazor PWA 回购

作为开发人员,您将需要创建几种不同类型的清单。这里是 Kubernetes 资源列表,* 表示通常由开发人员创建/维护的资源。请注意,这仅适用于您有专门的 Kubernetes 管理员来负责其余工作的情况。该列表仅缩写为公共资源,在生产中,场景可能包括各种 CRD(自定义资源定义)。

资料来源:作者 — Kubernetes 资源

如果你不困惑,你就没有注意。

汤姆·彼得斯

你会学到什么

让我们试着缓解一些关于编写 YAML 文件的困惑,让这个过程更容易、更痛苦。

阅读本文后,您将了解到:

  • 创建 Kubernetes YAML 文件的不同方法

  • 如何在开发过程中自动检测并纠正错误

  • 使用什么开发工具可以更轻松地创建 YAML 文件

  • 了解专门用于生成不同类型 YAML 文件的在线工具

先决条件

如果您想继续使用 YAML,您将需要:

  • VS Code with远程开发扩展

  • docker desktop或任何替代品(需要能够运行容器)

  • 克隆这个仓库

请注意,存储库使用devcontainer以及运行示例构建所需的所有工具和配置。因此,图像很大,因此请在运行容器之前对其进行相应修改。

创建与生成

最初,您可能想生成尽可能多的样板文件。我的建议是,不要!特别是如果您是 Kubernetes 或 YAML 的新手,请从Kubernetes 文档进行实验,复制粘贴,但不要在第一天使用生成器。

熟悉基础知识后,逐步添加工具,让您的生活更轻松。有好消息;您将很快了解基础知识。

了解您是否对特定资源的 YAML 内容足够熟悉的好方法,如果它正在变得......好......无聊。从现在开始,您应该一头扎进发电机和助手的世界,以保持理智并让您的生活更轻松。

#1 YQ

我要讲的第一个工具是yq。 Yq 不是 Kubernetes 特定的,而是 YAML 的“万事通”。学习此工具将帮助您直接从命令行查询和操作 YAML 文件。它有助于完成任务,例如:

  • 过滤 YAML 文件以获取特定值,例如从部署文件中检索图像名称

从 YAML 文件中选择值很有用,但掌握 yq 将主要有助于对多个文件进行批量操作和更复杂的转换。

#3 Kubectl

使用kubectl为大多数资源生成 YAML 文件很容易上手。您可以在“kubectl create”或“kubectl run”命令上使用“--dry-runu003dclient -oyaml > yaml_file.yaml”标志来生成大部分资源。

例如,要为 nginx pod 生成 YAML 文件,您可以运行:

kubectl 运行 nginx --imageu003dnginx --portu003d8080 --envu003denvu003dDEV --labelsu003dappu003dnginx,owneru003duser --privilegedu003dfalse --dry-runu003dclient -oyaml > nginx-pod.yaml

此命令将生成以下 YAML:

! zoz100076](https://devpress-image.s3.cn-north-1.jdcloud-oss.com/a/516ef2d508_1*EpfZuoar_dvKTmY4tdTVuQ.jpg)

使用 kubectl 生成的 YAML

该文件需要稍微清理一下,但这是一个很好的起点。

现在您可以使用以下命令创建部署:

kubectl 创建部署 my-dep --imageu003dnginx --dry-runu003dclient -oyaml > deployment.yaml

并使用 yq 合并两个文件。

这个过程很快就会变得复杂,但使用 shell 脚本来自动化大部分任务很容易。

使用 kubectl 和 yq 的组合非常适合启动一个简单的一次性项目,并有助于在两者之间实现自动化。

如果您对 kubectl 提示和技巧感兴趣,我在这个 gist中有越来越多的有用命令。

#3 Docker-compose

你的项目中有 docker-compose.yaml 文件吗?可以使用名为kompose的工具从 docker-compose 文件生成 Kubernetes 清单。

让我们看看这个在行动。我们将使用来自awesome-compose 存储库的 docker-compose 文件。

这是一个示例 docker-compose 文件:

来源:Awesome-Compose 回购

现在,让我们使用 kompose: 生成 Kubernetes 清单

kompose 生成 K8s 清单

此命令将 docker-compose 作为输入,并将生成的 Kubernetes YAML 输出到 k8s-manifests 文件夹中。

kompose 生成的文件

如果您已经有 docker-compose 文件,则使用 kompose 是一个不错的选择。经常需要进行一些调整,但它会让你更接近一个体面的起点。

#4 带插件的 VS Code

VS Code 有 2 个插件可以帮助创建 YAML 文件。非常感谢Avi Nehama的建议。

Kubernetes 模板

该模板支持快速搭建任何 Kubernetes 资源。

创建 yaml 文件,开始输入 Kubernetes 资源的名称并点击 TAB 插入模板。继续使用 TAB 循环以填写必填字段中的名称。

YAML

Red Hat 的这个扩展在后台运行 YAML 服务器,并向任何 Kubernetes 资源添加上下文感知智能完成。

请记住在设置中激活它并重新加载 VS Code。将此行添加到设置中以对所有 YAML 文件启用 Kubernetes 完成。

“yaml.schemas”:{

“Kubernetes”:“*.yaml”

}

! swz 100106 swz 100107 swz 100105

#5 CDK8s

从命令行转向编程领域。如果您必须编写大量 YAML,但碰巧了解 Python、Typescript、JavaScript、Java 或 Go,您可以利用编程语言的强大功能来简化 YAML 的编写过程。

介绍CDK8s

cdk8s 是一个开源软件开发框架,用于使用熟悉的编程语言和丰富的面向对象 API 定义 Kubernetes 应用程序和可重用抽象。 cdk8s 应用程序合成标准 Kubernetes 清单,可应用于任何 Kubernetes 集群。

CDK8s 通过公开 Kubernetes 资源对象并使用称为构造的对象来进一步抽象和自动创建 YAML 文件来工作。

这种方法背后的真正力量是能够:

  • 创建可重用的组件和抽象来满足您的需求

  • 使用原生编程语言结构来自动化、测试和验证创建 YAML 的过程

#6 NAML

如果你碰巧知道 Go 并且根本不喜欢 YAML 并且想不惜一切代价避免它,那么这个项目可能适合你!

Kris Nova(Github profile) 设计的一个非常有趣的方法是一个名为 naml 的以 Go 为中心的工具,它通过直接在 Go 中创建 Kubernetes 清单并通过 CLI install 命令将它们安装在集群上来工作。

该工具可以生成类似于 CKD8s 的 YAML,但仅适用于 Go。

[

GitHub - kris-nova/naml: 不是另一种标记语言。用...替换 Kubernetes YAML 的框架

NAML 是一个 Go 库和命令行工具,可以作为框架来开发和部署 Kubernetes...

github.com

](https://github.com/kris-nova/naml)

#7 在线工具

有时,沮丧的开发人员会创建一个简单的 Web UI,其中包含一个表单来收集用于生成 YAML 文件的输入。这些项目通常是短暂的,维护得不是很好,所以我的建议是远离在线 Kubernetes YAML 生成器。

有一个例外,cilium的在线编辑器专门创建名为网络策略的 Kubernetes 资源

来源:https://editor.cilium.io/

结束思考

我们已经看到了创建 Kubernetes YAML 文件的各种方法,其中一些使用简单的命令行工具,自动生成文件。其他人公开完整的编程语言。

这很好,但是我们如何确保我们的 YAML 是正确的呢?验证文件内容的最佳实践是什么?这些实践如何实现自动化?

如果您想知道这些和类似问题的答案,请继续关注下一篇文章。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐