2.5. [kustz] 使用 cobra 实现 kustz 命令

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: > 大家好, 我是老麦。 一个运维小学生。有了前面几章的努力, 我们的命令行工具 kustz 终于要问世了。 让一切都跑起来

2.5. [kustz] 使用 cobra 实现 kustz 命令

image.png

大家好, 我是老麦。 一个运维小学生。

有了前面几章的努力, 我们的命令行工具 kustz 终于要问世了。

代码还是在 Github, 文章中有不清楚的可以上去看看

https://github.com/tangx/kustz/tree/chapter/05-build-kustz-cli-with-cobra

image.png

kustz 命令

当前命令功能就很简单。

  1. default: 输出 kustz 默认配置
  2. render: 读取 kustz 配置并生成 kustomize 配置四件套。
$ kustz -h

Available Commands:
  default     在屏幕上打印 kustz 默认配置
  render      读取 kustz 配置, 生成 kustomize 所需文件

编码

本章的代码都很简单, 就是设计的文件比较多。

使用 cobra 创建命令

cobra 真的是一个非常好用的命令行工具。

go get -u github.com/spf13/cobra

/cmd/kustz/cmd/root.go 中创建 根命令 rootCmd
并定义 执行函数 Execute。

func Execute() error {
    return rootCmd.Execute()
}

/cmd/kustz/cmd/default.go 中创建 子命令 default, 无任何参数。
/cmd/kustz/cmd/render.go 中创建 子命令 render, 有一个参数 config, 实现根据配置管理应用。

而在外部 /cmd/kustz/main.go 中, 只有一个入口函数 main 调用 rootCmd 的执行。 保持文件清洁干爽。

花开两朵。 在 /pkg/kustz/cmd.go 文件中, 提供了 函数方法 供之前的命令调用

default

使用 go:embed 将配置文件 kustz.yml 嵌入到应用中。 配置随着代码走, 测试分发两不误。

//go:embed kustz.yml
var defaultConfig string

func DefaultConfig() {
    fmt.Println(defaultConfig)
}

这里只是简单的配置文件打印标准输出。 如果需要保存到文件, 用户可以自行使用 重定向符

render

通过 RenderAll 方法将之间的 Deployment, Ingress, Service, Kustomization 都保存成了对应文件。

func (kz *Config) RenderAll() error {
}

在 Kustomize 章节已经硬编码 Resources 的资源文件名称。 因此这里可就定义了这几个文件名的常量。

const (
    FileDeployment    = "deployment.yml"
    FileIngress       = "ingress.yml"
    FileService       = "service.yml"
    FileKustomization = "kustomization.yml"
)

/pkg/kubeutils/yaml.go 中, 将 dep, svc, ing 等编码成 YAML 的时候, 用到了 sigs.k8s.io/yaml (k8syaml) 库, 而非 gopkg.in/yaml.v2 (pkgyaml)。
跟踪一下 k8syaml 的代码就很容易知道, 前者在 pkgyaml 的基础上, 针对性的为 k8s 做了很多优化。

编译及测试

$ go build ./cmd/kustz

$ ./kustz default > abc.yml
$ ./kustz render -c abc.yml

如果不行, 检查一下代码吧。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
5天前
|
Kubernetes Go Docker
cobra - 更容易地构建命令行应用
cobra - 更容易地构建命令行应用
10 0
|
3月前
|
Shell Linux Go
酷玩Go命令行工具—Cobra
酷玩Go命令行工具—Cobra
65 0
|
3月前
|
Go
golang 使用 viper 打印yaml 的值
如果你想指定配置文件路径、读取配置文件并打印所有的键和值,可以使用以下代码: ```go package main import ( "fmt" "github.com/spf13/viper" ) func main() { // 指定配置文件路径 configFilePath := "/root/mongo.conf" viper.SetConfigFile(configFilePath) // 读取配置文件 err := viper.ReadInConfig() if err != nil { fmt.Printf("Error reading config
|
3月前
|
Go
golang使用Viper 库修改yaml的值
看起来你正在使用 Viper 库(可能是 Go 语言中的一个配置管理库),并且希望读取一个配置文件、修改其内容,然后保存为另一个文件。以下是一个简单的示例代码,演示了如何使用 Viper 完成这些任务: ```go package main import ( "fmt" "github.com/spf13/viper" ) func main() { // 设置配置文件路径 viper.SetConfigFile("/root/mongo.conf") // 读取配置文件 err := viper.ReadInConfig() if err != nil { fmt.
185 0
|
Go
Golang读取配置文件实现(yaml)
Golang读取配置文件实现(yaml)
361 0
Golang读取配置文件实现(yaml)
4.1. [kustz] 使用 cobrautils 为命令添加更实用的命令参数
使用 cobrautils 库丰富命令行参数, 实现命令行工具的便捷性
4.1. [kustz] 使用 cobrautils 为命令添加更实用的命令参数
|
Kubernetes API 数据安全/隐私保护
|
Kubernetes 网络协议 容器
3.5 [kustz] 为 Container 添加健康检查方法
添加 健康检查探针。 完成上线准备。
3.5 [kustz] 为 Container 添加健康检查方法
|
运维 安全 API
3.1. [kustz] 为 Container 添加环境变量
3.1. [kustz] 为 Container 添加环境变量 > 大家好, 我是老麦。 一个运维小学生。 > 今天为容器添加环境变量。
151 0
3.1. [kustz] 为 Container 添加环境变量
|
运维 Shell 容器
3.2. [kustz] ConfigMap 和 Secret 的生成器
3.2. [kustz] ConfigMap 和 Secret 的生成器
191 0
3.2. [kustz] ConfigMap 和 Secret 的生成器