package main
import (
"context"
"fmt"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
"k8s.io/client-go/tools/remotecommand"
metric "k8s.io/metrics/pkg/client/clientset/versioned"
"os"
)
type Client struct {
k8sConfig *rest.Config
// 可以创建或查询k8s资源
k8sClient *kubernetes.Clientset
// 通过restful方式创建或查询k8s资源
restClient *rest.RESTClient
// 查询pod监控资源cpu、memory
metricClient *metric.Clientset
// 操作crd资源
dynamicClient *dynamic.Interface
}
func GetClient(kubeconfig string) *Client {
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
panic(err)
}
config.GroupVersion = &v1.SchemeGroupVersion
// 设置反序列化
config.NegotiatedSerializer = scheme.Codecs
// 指定ApiPath,参考/api/v1/namespaces/{namespace}/pods
config.APIPath = "/api"
restClient, err := rest.RESTClientFor(config)
if err != nil {
panic(err)
}
k8sClient, err := kubernetes.NewForConfig(config)
if err != nil {
panic(err)
}
metricClient, err := metric.NewForConfig(config)
if err != nil {
panic(err)
}
dynamicClient, err := dynamic.NewForConfig(config)
if err != nil {
panic(err)
}
return &Client{
k8sConfig: config,
k8sClient: k8sClient,
restClient: restClient,
metricClient: metricClient,
dynamicClient: &dynamicClient,
}
}
func (ctl *Client) GetPodList(namespace, label string) {
ctx := context.Background()
//deployMentList, err := ctl.k8sClient.AppsV1().Deployments(namespace).List(ctx, metav1.ListOptions{LabelSelector: label})
//if err != nil {
// panic(err)
//}
//fmt.Println(deployMentList)
podList, err := ctl.k8sClient.CoreV1().Pods(namespace).List(ctx, metav1.ListOptions{LabelSelector: label})
if err != nil {
panic(err)
}
for _, p := range podList.Items {
fmt.Println(p.Name)
}
}
func (ctl *Client) Webshell(namespace, podName string) {
//req := ctl.k8sClient.CoreV1().RESTClient().Post().Resource("pods").
req := ctl.restClient.Post().Resource("pods").
Name(podName).
Namespace(namespace).
SubResource("exec").
VersionedParams(&v1.PodExecOptions{
Container: "",
Command: []string{"/bin/sh"},
Stdin: true,
Stdout: true,
Stderr: true,
TTY: true, // 打开linux终端
}, scheme.ParameterCodec)
executor, err := remotecommand.NewSPDYExecutor(ctl.k8sConfig, "POST", req.URL())
if err != nil {
panic(err)
}
if err = executor.Stream(remotecommand.StreamOptions{
Stdin: os.Stdin,
Stdout: os.Stdout,
Stderr: os.Stderr,
}); err != nil {
panic(err.Error())
}
}
func (ctl *Client) Metric(namespace, label string) {
ctx := context.Background()
podMetrics, err := ctl.metricClient.MetricsV1beta1().PodMetricses(namespace).List(ctx, metav1.ListOptions{LabelSelector: label})
if err != nil {
panic(err)
}
fmt.Println(podMetrics)
}
func main() {
ctl := GetClient("D:\\GoProject\\awesomeProject\\test\\t3\\config")
//获取k8s资源
//ctl.GetPodList("default", "app=smartops-screen")
//pod bash登录
//ctl.Webshell("default", "smartops-screen-749c6968bf-whdw7")
//获取pod监控资源cpu、memory
ctl.Metric("default", "app=nwy-bridge")
}
client-go操作kubernetes资源
于 2022-11-25 13:48:35 首次发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)