近日见闻
- Ant Design 5.12.2 在近日发布,感兴趣的可以去看看更新了那些内容,我这边还只是简单的用了其vue社区版本
- Atlassian Confluence Data Center/Server 模板注入漏洞
漏洞 | Atlassian Confluence Data Center/Server 模板注入漏洞 |
---|---|
漏洞类型 | 代码注入 |
发现时间 | 2023-12-06 |
影响广度 | 一般 |
CVE 编号 | CVE-2023-22522 |
- 最近在研究服务网格,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 命令为例,:
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)
}
对于 delete
、update
和 get
命令,需要在各自的命令文件中实现类似的逻辑,与 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/