首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

探索Kubernetes Client-Go:实现K8s资源操作

近日见闻

1、尤雨溪宣布正式发布 VitePress 1.0 版本,并声称其 “基于 Vite 和 Vue 构建,是 VuePress 的精神继承者和现代替代品。” --vue社区

2、Podman 5.0 已正式发布。新版本针对 Windows 和 Mac 平台完全重写了代码,并对这两个平台上的虚拟机管理程序支持进行了重大改进。 --podman

3、Canonical 宣布全面推出 Legacy Support —— 一个 Ubuntu Pro 插件,可将 Ubuntu LTS 版本的安全性和支持范围扩大到 12 年。适用于 Ubuntu 14.04 LTS 及以上版本。 --Ubuntu

摘抄:

这个世界并不在乎你的自尊,

只在乎你做出来的成绩,

然后再去强调你的感受。

——比尔.盖茨

client-go

访问kubernetes集群有几种方式,通过web-UI、kubectl、client-go/java/python。之前我们的操作一般通过ui界面或者kubectl终端命令行完成,如果想做一些定制化的内容或者自定义的资源操作,就需要用到这个client-go客户端了。可以直接调用api服务器接口,但是使用过程中,需要注意api的版本。以下将仓库的内容进行简单的总结概述,分享给大家。

官网: 暂无

仓库:https://github.com/kubernetes/client-go

目前这个项目已有将近580名贡献者,简单介绍下项目仓库的内容:

kubernetes软件包包含用于访问 Kubernetes API 的客户端集。

discovery包用于发现 Kubernetes API 服务器支持的 API。

dynamic包包含一个动态客户端,可以对任意 Kubernetes API 对象执行通用操作。

plugin/pkg/client/auth软件包包含可选的身份验证插件,用于从外部源获取凭据。

transport包用于设置身份验证并启动连接。

tools/cache包对于编写控制器很有用。

版本兼容性

一般是k8s-v1.28.0对应client-go-v0.28.0如图所示:

关键点说明

在 client-go 和 Kubernetes 版本中具有完全相同的功能/API对象。

client-go 拥有可能在 Kubernetes 集群中不存在的功能或 API 对象,这可能是因为 client-go 有额外的新 API,或者服务器删除了旧 API。然而,他们共同拥有的大部分 API 都将工作。请注意,alpha API 可能会在单个版本中消失或发生重大变化。

Kubernetes 集群具有 client-go 库无法使用的功能,这可能是因为服务器有额外的新 API,或者 client-go 删除了旧 API。然而,他们共同拥有的大部分 API 都将工作。 有关 client-go 版本之间变化的详细描述,请查看更新日志。

维护分支

release-1.25Kubernetes 主仓库, 1.25 分支

release-1.26Kubernetes 主仓库, 1.26 分支

release-1.27Kubernetes 主仓库, 1.27 分支

release-1.28Kubernetes 主仓库, 1.28 分支

client-go HEADKubernetes 主仓库, master 分支

注意:至少维护分支直到它们的第一个稳定标签被打出后的六个月。

要获取最新版本,请使用 go1.16+ 并使用 go get 命令获取。例如:

go get k8s.io/client-go@latest

要获取特定版本,请使用 go1.11+ 并使用 go get 命令获取所需版本。例如:

最新示例

地址:https://github.com/kubernetes/client-go/tree/master/examples目录包含了涵盖各种用例和client-go功能的示例。

上个月更新的示例:

这个示例演示了如何在测试中使用带有SharedInformerFactory的假客户端。

它包括:

创建假客户端

设置真实的Informer

向那些Informer注入事件

执行命令:

go test -v k8s.io/client-go/examples/fake-client

代码太长,具体在这里:https://github.com/kubernetes/client-go/blob/master/examples/fake-client/main_test.go

其余的示例还有:

- create-update-delete-deployment

deployment增删改查

- dynamic-create-update-delete-deployment

动态创建

- fake-client

假客户端

- in-cluster-client-configuration

集群内客户端配置

- leader-election

领导选举

- out-of-cluster-client-configuration

集群外客户端配置

- workqueue

工作队列

以下是其中一个比较常用的集群外与k8s互动的示例(由GPT注释):

// 版权声明部分表明这段代码是根据Apache License 2.0许可协议发布的,并归Kubernetes作者所有。

/*

Copyright 2016 The Kubernetes Authors.

Licensed under the Apache License, Version 2.0 (the "License");

you may not use this file except in compliance with the License.

You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.

See the License for the specific language governing permissions and

limitations under the License.

*/

// 程序的主包声明。

package main

// 导入必要的Go标准库和client-go库的包。

import (

"context" // 用于创建上下文,用于控制API调用的取消和超时。

"flag" // 用于解析命令行参数。

"fmt" // 提供格式化输出函数。

"path/filepath" // 用于处理文件路径。

"time" // 提供时间操作函数。

"k8s.io/apimachinery/pkg/api/errors" // Kubernetes的API错误处理包。

metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // Kubernetes的元数据API。

"k8s.io/client-go/kubernetes" // Kubernetes的客户端Go库。

"k8s.io/client-go/tools/clientcmd" // 用于处理kubeconfig文件的库。

"k8s.io/client-go/util/homedir" // 用于获取用户的home目录。

// 下面的注释可以被取消注释以加载所有或特定的认证插件。

// _ "k8s.io/client-go/plugin/pkg/client/auth"

// _ "k8s.io/client-go/plugin/pkg/client/auth/azure"

// _ "k8s.io/client-go/plugin/pkg/client/auth/gcp"

// _ "k8s.io/client-go/plugin/pkg/client/auth/oidc"

)

// main是程序的入口函数。

func main() {

// 定义kubeconfig的路径。如果在用户的HOME目录下找到了.kube/config,

// 则使用该路径,否则使用用户提供的路径。

var kubeconfig *string

if home := homedir.HomeDir(); home != "" {

kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")

} else {

kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")

}

flag.Parse() // 解析命令行参数。

// 使用kubeconfig配置创建clientset,用于与API服务器通信。

config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)

if err != nil {

panic(err.Error()) // 处理创建配置失败的情况。

}

// 基于上面创建的配置建立客户端集。

clientset, err := kubernetes.NewForConfig(config)

if err != nil {

panic(err.Error()) // 处理创建客户端集失败的情况。

}

// 程序开始无限循环,每10秒执行一次列出Pods和检查特定Pod的操作。

for {

// 列出所有Pods并打印Pod数量。

pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})

if err != nil {

panic(err.Error()) // 错误处理。

}

fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))

// 尝试获取默认命名空间中名为"example-xxxxx"的Pod。

namespace := "default"

pod := "example-xxxxx"

_, err = clientset.CoreV1().Pods(namespace).Get(context.TODO(), pod, metav1.GetOptions{})

// 错误处理:检查是否是因为Pod不存在导致的错误。

if errors.IsNotFound(err) {

fmt.Printf("Pod %s in namespace %s not found\n", pod, namespace)

} else if statusError, isStatus := err.(*errors.StatusError); isStatus {

// 如果是其他类型的API错误,则打印错误详情。

fmt.Printf("Error getting pod %s in namespace %s: %v\n",

pod, namespace, statusError.ErrStatus.Message)

} else if err != nil {

// 如果是未知类型的错误,则产生panic。

panic(err.Error())

} else {

// 当成功找到Pod时,打印相应的消息。

fmt.Printf("Found pod %s in namespace %s\n", pod, namespace)

}

// 休眠10秒钟。

time.Sleep(10 * time.Second)

}

}

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O1qMkcYfHPsD_6vD97RFoQLg0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券