最新资讯

  • 【云原生开发】如何通过client-go来操作K8S集群

【云原生开发】如何通过client-go来操作K8S集群

2025-05-09 17:37:45 0 阅读

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,云原生开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:云原生开发
景天的主页:景天科技苑

文章目录

  • client-go
    • 一、client-go介绍
      • 1. 什么是client-go?
      • 2. client-go版本的演变
      • 3. client-go客户端分类
      • 4. client-go客户端工具依赖关系
      • 5. 安装client-go
    • 二、使用client-go进行基本操作
      • 2.1 in-cluster配置
      • 2.2 out-of-cluster配置
      • 2.3 client-go 查询列表功能使用
      • 2.4 client-go查询资源详情
      • 2.5 client-go更新资源功能
      • 2.6 client-go删除资源
      • 2.7 client-go创建资源
      • 2.8 client-go使用json串创建资源
    • 三、总结

client-go

一、client-go介绍

1. 什么是client-go?

client-go是Kubernetes官方提供的,用于操作kubernetes资源的Go语言客户端库,通过它,开发者可以非常方便地在Go项目中与Kubernetes集群进行交互,实现对Kubernetes资源以及自定义CRD的增删改查和事件监听等操作。
同时,可以通过client-go实现kubernetes的二次开发。自定义资源开发。

源码:
github下载地址:https://github.com/kubernetes/client-go

如果是其他语言的客户端工具,可以通过https://github.com/kubernetes-client 来查看

我们看下client-go几个比较重要的目录

2. client-go版本的演变

左边是client-go的版本。右边是k8s的版本
在client-go 1.17版本之前,client-go的版本与k8s版本保持一致,1.17之后,client-go的版本多了一个v的tag。是由于go语言的包是带v的版本

建议:client-go我们直接用最新版本

3. client-go客户端分类

restclient: 一般我们不会使用restclient,因为它需要把整个资源的yaml文件或json数据都传过去,显得比较臃肿,一般我们不用这个
discoverclient: 比如我们创建deployment时的apiversion: apps/v1    apps就是资源组Group   v1就是资源版本Version   资源信息 就是kind 。我们一般也不会用这个客户端工具
ClientSet: 只能针对K8S内置的资源进行操作,不能操作自定义的资源
DyanmicClient: 我们经常使用这个客户端,但是对于内置资源,我们还是习惯使用ClientSet,因为它更好用,自定义资源我们使用DyanmicClient。

我们可以通过命令 kubectl api-resources 查看每种资源的资源组

4. client-go客户端工具依赖关系

5. 安装client-go

client-go是一个Go模块,可以通过Go Module的方式进行安装。在你的Go项目中,执行以下命令:

go get k8s.io/client-go@latest

这将安装最新版本的client-go。此外,你还需要安装一些相关的依赖库,例如apimachinery,用于处理Kubernetes API对象。

go get k8s.io/apimachinery@latest

安装完还需要运行go mod tidy 加载依赖包

二、使用client-go进行基本操作

创建Kubernetes客户端
在使用client-go之前,首先需要创建一个Kubernetes客户端。client-go提供了两种创建客户端的方式:in-cluster配置和out-of-cluster配置。

我们根据我们之前写好的脚手架,改个名字,在此基础上开发我们的项目

并不是说在此改了就可以了,因为很多包用的还是原来的名字,

我们可以批量替换
在Goland IDE中想要替换某一段特定的字符串,可以使用Find and Replace 功能来实现。这是一种全局性的操作,将会在你的整个项目或指定的文件/文件夹中进行。

使用Ctrl + Shift + R 打开Find and Repalce对话框

我们测试client-go,要用到k8s集群,得有~/.kube/config 这个文件
里面是加载集群的配置信息

将这个文件复制到我们的项目中

2.1 in-cluster配置

在Kubernetes 集群内部运行时,可以使用in-cluster配置。这种方式不需要手动指定kubeconfig文件路径,client-go会自动使用集群中的服务账户进行身份验证。

2.2 out-of-cluster配置

测试client-go,我们使用out-of-cluster方式来测试,发布项目的时候,我们使用in-cluster方式配置
在本地电脑开发环境或其他非Kubernetes集群中运行时,可以使用out-of-cluster配置。这需要指定kubeconfig文件的路径。kubeconfig文件通常位于$HOME/.kube/config,它包含了访问Kubernetes集群所需的配置信息。

这是github上面看用法举例

package main

import (
    "context"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    //1. 初始化config实例
    //var kubeconfig *string
    // 通过家目录找到kubeconfig文件。我们的路径是已知的,所以不用此项配置
    //if home := homedir.HomeDir(); home != "" {
    //    kubeconfig = flag.String("meta.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()

    // 1. 初始化config实例
    // 因为我们的路径是已知的,所以不用上面的配置。use the current context in kubeconfig
    // masterUrl就是离我们主节点的ip地址和端口号,我们在kubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常应用我们的服务,必须能够实例化成功kubeconfig,要不然后面所有的功能都无法使用,所以这里直接报panic即可
    if err != nil {
        panic(err.Error())
    }

    // 2. 创建客户端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //这个客户端工具如果生成失败的话,后面的操作也无法完成,所以这里也报panic即可
    if err != nil {
        panic(err.Error())
    }

    //3. 操作集群
    pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
    //此时报错的话,不应该是panic了,但是这里官方用的还是panic。后期需要优化,我么可以返回个错误信息
    if err != nil {
        panic(err.Error())
    }

    //打印pod的数量
    fmt.Printf("There are %d pods in the cluster
", len(pods.Items))

    // 获取指定名称空间下的pod数量,如果namespace不传值,默认查的是所有命名空间下的pod
    namespace := "h5-web"
    pods, err = clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        panic(err.Error())
    }
    //打印pod的数量
    fmt.Printf("%s namespce has %d pods in the cluster
", namespace, len(pods.Items))
    //看下返回的pod是什么
    fmt.Println("pods是什么:", pods)
}

2.3 client-go 查询列表功能使用

我们看下List方法的参数,包含两个,一个context,一个是ListOptions。

这个ListOptions就可以在里面做些筛选条件,比如传json串,标签等

我们看下List的返回值

所以我们要查询具体的pod里面的信息,可以在Items字段中获取到所有的pod
跟我们通过在k8s集群中通过kubectl … -ojson的得到的信息是一样的

如果要取其中某个pod,可以通过下标来获取

如果忘记pod的层级关系,可以使用k8s命令的-ojson 查看一下

完整代码:

package main

import (
    "context"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    // 1. 初始化config实例
    // masterUrl就是离我们主节点的ip地址和端口号,我们在kubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常应用我们的服务,必须能够实例化成功kubeconfig,要不然后面所有的功能都无法使用,所以这里直接报panic即可
    if err != nil {
        panic(err.Error())
    }

    // 2. 创建客户端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //这个客户端工具如果生成失败的话,后面的操作也无法完成,所以这里也报panic即可
    if err != nil {
        panic(err.Error())
    }

    //3. 操作集群
    pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
    //此时报错的话,不应该是panic了,但是这里官方用的还是panic。后期需要优化,我么可以返回个错误信息
    if err != nil {
        panic(err.Error())
    }

    //打印pod的数量
    fmt.Printf("There are %d pods in the cluster
", len(pods.Items))

    // 获取指定名称空间下的pod数量,如果namespace不传值,默认查的是所有命名空间下的pod
    namespace := "h5-web"
    pods, err = clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
    if err != nil {
        panic(err.Error())
    }
    //打印pod的数量
    fmt.Printf("%s namespce has %d pods in the cluster
", namespace, len(pods.Items))
    //看下返回的pod是什么
    fmt.Println("pods是什么:", pods)

    //获取到某个pod
    fmt.Println(pods.Items[0].Spec.NodeName)
    //获取到某个容器的镜像
    fmt.Println(pods.Items[0].Spec.Containers[0].Image)

}

下面,我们探讨下,我们怎么知道我们要操作的资源是属于CoreV1()或者是其他什么组呢?
之前,我们说过,在K8S集群中,可以通过命令 kubectl api-resources查看

deployment 的apiversion是 apps/v1 对应的client-go里面的方法就是 clientset.AppsV1()
crontabs 的apiversion是batch/v1 对应的client-go里面的方法就是clientset.BatchV1()
ingresses的apiversion是networking.k8s.io/v1 对应client-go里面的方法就是clientset.NetworkingV1()

以此类推,由此我们就知道了个汇总资源对应的操作方法
这种V1的apiversion的资源,对应的就是clientset.CoreV1()

如果不想通过K8S命令来查,也可以在代码中查看
点进来

这里可看看到个各种方法,不过我们用的时候要把首字母大写

比如查询deployment

//查询deployment列表,用法与pod类似
deploy, _ := clientset.AppsV1().Deployments("").List(context.TODO(), metav1.ListOptions{})
//查看所有名称空间下deploy的数量
fmt.Println("deployment的数量", len(deploy.Items))
//打印deploy名称,由于是多个,我们循环打印
for _, i := range deploy.Items {
    fmt.Printf("当前资源的名称空间: %s, deployment名称是: %s
", i.Namespace, i.Name)
}

//查询没有名称空间限制的资源,比如名称空间,工作节点,clusterrole,clusterrolebinding等
//查的都是集群的资源
//比如我们查询集群有多少个名称空间
ns, _ := clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
fmt.Printf("There are %d namespaces in the cluster
", len(ns.Items))

完整代码:

package main

import (
    "context"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    // 1. 初始化config实例
    // masterUrl就是离我们主节点的ip地址和端口号,我们在kubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常应用我们的服务,必须能够实例化成功kubeconfig,要不然后面所有的功能都无法使用,所以这里直接报panic即可
    if err != nil {
        panic(err.Error())
    }

    // 2. 创建客户端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //这个客户端工具如果生成失败的话,后面的操作也无法完成,所以这里也报panic即可
    if err != nil {
        panic(err.Error())
    }

    //3. 操作集群
    pods, err := clientset.CoreV1().Pods("").List(context.TODO(), metav1.ListOptions{})
    //此时报错的话,不应该是panic了,但是这里官方用的还是panic。后期需要优化,我么可以返回个错误信息
    if err != nil {
        panic(err.Error())
    }

    //打印pod的数量
    fmt.Printf("There are %d pods in the cluster
", len(pods.Items))

    // 获取指定名称空间下的pod数量,如果namespace不传值,默认查的是所有命名空间下的pod
    //namespace := "h5-web"
    //pods, err = clientset.CoreV1().Pods(namespace).List(context.TODO(), metav1.ListOptions{})
    //if err != nil {
    //    panic(err.Error())
    //}
    打印pod的数量
    //fmt.Printf("%s namespce has %d pods in the cluster
", namespace, len(pods.Items))
    看下返回的pod是什么
    //fmt.Println("pods是什么:", pods)
    //
    获取到某个pod
    //fmt.Println(pods.Items[0].Spec.NodeName)
    获取到某个容器的镜像
    //fmt.Println(pods.Items[0].Spec.Containers[0].Image)

    //查询deployment列表,用法与pod类似
    deploy, _ := clientset.AppsV1().Deployments("").List(context.TODO(), metav1.ListOptions{})
    //查看所有名称空间下deploy的数量
    fmt.Println("deployment的数量", len(deploy.Items))
    //打印deploy名称,由于是多个,我们循环打印
    for _, i := range deploy.Items {
        fmt.Printf("当前资源的名称空间: %s, deployment名称是: %s
", i.Namespace, i.Name)
    }

    //查询没有名称空间限制的资源,比如名称空间,工作节点,clusterrole,clusterrolebinding等
    //查的都是集群的资源
    //比如我们查询集群有多少个名称空间
    ns, _ := clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
    fmt.Printf("There are %d namespaces in the cluster
", len(ns.Items))
}

2.4 client-go查询资源详情

Get()方法,可以获取单个资源的详情,获取详情之后,我们可以传给前端展示,或者根据查询出来的数据进行更改
比如说,我们对K8S集群中h5-web名称空间下的 pods 查询详情

// 查询资源详情 Get()方法
// Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Pod, error)
poddetail, _ := clientset.CoreV1().Pods("h5-web").Get(context.TODO(), "web-864f4c6988-95sw4", metav1.GetOptions{})
//fmt.Println("pod详情:", poddetail)
//打印pod的镜像名称
fmt.Println("pod第一个容器的镜像名称", poddetail.Spec.Containers[0].Image)

//获取名称空间的详情
namespace, _ := clientset.CoreV1().Namespaces().Get(context.TODO(), "h5-web", metav1.GetOptions{})
fmt.Println("名称空间详情:", namespace)

完整代码

package main

import (
    "context"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    // 1. 初始化config实例
    // masterUrl就是离我们主节点的ip地址和端口号,我们在kubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常应用我们的服务,必须能够实例化成功kubeconfig,要不然后面所有的功能都无法使用,所以这里直接报panic即可
    if err != nil {
        panic(err.Error())
    }

    // 2. 创建客户端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //这个客户端工具如果生成失败的话,后面的操作也无法完成,所以这里也报panic即可
    if err != nil {
        panic(err.Error())
    }

    //3. 操作集群



    // 查询资源详情 Get()方法
    // Get(ctx context.Context, name string, opts metav1.GetOptions) (*v1.Pod, error)
    poddetail, _ := clientset.CoreV1().Pods("h5-web").Get(context.TODO(), "web-864f4c6988-95sw4", metav1.GetOptions{})
    //fmt.Println("pod详情:", poddetail)
    //打印pod的镜像名称
    fmt.Println("pod第一个容器的镜像名称", poddetail.Spec.Containers[0].Image)

    //获取名称空间的详情
    namespace, _ := clientset.CoreV1().Namespaces().Get(context.TODO(), "h5-web", metav1.GetOptions{})
    fmt.Println("名称空间详情:", namespace)

}

其他资源查询方式类似,感兴趣的朋友可以尝试下

2.5 client-go更新资源功能

更新的前提是该字段是可更改的
比如这种can’t be updated的字段,就不能被修改

注意:如果修改的字段在资源中不存在,比如labels 。修改时会报空指针错误,此时就要初始化下才能修改

//更新资源操作  Update()
//先获取资源详情,再修改
//比如,我们修改service的暴露的端口号
service, _ := clientset.CoreV1().Services("h5-web").Get(context.TODO(), "web", metav1.GetOptions{})
fmt.Printf("service对外的端口号是 %d
", service.Spec.Ports[0].NodePort)
// 修改端口号
// service-node-port-range 默认可以设置的范围 30000-32767
service.Spec.Ports[0].NodePort = 32050
// 修改暴露的端口号
// Update(ctx context.Context, service *v1.Service, opts metav1.UpdateOptions) (*v1.Service, error)
_, err = clientset.CoreV1().Services("h5-web").Update(context.TODO(), service, metav1.UpdateOptions{})
if err != nil {
    panic(err.Error())
}
fmt.Printf("修改后service对外的端口号是 %d
", service.Spec.Ports[0].NodePort)

//修改deploy的副本数
deploy, _ := clientset.AppsV1().Deployments("h5-web").Get(context.TODO(), "web", metav1.GetOptions{})
//查看当前deploy的副本数
fmt.Println("当前deploy的副本数是:", *deploy.Spec.Replicas)
//修改副本数
replacs := int32(3)
//注意Replicas 是int32的指针类型
deploy.Spec.Replicas = &replacs

_, err = clientset.AppsV1().Deployments("h5-web").Update(context.TODO(), deploy, metav1.UpdateOptions{})
//查看修改后deploy的副本数
fmt.Println("修改后deploy的副本数是:", *deploy.Spec.Replicas)

完整代码:

package main

import (
    "context"
    "fmt"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    // 1. 初始化config实例
    // masterUrl就是离我们主节点的ip地址和端口号,我们在kubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常应用我们的服务,必须能够实例化成功kubeconfig,要不然后面所有的功能都无法使用,所以这里直接报panic即可
    if err != nil {
        panic(err.Error())
    }

    // 2. 创建客户端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //这个客户端工具如果生成失败的话,后面的操作也无法完成,所以这里也报panic即可
    if err != nil {
        panic(err.Error())
    }

    //3. 操作集群


    //更新资源操作  Update()
    //先获取资源详情,再修改
    //比如,我们修改service的暴露的端口号
    service, _ := clientset.CoreV1().Services("h5-web").Get(context.TODO(), "web", metav1.GetOptions{})
    fmt.Printf("service对外的端口号是 %d
", service.Spec.Ports[0].NodePort)
    // 修改端口号
    // service-node-port-range 默认可以设置的范围 30000-32767
    service.Spec.Ports[0].NodePort = 32050
    // 修改暴露的端口号
    // Update(ctx context.Context, service *v1.Service, opts metav1.UpdateOptions) (*v1.Service, error)
    _, err = clientset.CoreV1().Services("h5-web").Update(context.TODO(), service, metav1.UpdateOptions{})
    if err != nil {
        panic(err.Error())
    }
    fmt.Printf("修改后service对外的端口号是 %d
", service.Spec.Ports[0].NodePort)

    //修改deploy的副本数
    deploy, _ := clientset.AppsV1().Deployments("h5-web").Get(context.TODO(), "web", metav1.GetOptions{})
    //查看当前deploy的副本数
    fmt.Println("当前deploy的副本数是:", *deploy.Spec.Replicas)
    //修改副本数
    replacs := int32(3)
    //注意Replicas 是int32的指针类型
    deploy.Spec.Replicas = &replacs

    _, err = clientset.AppsV1().Deployments("h5-web").Update(context.TODO(), deploy, metav1.UpdateOptions{})
    //查看修改后deploy的副本数
    fmt.Println("修改后deploy的副本数是:", *deploy.Spec.Replicas)
}

2.6 client-go删除资源

删除pod,比如我们将下列的pod删除

//删除资源 Delete()
//删除pod
err = clientset.CoreV1().Pods("h5-web").Delete(context.TODO(), "web-864f4c6988-r456g", metav1.DeleteOptions{})
if err != nil {
    panic(err.Error())

可见pod已被删除

2.7 client-go创建资源

创建namespace

//创建名称空间
var namespace corev1.Namespace
//创建namespace只需要传个名字就可以了
namespace.Name = "test1"
// Create(ctx context.Context, namespace *v1.Namespace, opts metav1.CreateOptions) (*v1.Namespace, error)
//传的是指针
_, err = clientset.CoreV1().Namespaces().Create(context.TODO(), &namespace, metav1.CreateOptions{})
if err != nil {
    panic(err.Error())
}

注意,这个corev1的导包,我们要根据Create()这个方法里面的导包,导过来,不要导错了,因为很多v1的包

创建deployment
注意,这个deployment的v1,

导包的时候,不要导错

传参时,要把必须得参数都传进去

可以通过这个命令来查看哪些是必须传的参数

kubectl create deployment mynginx --image="nginx" --dry-run=client -oyaml

它会导出一份yaml文件

package main

import (
    "context"
    "fmt"
    deployv1 "k8s.io/api/apps/v1"
    corev1 "k8s.io/api/core/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    // 1. 初始化config实例
    // masterUrl就是离我们主节点的ip地址和端口号,我们在kubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常应用我们的服务,必须能够实例化成功kubeconfig,要不然后面所有的功能都无法使用,所以这里直接报panic即可
    if err != nil {
        panic(err.Error())
    }

    // 2. 创建客户端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //这个客户端工具如果生成失败的话,后面的操作也无法完成,所以这里也报panic即可
    if err != nil {
        panic(err.Error())
    }

    //3. 操作集群
    //创建deployment
    var deploy deployv1.Deployment
    //给deployment传参,要把必须传的参数都传进去,不然创建会报错
    deploy.Name = "mydeploy"
    deploy.Namespace = "test1"

    //副本数
    replicas := int32(1)
    deploy.Spec.Replicas = &replicas

    //mathlabels
    labels := make(map[string]string)
    labels["app"] = "nginx"
    //Selector 是个指针类型,需要先初始化
    //Selector *metav1.LabelSelector `json:"selector" protobuf:"bytes,2,opt,name=selector"`
    deploy.Spec.Selector = &metav1.LabelSelector{}
    deploy.Spec.Selector.MatchLabels = labels
    //deployment label   metadata会将里面的资源发布出去,metadata可以省略掉
    deploy.Labels = labels

    // 创建template 这个template模版就是pod的模板
    // Template v1.PodTemplateSpec `json:"template" protobuf:"bytes,3,opt,name=template"`
    // 此时的labels要和selector的labels一样,否则deployment就无法管理到pod
    deploy.Spec.Template.ObjectMeta.Labels = labels

    //创建容器,容器是个切片,可以创建多个容器
    var containers []corev1.Container
    var container corev1.Container
    container.Name = "nginx"
    container.Image = "nginx:1.7.9"
    containers = append(containers, container)

    container.Name = "redis"
    container.Image = "redis:6-alpine"
    containers = append(containers, container)

    deploy.Spec.Template.Spec.Containers = containers

    _, err = clientset.AppsV1().Deployments("test1").Create(context.TODO(), &deploy, metav1.CreateOptions{})

}

查看创建的deploy

查看yaml文件,两个容器都创建成功

[root@master01 svc ]#kubectl get deploy -n test1 -oyaml
apiVersion: v1
items:
- apiVersion: apps/v1
  kind: Deployment
  metadata:
    annotations:
      deployment.kubernetes.io/revision: "1"
    creationTimestamp: "2024-11-05T09:58:43Z"
    generation: 1
    labels:
      app: nginx
    name: mydeploy
    namespace: test1
    resourceVersion: "1079640"
    uid: 8df3654a-71c6-45d5-888d-6329ed81dad7
  spec:
    progressDeadlineSeconds: 600
    replicas: 1
    revisionHistoryLimit: 10
    selector:
      matchLabels:
        app: nginx
    strategy:
      rollingUpdate:
        maxSurge: 25%
        maxUnavailable: 25%
      type: RollingUpdate
    template:
      metadata:
        creationTimestamp: null
        labels:
          app: nginx
      spec:
        containers:
        - image: nginx:1.7.9
          imagePullPolicy: IfNotPresent
          name: nginx
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
        - image: redis:6-alpine
          imagePullPolicy: IfNotPresent
          name: redis
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
        dnsPolicy: ClusterFirst
        restartPolicy: Always
        schedulerName: default-scheduler
        securityContext: {}
        terminationGracePeriodSeconds: 30
  status:
    conditions:
    - lastTransitionTime: "2024-11-05T09:58:43Z"
      lastUpdateTime: "2024-11-05T09:58:43Z"
      message: Deployment does not have minimum availability.
      reason: MinimumReplicasUnavailable
      status: "False"
      type: Available
    - lastTransitionTime: "2024-11-05T09:58:43Z"
      lastUpdateTime: "2024-11-05T09:58:43Z"
      message: ReplicaSet "mydeploy-68dcc7d46d" is progressing.
      reason: ReplicaSetUpdated
      status: "True"
      type: Progressing
    observedGeneration: 1
    replicas: 1
    unavailableReplicas: 1
    updatedReplicas: 1
kind: List
metadata:
  resourceVersion: ""

2.8 client-go使用json串创建资源

上面使用手动填值的方式创建,还是比较麻烦的,稍微有不注意的地方还容易犯错,因此,在前后端分离的项目中,在web页面,一般我们不悔通过手动填值进行创建资源。
一般我们会根据json串来创建资源
首先我们通过先通过kubectl命令导出json串

–dry-run 选项只能为 “none”、“server”、"client"三者中的一个,默认是none;当不加该参数,或者为none的时候,该操作后资源会生效 ,请求会被发送到kube-apiserver并做实际更改;
当该参数为client的时候,只打印该对象并不会发送请求且并不会实际创建该对象;
当该参数为server的时候,会发送请求到服务端,但是并不会实际创建该对象。
比如我们拿到一个创建deploy的json串

kubectl create deployment myredis --image="redis" --dry-run=client -ojson

我们将json串拿出来

{
    "kind": "Deployment",
    "apiVersion": "apps/v1",
    "metadata": {
        "name": "myredis",
        "creationTimestamp": null,
        "labels": {
            "app": "myredis"
        }
    },
    "spec": {
        "replicas": 1,
        "selector": {
            "matchLabels": {
                "app": "myredis"
            }
        },
        "template": {
            "metadata": {
                "creationTimestamp": null,
                "labels": {
                    "app": "myredis"
                }
            },
            "spec": {
                "containers": [
                    {
                        "name": "redis",
                        "image": "redis",
                        "resources": {}
                    }
                ]
            }
        },
        "strategy": {}
    },
    "status": {}
}

使用json创建deploy完整代码:

package main

import (
    "context"
    "encoding/json"
    "fmt"
    deployv1 "k8s.io/api/apps/v1"
    metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    "k8s.io/client-go/tools/clientcmd"
)

func main() {
    // 1. 初始化config实例
    // masterUrl就是离我们主节点的ip地址和端口号,我们在kubeconfig文件中有了,所以可以省略
    config, err := clientcmd.BuildConfigFromFlags("", "meta.kubeconfig")
    //要想正常应用我们的服务,必须能够实例化成功kubeconfig,要不然后面所有的功能都无法使用,所以这里直接报panic即可
    if err != nil {
        panic(err.Error())
    }

    // 2. 创建客户端工具 create the clientset
    clientset, err := kubernetes.NewForConfig(config)
    //这个客户端工具如果生成失败的话,后面的操作也无法完成,所以这里也报panic即可
    if err != nil {
        panic(err.Error())
    }

    //3. 操作集群

    //通过json串创建k8s资源,注意多行字符串用反引号包裹
    deployJson := `{
    "kind": "Deployment",
    "apiVersion": "apps/v1",
    "metadata": {
        "name": "myredis",
        "creationTimestamp": null,
        "labels": {
            "app": "myredis"
        }
    },
    "spec": {
        "replicas": 1,
        "selector": {
            "matchLabels": {
                "app": "myredis"
            }
        },
        "template": {
            "metadata": {
                "creationTimestamp": null,
                "labels": {
                    "app": "myredis"
                }
            },
            "spec": {
                "containers": [
                    {
                        "name": "redis",
                        "image": "redis",
                        "resources": {}
                    }
                ]
            }
        },
        "strategy": {}
    },
    "status": {}
}`

    //我们需要将json串转换成deployv1类型的资源
    var redisdeploy deployv1.Deployment
    //将json转换成struct
    // func Unmarshal(data []byte, v any) error
    err = json.Unmarshal([]byte(deployJson), &redisdeploy)
    if err != nil {
        panic(err.Error())
    }
    fmt.Println("将json转换成的struct:", redisdeploy)
    //创建deploy
    _, err = clientset.AppsV1().Deployments("default").Create(context.TODO(), &redisdeploy, metav1.CreateOptions{})
    if err != nil {
        panic(err.Error())
    }

}

在K8S集群查看下,创建成功

三、总结

client-go是Kubernetes官方提供的Go客户端库,它封装了与Kubernetes API服务器的交互,提供了便捷的方式进行各种资源的管理。通过创建客户端并使用相应的API客户端进行操作,你可以轻松地进行Pod、Deployment、Service等资源的增删改查。

本文详细介绍了client-go的安装、配置和使用方法,并通过示例代码展示了如何进行常见的Kubernetes操作。希望这些内容能帮助大家更好地理解和使用client-go,从而提高你的Kubernetes开发效率。

本文地址:https://www.vps345.com/9463.html

搜索文章

Tags

PV计算 带宽计算 流量带宽 服务器带宽 上行带宽 上行速率 什么是上行带宽? CC攻击 攻击怎么办 流量攻击 DDOS攻击 服务器被攻击怎么办 源IP 服务器 linux 运维 游戏 云计算 服务器安全 网络安全策略 防御服务器攻击 安全威胁和解决方案 程序员博客保护 数据保护 安全最佳实践 网络工程师 网络管理 软考 2024 2024年上半年 下午真题 答案 docker 容器 java-rabbitmq java RTSP xop RTP RTSPServer 推流 视频 Deepseek Deepseek-R1 大模型 私有化部署 推理模型 deepseek Ollama 模型联网 API CherryStudio 物联网 ubuntu Qwen2.5-coder 离线部署 python MCP php 开发语言 阿里云 网络 网络安全 网络协议 DeepSeek-R1 API接口 llama 算法 opencv 自然语言处理 神经网络 语言模型 进程 操作系统 进程控制 Ubuntu ssh javascript 前端 chrome edge macos windows conda harmonyos 华为 typescript 计算机网络 数据库 centos oracle 关系型 安全 分布式 vscode jellyfin nas fastapi mcp mcp-proxy mcp-inspector fastapi-mcp agent sse word图片自动上传 word一键转存 复制word图片 复制word图文 复制word公式 粘贴word图文 粘贴word公式 vue.js spring boot nginx jvm 虚拟机 英语 云原生 ip zotero WebDAV 同步失败 代理模式 科技 ai 人工智能 个人开发 redis 负载均衡 Dify 开发环境 android YOLO 网络结构图 kafka debian PVE 笔记 node.js gnu 数据库系统 c语言 DNS 深度学习 计算机视觉 卷积神经网络 USB转串口 CH340 后端 机器学习 adb mysql fstab 经验分享 tcp/ip ip协议 mcu 单片机 tomcat json ubuntu 18.04 安装教程 计算机外设 电脑 mac 软件需求 bug sublime text 编辑器 运维开发 qt stm32项目 stm32 nlp 宝塔面板访问不了 宝塔面板网站访问不了 宝塔面板怎么配置网站能访问 宝塔面板配置ip访问 宝塔面板配置域名访问教程 宝塔面板配置教程 微信 微信分享 鸿蒙 Image wxopensdk ide AI编程 驱动开发 集成学习 集成测试 HarmonyOS Next DevEco Studio ssh漏洞 ssh9.9p2 CVE-2025-23419 arm开发 架构 面试 C# MQTTS 双向认证 emqx 数据分析 大数据 spark hive kylin ollama llm matplotlib fonts-noto-cjk 部署 pip cron crontab日志 django unix 媒体 思科 websocket oracle fusion oracle中间件 rtsp服务器 rtsp server android rtsp服务 安卓rtsp服务器 移动端rtsp服务 大牛直播SDK pycharm C 环境变量 进程地址空间 学习 openvpn server openvpn配置教程 centos安装openvpn 学习方法 audio vue音乐播放器 vue播放音频文件 Audio音频播放器自定义样式 播放暂停进度条音量调节快进快退 自定义audio覆盖默认样式 c++ 并查集 leetcode react.js 前端面试题 持续部署 gitee udp 本地环回 bind jenkins 嵌入式 linux驱动开发 嵌入式硬件 https remote-ssh vnc Docker Hub docker pull 镜像源 daemon.json Linux windows 服务器安装 策略模式 自动化 spring eureka oceanbase 传统数据库升级 银行 智能路由器 外网访问 内网穿透 端口映射 Agent DeepSeek LLM CrewAI onlyoffice gateway Clion Nova ResharperC++引擎 Centos7 远程开发 efficientVIT YOLOv8替换主干网络 TOLOv8 opengl rust腐蚀 多线程 硬件工程 嵌入式实习 apache 性能优化 jdk intellij-idea 开源 Cline gcc centos 7 ui numpy SRS 流媒体 直播 asm QT 5.12.12 QT开发环境 Ubuntu18.04 GPU环境配置 Ubuntu22 CUDA PyTorch Anaconda安装 c# 高级IO epoll Hyper-V WinRM TrustedHosts vue3 HTML audio 控件组件 vue3 audio音乐播放器 Audio标签自定义样式默认 vue3播放音频文件音效音乐 自定义audio播放器样式 播放暂停调整声音大小下载文件 虚拟局域网 向日葵 spring cloud compose devops kubernetes svn golang powerpoint ddos dubbo bash VMware创建虚拟机 github AIGC 人工智能生成内容 多层架构 解耦 dify 低代码 爬虫 数据挖掘 网络用户购物行为分析可视化平台 大数据毕业设计 1024程序员节 创意 社区 数据结构 web安全 cpu 内存 实时 使用 Windsurf openstack VMware Xen KVM go Flask FastAPI Waitress Gunicorn uWSGI Uvicorn ESXi 串口服务器 WSL2 上安装 Ubuntu pytorch flutter 虚拟现实 程序人生 远程连接 rdp 实验 java-ee elasticsearch 私有化 本地部署 jar gradle 程序 编程 性能分析 vmware 卡死 ESP32 camera Arduino 电子信息 Alexnet 进程优先级 调度队列 进程切换 统信UOS 麒麟 bonding 链路聚合 lvm 磁盘挂载 磁盘分区 KylinV10 麒麟操作系统 Vmware milvus centos-root /dev/mapper yum clean all df -h / du -sh yum docker-compose docker compose uni-app tcpdump EtherCAT转Modbus ECT转Modbus协议 EtherCAT转485网关 ECT转Modbus串口网关 EtherCAT转485协议 ECT转Modbus网关 课程设计 cursor transformer 3d 数学建模 Dell R750XS etcd 数据安全 RBAC perf seatunnel 命名管道 客户端与服务端通信 iot 信息与通信 ros 机器人 话题通信 服务通信 华为云 温湿度数据上传到服务器 Arduino HTTP unity ue4 着色器 ue5 虚幻 dell服务器 JAVA Java 华为od 腾讯云 vue git pygame Cursor sql KingBase IPMI prometheus grafana 链表 进程信号 实时音视频 实时互动 kind AI 大模型应用 agi 系统 黑苹果 远程工作 目标检测 alias unalias 别名 ffmpeg 音视频 linux内核 vim http 迁移指南 权限 VMware安装Ubuntu Ubuntu安装k8s k8s 僵尸进程 virtualenv Hive环境搭建 hive3环境 Hive远程模式 postman 测试工具 outlook 错误代码2603 无网络连接 2603 vr windwos防火墙 defender防火墙 win防火墙白名单 防火墙白名单效果 防火墙只允许指定应用上网 防火墙允许指定上网其它禁止 rust GaN HEMT 氮化镓 单粒子烧毁 辐射损伤 辐照效应 rpc ip命令 新增网卡 新增IP 启动网卡 指令 sqlserver yolov5 ssl 小程序 微信小程序域名配置 微信小程序服务器域名 微信小程序合法域名 小程序配置业务域名 微信小程序需要域名吗 微信小程序添加域名 protobuf 序列化和反序列化 安装 前端框架 银河麒麟 kylin v10 麒麟 v10 html Linux的权限 Doris搭建 docker搭建Doris Doris搭建过程 linux搭建Doris Doris搭建详细步骤 Doris部署 浪潮信息 AI服务器 CPU 主板 电源 网卡 aws googlecloud 游戏程序 ios vSphere vCenter 软件定义数据中心 sddc LDAP filezilla 无法连接服务器 连接被服务器拒绝 vsftpd 331/530 webrtc HCIE 数通 WebUI DeepSeek V3 AI大模型 .netcore iftop 网络流量监控 log4j 多线程服务器 Linux网络编程 VMware安装mocOS macOS系统安装 区块链 网络药理学 生信 生物信息学 gromacs 分子动力学模拟 MD 动力学模拟 系统安全 MacOS录屏软件 jupyter xcode 产品经理 microsoft WSL2 Ubuntu22.04 虚拟化 开发人员主页 互信 Linux PID burp suite 抓包 axure 富文本编辑器 WLAN 像素流送api 像素流送UE4 像素流送卡顿 像素流送并发支持 rancher mount挂载磁盘 wrong fs type LVM挂载磁盘 Centos7.9 rabbitmq gpu算力 IM即时通讯 QQ 企业微信 剪切板对通 HTML FORMAT live555 rtsp rtp 大模型技术 本地部署大模型 maxkb ARG 监控k8s集群 集群内prometheus C语言 软件测试 鸿蒙系统 缓存 灵办AI 聚类 程序员创富 nvm ai小智 语音助手 ai小智配网 ai小智教程 智能硬件 esp32语音助手 diy语音助手 hadoop selete zabbix postgresql chatgpt 远程桌面 远程服务 大文件分片上传断点续传及进度条 如何批量上传超大文件并显示进度 axios大文件切片上传详细教 node服务器合并切片 vue3大文件上传报错提示错误 大文件秒传跨域报错cors 政务 分布式系统 监控运维 Prometheus Grafana ros2 moveit 机器人运动 Google pay Apple pay 压测 ECS 换源 国内源 Debian maven ssrf 失效的访问控制 ping++ CPU 使用率 系统监控工具 linux 命令 trae gpt-3 文心一言 环境配置 代码调试 ipdb vu大文件秒传跨域报错cors n8n dity make 磁盘清理 xrdp flask 源码剖析 rtsp实现步骤 流媒体开发 thingsboard 实战案例 序列化反序列化 C++ 主从复制 Docker引擎已经停止 Docker无法使用 WSL进度一直是0 镜像加速地址 export import save load 迁移镜像 系统架构 odoo 服务器动作 Server action 交互 MQTT协议 消息服务器 代码 视觉检测 safari Mac 基础环境 直播推流 sqlite3 docker搭建pg docker搭建pgsql pg授权 postgresql使用 postgresql搭建 .net 命令 P2P HDLC 一切皆文件 android studio 微信公众平台 GPU linux上传下载 arm ipython docker搭建nacos详解 docker部署nacos docker安装nacos 腾讯云搭建nacos centos7搭建nacos gitlab UEFI Legacy MBR GPT U盘安装操作系统 c/c++ 串口 springsecurity6 oauth2 授权服务器 前后端分离 list 模拟实现 MacMini 迷你主机 mini Apple Wi-Fi 王者荣耀 YOLOv8 NPU Atlas800 A300I pro asi_bench 智能手机 小艺 Pura X excel YOLOv12 css mybatis 多进程 wsl threejs 3D okhttp wps 安卓 SenseVoice 上传视频文件到服务器 uniApp本地上传视频并预览 uniapp移动端h5网页 uniapp微信小程序上传视频 uniapp app端视频上传 uniapp uview组件库 深度求索 私域 知识库 AI写作 GCC aarch64 编译安装 HPC 微服务 设计模式 软件工程 kali 共享文件夹 linux安装配置 rocketmq HP Anyware llama3 Chatglm 开源大模型 iBMC UltraISO windows日志 visual studio code 监控 自动化运维 ecmascript 树莓派 VNC deepseek-r1 大模型本地部署 华为证书 HarmonyOS认证 华为证书考试 域名服务 DHCP 符号链接 配置 玩游戏 腾讯云大模型知识引擎 express 报错 目标跟踪 OpenVINO 推理应用 glibc keepalived jmeter 压力测试 测试用例 功能测试 rag ragflow ragflow 源码启动 远程 执行 sshpass 操作 产测工具框架 IMX6ULL 管理框架 shell 磁盘监控 内网渗透 靶机渗透 iperf3 带宽测试 服务器配置 快捷键 旋转屏幕 自动操作 云原生开发 K8S k8s管理系统 Portainer搭建 Portainer使用 Portainer使用详解 Portainer详解 Portainer portainer 国产数据库 瀚高数据库 数据迁移 下载安装 开发 npm FunASR ASR cuda cudnn anaconda mamba Vmamba ansible playbook 剧本 file server http server web server 工具 Reactor shell脚本免交互 expect linux免交互 lio-sam SLAM 键盘 python2 ubuntu24.04 OpenManus vite 镜像下载 freebsd 大屏端 博客 HiCar CarLife+ CarPlay QT RK3588 CLion IDE ubuntu20.04 ros1 Noetic 20.04 apt 安装 TCP WebServer 嵌入式系统开发 微信小程序 程序员 Linux无人智慧超市 LInux多线程服务器 QT项目 LInux项目 单片机项目 UOS 统信操作系统 生活 rc.local 开机自启 systemd 游戏引擎 深度优先 图论 并集查找 换根法 树上倍增 NAS Termux Samba SSH redhat p2p pdf firewalld 读写锁 大模型入门 计算生物学 生物信息 基因组 mock mock server 模拟服务器 mock服务器 Postman内置变量 Postman随机数据 linux 命令 sed 命令 安卓模拟器 大模型微调 mongodb 自动化任务管理 开机自启动 ruoyi 混合开发 环境安装 JDK IIS服务器 IIS性能 日志监控 react next.js 部署next.js 飞牛nas fnos 本地化部署 命令行 基础入门 矩阵 高效I/O springcloud 华为认证 交换机 DevOps 软件交付 数据驱动 应用场景 京东云 其他 银河麒麟服务器操作系统 系统激活 蓝耘科技 元生代平台工作流 ComfyUI flash-attention 网易邮箱大师 chrome 浏览器下载 chrome 下载安装 谷歌浏览器下载 硬件架构 计算机 工业4.0 qps 高并发 hibernate pillow 客户端 mq miniapp 真机调试 调试 debug 断点 网络API请求调试方法 AI-native Docker Desktop 宝塔面板 同步 备份 建站 安全威胁分析 tcp WSL win11 无法解析服务器的名称或地址 eclipse 图像处理 回显服务器 UDP的API使用 微信开放平台 微信公众号配置 Ubuntu Server Ubuntu 22.04.5 豆瓣 追剧助手 迅雷 防火墙 端口号 开放端口 访问列表 ebpf uprobe openEuler 飞牛NAS 飞牛OS MacBook Pro harmonyOS面试题 webstorm ROS2 办公自动化 自动化生成 pdf教程 高德地图 鸿蒙接入高德地图 HarmonyOS5.0 ftp ollama下载加速 NFS 恒源云 html5 firefox Linux24.04 deepin springboot Ubuntu DeepSeek DeepSeek Ubuntu DeepSeek 本地部署 DeepSeek 知识库 DeepSeek 私有化知识库 本地部署 DeepSeek DeepSeek 私有化部署 设置代理 实用教程 大模型部署 minicom 串口调试工具 离线部署dify 强制清理 强制删除 mac废纸篓 dns GameFramework HybridCLR Unity编辑器扩展 自动化工具 open webui 数据集 开机黑屏 pyautogui zip unzip xml intellij idea Ark-TS语言 FTP 服务器 code-server Linux 维护模式 软件构建 gpt 虚拟显示器 远程控制 edge浏览器 EtherNet/IP串口网关 EIP转RS485 EIP转Modbus EtherNet/IP网关协议 EIP转RS485网关 EIP串口服务器 mariadb fd 文件描述符 Xinference RAGFlow echarts 信息可视化 网页设计 c 重启 排查 系统重启 日志 原因 kamailio sip VoIP 大数据平台 TrueLicense 串口驱动 CH341 uart 485 Trae AI 原生集成开发环境 Trae AI Carla 智能驾驶 Java Applet URL操作 服务器建立 Socket编程 网络文件读取 大模型教程 文件系统 路径解析 Ubuntu共享文件夹 共享目录 Linux共享文件夹 视频编解码 selenium Kylin-Server 国产操作系统 服务器安装 系统开发 binder 车载系统 framework 源码环境 rustdesk RAGFLOW database web3.py Chatbox 自动化编程 搜索引擎 pyqt frp 监控k8s 监控kubernetes ux OD机试真题 华为OD机试真题 服务器能耗统计 服务器主板 AI芯片 adobe 大语言模型 LLMs 通信工程 毕业 Mermaid 可视化图表 Python 网络编程 聊天服务器 套接字 Socket 智能音箱 智能家居 wireshark 显示过滤器 ICMP Wireshark安装 opcua opcda KEPServer安装 oneapi linux环境变量 bcompare Beyond Compare rime dash 正则表达式 中间件 iis WebVM 云服务 安防软件 流水线 脚本式流水线 ci/cd ufw CentOS Stream CentOS 无人机 银河麒麟操作系统 国产化 burpsuite 安全工具 mac安全工具 burp安装教程 渗透工具 毕设 远程看看 远程协助 visualstudio nftables 云桌面 微软 AD域控 证书服务器 5G 3GPP 卫星通信 IO 中兴光猫 换光猫 网络桥接 自己换光猫 浏览器自动化 TRAE 三级等保 服务器审计日志备份 notepad Invalid Host allowedHosts 单元测试 Kali Linux 黑客 渗透测试 信息收集 tar fpga开发 图形化界面 docker run 数据卷挂载 交互模式 Redis Desktop kvm api 隐藏文件 隐藏目录 管理器 通配符 openwrt DigitalOcean GPU服务器购买 GPU服务器哪里有 GPU服务器 磁盘 空间 查错 ceph less matlab 网络攻击模型 云电竞 云电脑 todesk scikit-learn 具身智能 强化学习 小番茄C盘清理 便捷易用C盘清理工具 小番茄C盘清理的优势尽显何处? 教你深度体验小番茄C盘清理 C盘变红?!不知所措? C盘瘦身后电脑会发生什么变化? 网工 rclone AList webdav fnOS wsl2 实时内核 跨平台 string模拟实现 深拷贝 浅拷贝 经典的string类问题 三个swap 交叉编译 kotlin iphone tensorflow Unity Dedicated Server Host Client 无头主机 SSL证书 数据库架构 数据管理 数据治理 数据编织 数据虚拟化 elk 7z crosstool-ng Claude vmamba eNSP 网络规划 VLAN 企业网络 kernel 显卡驱动 AnythingLLM AnythingLLM安装 vue-i18n 国际化多语言 vue2中英文切换详细教程 如何动态加载i18n语言包 把语言json放到服务器调用 前端调用api获取语言配置文件 消息队列 智慧农业 开源鸿蒙 团队开发 Kali Linux的基础指令 Apache Beam 批流统一 案例展示 数据分区 容错机制 网页服务器 web服务器 Nginx MCP server C/S telnet 远程登录 db 历史版本 下载 容器技术 k8s资源监控 annotations自动化 自动化监控 监控service 监控jvm Linux Vim su sudo sudo原理 su切换 etl Ubuntu 24.04.1 轻量级服务器 职场和发展 ROS 自动驾驶 ajax netlink libnl3 H3C grep NPS 雨云服务器 雨云 单例模式 能力提升 面试宝典 技术 IT信息化 Linux权限 权限命令 特殊权限 环境迁移 显示器 崖山数据库 YashanDB 沙盒 拓扑图 Windows nvidia MAC SecureCRT langchain deep learning top Linux top top命令详解 top命令重点 top常用参数 can 线程池 es 分析解读 VMware Tools vmware tools安装 vmwaretools安装步骤 vmwaretools安装失败 vmware tool安装步骤 vm tools安装步骤 vm tools安装后不能拖 vmware tools安装步骤 机柜 1U 2U 高效日志打印 串口通信日志 服务器日志 系统状态监控日志 异常记录日志 ftp服务 文件上传 ruby 相差8小时 UTC 时间 线程 cfssl netty Qualcomm WoS QNN AppBuilder 统信 信创 信创终端 中科方德 无桌面 nac 802.1 portal gitea 智能电视 risc-v 健康医疗 互联网医院 双系统 GRUB引导 Linux技巧 springboot远程调试 java项目远程debug docker远程debug java项目远程调试 springboot远程 vpn Playwright 自动化测试 状态管理的 UDP 服务器 Arduino RTOS 个人博客 工具分享 iNode Macos ssh远程登录 信号 RAID RAID技术 存储 云耀服务器 支付 微信支付 开放平台 ArkTs ArkUI uv 宠物 毕业设计 免费学习 宠物领养 宠物平台 web 技能大赛 软链接 硬链接 React Next.js 开源框架 联想开天P90Z装win10 用户缓冲区 ELF加载 宕机切换 服务器宕机 cocoapods AI代码编辑器 蓝桥杯 lb 协议 执法记录仪 智能安全帽 smarteye 硬件 设备 PCI-Express SysBench 基准测试 yaml Ultralytics 可视化 服务器时间 ecm bpm xfce perl Mac内存不够用怎么办 yolov8 cmake OpenSSH 游戏服务器 Minecraft Ubuntu 22.04 MySql 算家云 算力租赁 DOIT 四博智联 渗透 桌面环境 数码 联机 僵尸毁灭工程 游戏联机 开服 VR手套 数据手套 动捕手套 动捕数据手套 chromium dpi minio idm 版本 rnn es6 qt6.3 g726 输入法 网络爬虫 av1 电视盒子 机顶盒ROM 魔百盒刷机 diskgenius jina 笔灵AI AI工具 iDRAC R720xd ArkTS 移动端开发 powerbi 金融 CosyVoice DBeaver 数据仓库 kerberos fork wait waitpid exit 开源软件 Cookie 服务器无法访问 ip地址无法访问 无法访问宝塔面板 宝塔面板打不开 dba composer XFS xfs文件系统损坏 I_O error sonoma 自动更新 vasp安装 MDK 嵌入式开发工具 论文笔记 xshell termius iterm2 PX4 MAVROS 四旋翼无人机 k8s二次开发 集群管理 neo4j 数据库开发 trea idea 日志分析 系统取证 iventoy VmWare OpenEuler uni-file-picker 拍摄从相册选择 uni.uploadFile H5上传图片 微信小程序上传图片 beautifulsoup ArcTS 登录 ArcUI GridItem arkUI VPN wireguard muduo X11 Xming chrome devtools chromedriver 宝塔 硅基流动 ChatBox 技术共享 AP配网 AK配网 小程序AP配网和AK配网教程 WIFI设备配网小程序UDP开 EMQX MQTT 通信协议 软负载 内核 HarmonyOS OpenHarmony Node-Red 编程工具 流编程 Xshell curl wget jetty undertow ubuntu24.04.1 代理服务器 Docker Compose grub 版本升级 扩容 NLP模型 NLP csrutil mac恢复模式进入方法 SIP 恢复模式 自学笔记 小米 澎湃OS Android prompt 语音识别 安装MySQL Xterminal stable diffusion AI作画 端口 查看 ss 图形渲染 工作流 workflow Erlang OTP gen_server 热代码交换 事务语义 图片增强 增强数据 小游戏 五子棋 MNN Qwen sdkman sequoiaDB Linux awk awk函数 awk结构 awk内置变量 awk参数 awk脚本 awk详解 可信计算技术 安全架构 r语言 fast SWAT 配置文件 服务管理 网络共享 HTTP 服务器控制 ESP32 DeepSeek gaussdb llama.cpp Reactor反应堆 DeepSeek行业应用 Heroku 网站部署 Dell HPE 联想 浪潮 prometheus数据采集 prometheus数据模型 prometheus特点 IPv4 子网掩码 公网IP 私有IP SSH 密钥生成 SSH 公钥 私钥 生成 相机 游戏机 conda配置 conda镜像源 hugo Netty 即时通信 NIO 多产物 思科模拟器 Cisco 服务器扩容没有扩容成功 x64 SIGSEGV SSE xmm0 稳定性 看门狗 nuxt3 mysql离线安装 ubuntu22.04 mysql8.0 k8s部署 MySQL8.0 高可用集群(1主2从) ShenTong Typore 源码 asp.net大文件上传 asp.net大文件上传源码 ASP.NET断点续传 asp.net上传文件夹 asp.net上传大文件 .net core断点续传 .net mvc断点续传 easyui 聊天室 网络文件系统 ocr micropython esp32 mqtt Docker快速入门 视频平台 录像 视频转发 性能测试 视频流 数据可视化 算力 授时服务 北斗授时 服务器管理 配置教程 网站管理 webgl yum源切换 更换国内yum源 bot Docker TCP服务器 qt项目 qt项目实战 qt教程 考研 在线office MS Materials 群晖 飞牛 国标28181 视频监控 监控接入 语音广播 流程 SDP 代理 银河麒麟高级服务器 外接硬盘 Kylin UOS1070e DeepSeek r1 Open WebUI clickhouse 社交电子 Tabs组件 TabContent TabBar TabsController 导航页签栏 滚动导航栏 华为机试 高效远程协作 TrustViewer体验 跨设备操作便利 智能远程控制 umeditor粘贴word ueditor粘贴word ueditor复制word ueditor上传word图片 ueditor导入word ueditor导入pdf ueditor导入ppt 玩机技巧 软件分享 软件图标 自定义客户端 SAS 宝塔面板无法访问 边缘计算 SEO 论文阅读 chfs ubuntu 16.04 漏洞 显示管理器 lightdm gdm 免费域名 域名解析 框架搭建 vscode 1.86 网站搭建 serv00 热榜 服务器部署 本地拉取打包 qt5 客户端开发 直流充电桩 充电桩 lighttpd安装 Ubuntu配置 Windows安装 服务器优化 升级 CVE-2024-7347 bat 服务器繁忙 nacos 弹性计算 云服务器 裸金属服务器 弹性裸金属服务器 banner 跨域 CNNs 图像分类 unity3d visual studio cnn RustDesk自建服务器 rustdesk服务器 docker rustdesk 网络穿透 邮件APP 免费软件 火绒安全 Nuxt.js uniapp 备选 网站 调用 示例 毕昇JDK Mac软件 小智 致远OA OA服务器 服务器磁盘扩容 Web服务器 多线程下载工具 PYTHON arcgis 上传视频至服务器代码 vue3批量上传多个视频并预览 如何实现将本地视频上传到网页 element plu视频上传 ant design vue vue3本地上传视频及预览移除 ShapeFile GeoJSON CORS 昇腾 大模型训练/推理 推理问题 mindie AutoDL 半虚拟化 硬件虚拟化 Hypervisor Web应用服务器 ollama api ollama外网访问 SSH 服务 SSH Server OpenSSH Server mosquitto HistoryServer Spark YARN jobhistory cmos qemu libvirt make命令 makefile文件 sqlite pgpool openssl 密码学 VSCode 业界资讯 鲲鹏 端口测试 模拟退火算法 田俊楠 推荐算法 .net core wsgiref Web 服务器网关接口 GoogLeNet 联网 easyconnect 代码托管服务 远程过程调用 Windows环境 电视剧收视率分析与可视化平台 cd 目录切换 镜像 AISphereButler HarmonyOS NEXT 原生鸿蒙 信号处理 ukui 麒麟kylinos openeuler ubuntu24 vivado24 W5500 OLED u8g2 虚拟机安装 apt docker命令大全 java-rocketmq 做raid 装系统 BMC Jellyfin 虚幻引擎 virtualbox pyicu DocFlow v10 软件 xpath定位元素 k8s集群资源管理 h.264 env 变量 Attention VPS 怎么卸载MySQL MySQL怎么卸载干净 MySQL卸载重新安装教程 MySQL5.7卸载 Linux卸载MySQL8.0 如何卸载MySQL教程 MySQL卸载与安装 孤岛惊魂4 WebRTC 蓝牙 samba Helm k8s集群 RAG 检索增强生成 文档解析 大模型垂直应用 npu lsb_release /etc/issue /proc/version uname -r 查看ubuntu版本 RoboVLM 通用机器人策略 VLA设计哲学 vlm fot robot 视觉语言动作模型 大版本升 升级Ubuntu系统 open Euler dde Isaac Sim 虚拟仿真 RTMP 应用层 本地部署AI大模型 华为OD 可以组成网络的服务器 LInux big data opensearch helm 飞书 软件卸载 系统清理 MI300x 模拟器 教程 全文检索 图搜索算法 实习 TrinityCore 魔兽世界 sysctl.conf vm.nr_hugepages sublime text3 大模型面经 大模型学习 单一职责原则 医疗APP开发 app开发 IPMITOOL 硬件管理 copilot Office python3.11 DIFY searxng PPI String Cytoscape CytoHubba XCC Lenovo asp.net大文件上传下载 文件分享 繁忙 解决办法 替代网站 汇总推荐 AI推理 移动云 CDN token sas scapy nfs 服务器部署ai模型 IIS Hosting Bundle .NET Framework vs2022 SSL 域名 skynet rsyslog Anolis nginx安装 linux插件下载 firewall 代码规范 Zoertier 内网组网 saltstack 服务器数据恢复 数据恢复 存储数据恢复 raid5数据恢复 磁盘阵列数据恢复 金仓数据库 2025 征文 数据库平替用金仓 embedding 大大通 第三代半导体 碳化硅 匿名管道 进程程序替换 execl函数 execv函数 execvp函数 execvpe函数 putenv函数 LORA FTP服务器 浏览器开发 AI浏览器 EasyConnect 内网环境 bootstrap nextjs reactjs 冯诺依曼体系 黑客技术 流式接口 URL 反向代理 性能调优 安全代理 本地知识库部署 DeepSeek R1 模型 resolv.conf gunicorn 元服务 应用上架 cpp-httplib Python基础 Python教程 Python技巧 充电桩平台 充电桩开源平台 proxy模式 nohup后台启动 zerotier 进程间通信 Echarts图表 折线图 柱状图 异步动态数据 鸿蒙开发 可视化效果 mysql安装报错 windows拒绝安装 deekseek docker desktop tidb GLIBC 锁屏不生效 NFC 近场通讯 智能门锁 EVE-NG word sentinel 搭建个人相关服务器 多路转接 输入系统 midjourney iTerm2 终端 termux 环境搭建 openjdk IO模型 佛山戴尔服务器维修 佛山三水服务器维修 swoole USB网络共享 wordpress 无法访问wordpess后台 打开网站页面错乱 linux宝塔面板 wordpress更换服务器 laravel 加解密 Yakit yaklang 干货分享 黑客工具 密码爆破 项目部署 MacOS 我的世界 我的世界联机 glm4 IDEA Linux环境 录音麦克风权限判断检测 录音功能 录音文件mp3播放 小程序实现录音及播放功能 RecorderManager 解决录音报错播放没声音问题 tailscale derp derper 中转 新盘添加 partedUtil triton 模型分析 dock 加速 GRE 线性代数 电商平台 阻塞队列 生产者消费者模型 服务器崩坏原因 C++软件实战问题排查经验分享 0xfeeefeee 0xcdcdcdcd 动态库加载失败 程序启动失败 程序运行权限 标准用户权限与管理员权限 linuxdeployqt 打包部署程序 appimagetool deployment daemonset statefulset cronjob 欧标 OCPP 软件开发 信任链 lua 音乐服务器 Navidrome 音流 ECT转485串口服务器 ECT转Modbus485协议 ECT转Modbus串口服务器 我的世界服务器搭建 minecraft 音乐库 pppoe radius webview IMX317 MIPI H265 VCU TCP协议 计算机科学与技术 底层实现 seleium 对比 meld DiffMerge 端口聚合 windows11 服务网格 istio 达梦 DM8 蓝桥杯C++组 js Radius macbook Logstash 日志采集 IP配置 netplan AimRT Qwen2.5-VL vllm 物联网开发 终端工具 远程工具 Spring Security 合成模型 扩散模型 图像生成 System V共享内存 进程通信 ISO镜像作为本地源 游戏开发 负载测试 css3 image 移动开发 massa sui aptos sei 网络建设与运维 MobaXterm 文件传输 语法 llamafactory 微调 Claude Desktop Claude MCP Windows Cli MCP 磁盘镜像 服务器镜像 服务器实时复制 实时文件备份 电脑桌面出现linux图标 电脑桌面linux图标删除不了 电脑桌面Liunx图标删不掉 linux图标删不掉 大模型推理 备份SQL Server数据库 数据库备份 傲梅企业备份网络版 AI Agent 字节智能运维 内存管理 极限编程 捆绑 链接 谷歌浏览器 youtube google gmail AI员工 dns是什么 如何设置电脑dns dns应该如何设置 银河麒麟桌面操作系统 Kylin OS xss 在线预览 xlsx xls文件 在浏览器直接打开解析xls表格 前端实现vue3打开excel 文件地址url或接口文档流二进 显卡驱动持久化 GPU持久化 autodl AD域 win服务器架设 windows server docker部署翻译组件 docker部署deepl docker搭建deepl java对接deepl 翻译组件使用 kubeless nohup 异步执行 WireGuard 异地组网 分布式训练 regedit 开机启动 rpa AI agent arkTs 状态模式 Linux find grep 钉钉 查看显卡进程 fuser 打不开xxx软件 无法检查其是否包含恶意软件 ArtTS IPv6 IPv6测试 IPv6测速 IPv6检测 IPv6查询 GeneCards OMIM TTD 分子对接 autodock mgltools PDB PubChem VS Code 根服务器 AzureDataStudio whistle 抓包工具 计算虚拟化 弹性裸金属 autoware g++ g++13 junit hexo 小智AI服务端 xiaozhi TTS AD 域管理 nosql armbian u-boot 7-zip 需求分析 规格说明书 移动魔百盒 李心怡 deepseak 豆包 KIMI 腾讯元宝 内网服务器 内网代理 内网通信 docker部署Python mm-wiki搭建 linux搭建mm-wiki mm-wiki搭建与使用 mm-wiki使用 mm-wiki详解 管道 vscode1.86 1.86版本 ssh远程连接 网络原理 LLM Web APP Streamlit 影刀 #影刀RPA# deepseek r1 hosts 企业网络规划 华为eNSP 弹性服务器 查询数据库服务IP地址 SQL Server 运维监控 行情服务器 股票交易 速度慢 切换 股票量化接口 股票API接口 DenseNet figma 智能合约 哈希算法 wpf LVM lvresize 磁盘扩容 pvcreate SystemV 增强现实 沉浸式体验 技术实现 案例分析 AR 考试 flink WINCC 电路仿真 multisim 硬件工程师 硬件工程师学习 电路图 电路分析 仪器仪表 pyside6 界面 服务器ssl异常解决 retry 重试机制 navicat 存储维护 NetApp存储 EMC存储 VM搭建win2012 win2012应急响应靶机搭建 攻击者获取服务器权限 上传wakaung病毒 应急响应并溯源 挖矿病毒处置 应急响应综合性靶场 安全漏洞 信息安全 知识图谱 脚本 Pyppeteer Sealos 项目部署到linux服务器 项目部署过程 超融合 烟花代码 烟花 元旦 web3 Ardupilot fiddler servlet ranger MySQL8.0 网卡的名称修改 eth0 ens33 Ubuntu 24 常用命令 Ubuntu 24 Ubuntu vi 异常处理 免密 公钥 私钥 NAT转发 NAT Server Maven 子系统 北亚数据恢复 oracle数据恢复 网络搭建 神州数码 神州数码云平台 云平台 react native IMM 常用命令 文本命令 目录命令 Headless Linux initramfs Linux内核 Grub 程序化交易 量化交易 高频交易 mcp服务器 client close EMUI 回退 降级 zookeeper 嵌入式Linux IPC 僵尸世界大战 游戏服务器搭建 抗锯齿 问题解决 GIS 遥感 WebGIS 分布式账本 共识算法 ai工具 阿里云ECS 多端开发 智慧分发 应用生态 鸿蒙OS ldap yashandb 多个客户端访问 IO多路复用 TCP相关API MVS 海康威视相机 Ubuntu20.04 2.35 架构与原理 免费 pthread 风扇控制软件 智能体 autogen openai coze 框架 跨域请求 设计规范 ubuntu安装 linux入门小白 流量运营 java-zookeeper 设备树 Unity插件 数字证书 签署证书 archlinux kde plasma SVN Server tortoise svn c/s 智能体开发 Bug解决 Qt platform OpenCV 带外管理 接口优化 mac设置host 服务器正确解析请求体 CUPS 打印机 Qt5 localhost 券商 股票交易接口api 类型 特点 用户管理 solidworks安装 金仓数据库概述 金仓数据库的产品优化提案 NVM Node Yarn PM2 HAProxy 解决方案 机械臂 GPU训练 rtc 区块链项目 macOS PyQt PySide6 飞腾处理器 粘包问题 IPv4/IPv6双栈 双栈技术 网路规划设计 ensp综合实验 IPv4过渡IPv6 IPv4与IPv6 桌面快捷方式 NVML nvidia-smi ABAP 配置原理 ardunio BLE 搜狗输入法 中文输入法 西门子PLC 通讯 零售 yum换源 动态规划 VGG网络 卷积层 池化层 Python 视频爬取教程 Python 视频爬取 Python 视频教程 postgres Dify重启后重新初始化 动静态库 UDP 文件存储服务器组件 logstash hdc 商用密码产品体系 mybase mvc Alist mount 挂载 网盘 源代码管理 鸿蒙NEXT RDP post.io 企业邮箱 搭建邮箱 brew element-ui 上传视频并预览视频 vue上传本地视频及进度条功能 vue2选择视频上传到服务器 upload上传视频组件插件 批量上传视频 限制单个上传视频 Webserver 异步 三次握手 星河版 海康 物理地址 页表 虚拟地址 源代码 Qt QModbus client-go 支持向量机 命令模式 linux子系统 忘记密码 MinIO chatbox solr 计算机学习路线 编程语言选择 向量数据库 安装部署 milvus安装 #STC8 #STM32 node 软考设计师 中级设计师 SQL 软件设计师 可用性测试 CAD瓦片化 栅格瓦片 矢量瓦片 Web可视化 DWG解析 金字塔模型 comfyui comfyui教程 UFW Qwen3 qwen3 32b 华为昇腾910b3 静态IP