使用Cobra框架完成pod增删改查

2023-12-13 15:07:23 浏览数 (1)

近日见闻

  1. Ant Design 5.12.2 在近日发布,感兴趣的可以去看看更新了那些内容,我这边还只是简单的用了其vue社区版本
  2. Atlassian Confluence Data Center/Server 模板注入漏洞

漏洞

Atlassian Confluence Data Center/Server 模板注入漏洞

漏洞类型

代码注入

发现时间

2023-12-06

影响广度

一般

CVE 编号

CVE-2023-22522

  1. 最近在研究服务网格,lstio、ingress、apisix的东西不少,感兴趣的同学可以一起交流下!

关于cobra框架

Cobra 是一个用 Go 语言编写的命令行界面 (CLI) 应用程序开发框架。它被广泛用于创建具有复杂命令结构的应用程序,例如支持嵌套命令、全局和局部标志、以及自动生成帮助和文档的应用程序。由Go团队成员spf13为hugo创建的,并被很多流行的Go项目广泛采用。比如k8s、helm、docker等等。具体清单可以查看https://github.com/spf13/cobra/blob/main/site/content/projects_using_cobra.md

Cobra 同时也是一个应用程序,可以用来生成应用程序框架、命令和相关的文件。该项目由 Steve Francia 创建,并且有很多贡献者参与。Cobra 框架和应用程序被许多著名的 Go 语言项目使用,包括 Kubernetes、Hugo 以及 Docker 的一些组件。[1]

官网:https://cobra.dev/

Cobra 的主要特点包括:

  • 简单的命令结构:Cobra提供了一个简单的结构来创建命令、子命令以及它们之间的关系。
  • 全局、局部和持久标志:你可以为命令定义全局标志(对所有命令有效)或局部标志(仅对特定命令有效),以及持久标志(对命令和它的所有子命令有效)。
  • 自动生成文档:Cobra可以自动产生和更新命令文档,这样开发者就不需要手动维护帮助文件。
  • 参数解析:Cobra提供参数解析支持,帮助开发者处理命令行输入。
  • 自定义用法:通过自定义模板,你可以对帮助命令和用法提示进行个性化设置。

前两天我分享了用python监控pod状态的实现方法,有朋友在问,使用cobra框架和直接调用k8s-api有什么区别,如果你只是想单次或者简单地实现pod状态监控的功能,而不考虑将其作为一个命令行工具对外提供,那么可能直接使用 Go 调用 Kubernetes API 就足够了。如果你计划构建一个更复杂的 CLI 应用程序,该程序可能会随着时间的推移发展和扩展,并且需要良好的用户交互和文档支持,使用 Cobra 框架将会大大简化这个过程,并提供更专业的用户体验。

使用cobra完成k8s中的增删改查

使用Cobra完成 K8s中Pod的操作,你首先需要安装Cobra并初始化一个新项目,然后编写逻辑来与 Kubernetes API 交互。

步骤 1: 安装 Cobra

安装 Cobra CLI

代码语言:javascript复制
go get -u github.com/spf13/cobra/cobra
步骤 2: 初始化一个新的 Cobra 应用
代码语言:javascript复制
cobra init podcli --pkg-name github.com/yourusername/podcli
cd podcli
步骤 3: 添加 Pod 命令

为增删改查的每个操作创建一个子命令

代码语言:javascript复制
cobra add create
cobra add delete
cobra add update
cobra add get
步骤 4: 实现与 Kubernetes API 交互逻辑

前提是你已经安装了client-go客户端库

代码语言:javascript复制
go get k8s.io/client-go@latest

然后,在每个子命令文件中,比如 create.go,需要实现创建 Pod 的逻辑。以创建 Pod 命令为例,:

代码语言:javascript复制
package cmd

import (
 "context"
 "fmt"
 "log"

 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 "k8s.io/client-go/kubernetes"
 "k8s.io/client-go/rest"

 "github.com/spf13/cobra"
)

// createCmd represents the create command
var createCmd = &cobra.Command{
 Use:   "create [name]",
 Short: "Create a new pod",
 Long:  `Create a new Kubernetes pod with the specified name.`,
 Run: func(cmd *cobra.Command, args []string) {
  if len(args) != 1 {
   log.Fatal("You must specify a name for the pod.")
  }
  name := args[0]
  createPod(name)
 },
}

func createPod(name string) {
 config, err := rest.InClusterConfig()
 if err != nil {
  log.Fatalf("Failed to get Kubernetes config: %v", err)
 }
 clientset, err := kubernetes.NewForConfig(config)
 if err != nil {
  log.Fatalf("Failed to create Kubernetes clientset: %v", err)
 }

 pod := /* ...构建你的 Pod 对象... */

 result, err := clientset.CoreV1().Pods("default").Create(context.TODO(), pod, metav1.CreateOptions{})
 if err != nil {
  log.Fatalf("Failed to create pod: %v", err)
 }
 fmt.Printf("Created pod %q.n", result.GetObjectMeta().GetName())
}

func init() {
 rootCmd.AddCommand(createCmd)
}

对于 deleteupdateget 命令,需要在各自的命令文件中实现类似的逻辑,与 Kubernetes API 进行交互,执行相应的操作。

步骤 5: 构建和运行你的命令行应用

构建应用程序:

代码语言:javascript复制
go build -o podcli .

运行你的命令:

代码语言:javascript复制
./podcli create my-pod
./podcli get my-pod
./podcli update my-pod --image=nginx:latest
./podcli delete my-pod

这只是一个简单的例子,在实际应用中,需要处理身份验证、配置细节、错误检查、以及与 Kubernetes 交互时的各种问题。

还有为了与 Kubernetes API 交互,需要有适当的权限和认证信息,这些信息可以在集群内部通过 ServiceAccount 获取,或者在集群外部通过 kubeconfig 文件获取。

参考资料

[1]

cobra框架被kubernetes采用: https://cobra.dev/

0 人点赞