侧边栏壁纸
博主头像
张种恩的技术小栈博主等级

行动起来,活在当下

  • 累计撰写 748 篇文章
  • 累计创建 65 个标签
  • 累计收到 39 条评论

目 录CONTENT

文章目录

通过 Kubenretes client-go 获取资源 Yaml

zze
zze
2022-04-29 / 1 评论 / 0 点赞 / 864 阅读 / 1989 字

不定期更新相关视频,抖音点击左上角加号后扫一扫右方侧边栏二维码关注我~正在更新《Shell其实很简单》系列

最近有个需求需要在运维平台支持查看 Kubernetes 资源 Yaml,查看了下 kubectl 源码的实现,藏得比较深,所以记录一下。

/**
 * @Author: zze
 * @Date: 2022/4/21 11:43
 * @Desc:
 */
package main

import (
	"bytes"
	"context"
	"fmt"
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
	"k8s.io/apimachinery/pkg/runtime/schema"
	"k8s.io/cli-runtime/pkg/printers"
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/rest"
	"k8s.io/client-go/tools/clientcmd"
	"strings"
)

type K8sClient struct {
	RestConf  *rest.Config
	ClientSet *kubernetes.Clientset
}

func NewK8sClient(conf string) (*K8sClient, error) {
	k8sClient := new(K8sClient)
	var err error
	if k8sClient.RestConf, err = GetRestConf(conf); err != nil {
		return nil, err
	}
	if k8sClient.ClientSet, err = kubernetes.NewForConfig(k8sClient.RestConf); err != nil {
		return nil, err
	}
	return k8sClient, nil
}

func GetRestConf(config string) (*rest.Config, error) {
	var (
		restConf *rest.Config
		err      error
	)

	if restConf, err = clientcmd.RESTConfigFromKubeConfig([]byte(config)); err != nil {
		return nil, err
	}
	return restConf, nil
}

func main() {
	y := printers.YAMLPrinter{}
	cli, err := NewK8sClient("<kubeConfig>")
	if err != nil {
		panic(err)
	}
	namespace := "<命名空间>"
	deploymentsClient := cli.ClientSet.AppsV1().Deployments(namespace)
	deployment, err := deploymentsClient.Get(context.TODO(), "<Deployment 名称>", metav1.GetOptions{})
	if err != nil {
		if strings.Contains(err.Error(), "not found") {
			panic("not found")
		}
		panic(err)
	}
	deployment.GetObjectKind().SetGroupVersionKind(schema.GroupVersionKind{
		Group:   "apps",
		Version: "v1",
		Kind:    "Deployment",
	})
	buf := new(bytes.Buffer)
	err = y.PrintObj(deployment, buf)
	if err != nil {
		panic(err)
	}
	fmt.Println(buf.String())
}
0

评论区