k8s之client-go:golang与k8s交互的桥梁

文章目录

前言

k8s是一个非常成熟且强大的容器自动化编排引擎,对于这样一个利器,k8s官方提供了clientgo用来给我们使用golang去接入k8s,通过k8s的api来对k8s中的资源进行操作

通过client-go实现对k8s集群中资源对象(包括deployment、service、ingress、replicaSet、pod、namespace、node等)的增删改查等操作

示例

我们通过一个申请K8S中cronjob资源的例子,来举例说明clientgo的使用

go 复制代码
package main

import (
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	v1 "k8s.io/api/core/v1"
	batchv1 "k8s.io/client-go/applyconfigurations/batch/v1"
	corev1 "k8s.io/client-go/applyconfigurations/core/v1"
)

var cli *kubernetes.Clientset
var config *rest.Config

// InitK8SCli 创建clientgo客户端
func InitK8SCli() error {
	var err error
	// k8s中的Pod通过这种方式获取配置信息(需要通过给pod绑定角色,通过rbac的权限控制对资源操作的权限)
	config, err = rest.InClusterConfig()
	if err != nil {
		return err
	}

	cli, err = kubernetes.NewForConfig(config)
	if err != nil {
		return err
	}

	return nil
}

func main() {
	err := InitK8SCli()
	if err != nil {
		panic(err)
	}
	// 成功的job的最大数量
	var successfulJobsHistoryLimit int32 = 1
	// 失败的job的最大数量
	var failedJobsHistoryLimit int32 = 1
	// job执行完毕之后的存活时间
	var ttlSecondsAfterFinished int32 = 1
	cronJobInfo := K8SCronJobInfo{
		Name:                       "zuimo",
		Namespace:                  "zuimo",
		Schedule:                   "* * * * *",
		Image:                      "busybox",
		Command:                    []string{"echo", "hello world"},
		RestartPolicy:              "Never",
		SuccessfulJobsHistoryLimit: &successfulJobsHistoryLimit,
		FailedJobsHistoryLimit:     &failedJobsHistoryLimit,
		TTLSecondsAfterFinished:    &ttlSecondsAfterFinished,
	}
	err = ApplyCronJob(cronJobInfo)
	if err != nil {
		panic(err)
	}
}

type K8SCronJobInfo struct {
	Name                       string   `json:"name"`
	Namespace                  string   `json:"namespace"`
	Schedule                   string   `json:"schedule"`
	Image                      string   `json:"image"`
	Command                    []string `json:"command"`
	RestartPolicy              string   `json:"restartPolicy"`
	SuccessfulJobsHistoryLimit *int32   `json:"successfulJobsHistoryLimit"`
	FailedJobsHistoryLimit     *int32   `json:"failedJobsHistoryLimit"`
	TTLSecondsAfterFinished    *int32   `json:"ttlSecondsAfterFinished"`
}

// 申请cronjob的函数
func ApplyCronJob(cronJobInfo K8SCronJobInfo) error {
	cronJob := buildCronJob(cronJobInfo)
	result, err := cli.BatchV1().CronJobs(cronJobInfo.Namespace).Apply(context.Background(), cronJob,
		metav1.ApplyOptions{FieldManager: "data-manager"})
	if err != nil {
		fmt.Printf("cron job obj: %v\n", result)
		return err
	}

	return nil
}

// buildCronJob 构造cronjob结构体
func buildCronJob(param K8SCronJobInfo) *batchv1.CronJobApplyConfiguration {
	container := corev1.Container().WithName(param.Name).WithImage(param.Image).
		WithImagePullPolicy(v1.PullIfNotPresent).WithCommand(param.Command...)

	podSpec := corev1.PodSpec().WithContainers(container).WithRestartPolicy(v1.RestartPolicy(param.RestartPolicy))

	podTemplateSpec := corev1.PodTemplateSpec().WithSpec(podSpec)

	jobSpec := batchv1.JobSpec().WithTemplate(podTemplateSpec)

	if param.TTLSecondsAfterFinished != nil {
		jobSpec = jobSpec.WithTTLSecondsAfterFinished(*param.TTLSecondsAfterFinished)
	}

	jobTemplateSpec := batchv1.JobTemplateSpec().WithSpec(jobSpec)

	cronJobSpec := setJobsHistoryLimit(batchv1.CronJobSpec().WithSchedule(param.Schedule).
		WithJobTemplate(jobTemplateSpec), param.SuccessfulJobsHistoryLimit, param.FailedJobsHistoryLimit)

	return batchv1.CronJob(param.Name, param.Namespace).WithSpec(cronJobSpec)
}

func setJobsHistoryLimit(cronJobSpec *batchv1.CronJobSpecApplyConfiguration, successfulJobsHistoryLimit,
	failedJobsHistoryLimit *int32) *batchv1.CronJobSpecApplyConfiguration {

	if successfulJobsHistoryLimit != nil {
		cronJobSpec = cronJobSpec.WithSuccessfulJobsHistoryLimit(*successfulJobsHistoryLimit)
	}

	if failedJobsHistoryLimit != nil {
		cronJobSpec = cronJobSpec.WithFailedJobsHistoryLimit(*failedJobsHistoryLimit)
	}

	return cronJobSpec
}

总结

我们演示了一个简单的例子,来描述client-go的基本用法,希望对你有所帮助

相关推荐
姚不倒11 小时前
深入浅出 Kubernetes CRD、Operator 与 CR
云原生·容器·kubernetes
ywf121511 小时前
Go基础之环境搭建
开发语言·后端·golang
阿干tkl15 小时前
openEuler 系统 Kubernetes + Harbor 学习测试环境详细部署指南
容器·kubernetes
2601_9498144917 小时前
使用Kubernetes部署Spring Boot项目
spring boot·容器·kubernetes
钛态17 小时前
Flutter 三方库 result_type 深入鸿蒙强类型返回栈跨界交互适配:肃清空指针回调与运行时崩溃、大幅增注接口安全壁垒且提升多隔离桥接数据抛出健壮性-适配鸿蒙 HarmonyOS ohos
flutter·交互·harmonyos
点云SLAM17 小时前
Qt+PCL手把手教材(第11讲)——PCL库PCLVisualizer点云可视化以及与 VTK 交互器(Interactor)详解和代码示例
人工智能·交互·3d数据可视化·pcl点云库·qt+pcl·pclvisualizer使用·vkt
全栈若城17 小时前
HarmonyOS6 半年磨一剑 - RcInput 组件清空、密码切换与图标交互机制
架构·交互·harmonyos6·三方库开发实战·rchoui·三方库开发
结衣结衣.17 小时前
【Linux】命名管道的妙用:实现进程控制与实时字符交互
linux·运维·开发语言·学习·操作系统·交互
好家伙VCC18 小时前
**CQRS模式实战:用Go语言构建高并发读写分离架构**在现代分布式系统中,随着业务复杂度的提升和用户量的增长,传统的单数据库模型逐
java·数据库·python·架构·golang