招聘网站开发的目的与意义,php做的网站 订单系统,青海住房和建设厅网站,网络科技公司实习周记✨✨ 欢迎大家来到景天科技苑✨✨
#x1f388;#x1f388; 养成好习惯#xff0c;先赞后看哦~#x1f388;#x1f388; #x1f3c6; 作者简介#xff1a;景天科技苑 #x1f3c6;《头衔》#xff1a;大厂架构师#xff0c;华为云开发者社区专家博主#xff0c;…
✨✨ 欢迎大家来到景天科技苑✨✨ 养成好习惯先赞后看哦~ 作者简介景天科技苑 《头衔》大厂架构师华为云开发者社区专家博主阿里云开发者社区专家博主CSDN全栈领域优质创作者掘金优秀博主51CTO博客专家等。 《博客》Python全栈Golang开发云原生开发PyQt5和Tkinter桌面开发小程序开发人工智能js逆向App逆向网络系统安全数据分析Djangofastapiflask等框架云原生K8Slinuxshell脚本等实操经验网站搭建数据库等分享。 所属的专栏云原生开发 景天的主页景天科技苑 文章目录 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-golatest这将安装最新版本的client-go。此外你还需要安装一些相关的依赖库例如apimachinery用于处理Kubernetes API对象。
go get k8s.io/apimachinerylatest安装完还需要运行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 mainimport (contextfmtmetav1 k8s.io/apimachinery/pkg/apis/meta/v1k8s.io/client-go/kubernetesk8s.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 clientsetclientset, 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\n, len(pods.Items))// 获取指定名称空间下的pod数量如果namespace不传值默认查的是所有命名空间下的podnamespace : h5-webpods, 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\n, 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 mainimport (contextfmtmetav1 k8s.io/apimachinery/pkg/apis/meta/v1k8s.io/client-go/kubernetesk8s.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 clientsetclientset, 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\n, len(pods.Items))// 获取指定名称空间下的pod数量如果namespace不传值默认查的是所有命名空间下的podnamespace : h5-webpods, 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\n, namespace, len(pods.Items))//看下返回的pod是什么fmt.Println(pods是什么:, pods)//获取到某个podfmt.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\n, i.Namespace, i.Name)
}//查询没有名称空间限制的资源,比如名称空间工作节点clusterroleclusterrolebinding等
//查的都是集群的资源
//比如我们查询集群有多少个名称空间
ns, _ : clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})
fmt.Printf(There are %d namespaces in the cluster\n, len(ns.Items))完整代码
package mainimport (contextfmtmetav1 k8s.io/apimachinery/pkg/apis/meta/v1k8s.io/client-go/kubernetesk8s.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 clientsetclientset, 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\n, 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\n, 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\n, i.Namespace, i.Name)}//查询没有名称空间限制的资源,比如名称空间工作节点clusterroleclusterrolebinding等//查的都是集群的资源//比如我们查询集群有多少个名称空间ns, _ : clientset.CoreV1().Namespaces().List(context.TODO(), metav1.ListOptions{})fmt.Printf(There are %d namespaces in the cluster\n, 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 mainimport (contextfmtmetav1 k8s.io/apimachinery/pkg/apis/meta/v1k8s.io/client-go/kubernetesk8s.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 clientsetclientset, 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\n, 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\n, 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 mainimport (contextfmtmetav1 k8s.io/apimachinery/pkg/apis/meta/v1k8s.io/client-go/kubernetesk8s.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 clientsetclientset, 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\n, service.Spec.Ports[0].NodePort)// 修改端口号// service-node-port-range 默认可以设置的范围 30000-32767service.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\n, 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 --imagenginx --dry-runclient -oyaml它会导出一份yaml文件
package mainimport (contextfmtdeployv1 k8s.io/api/apps/v1corev1 k8s.io/api/core/v1metav1 k8s.io/apimachinery/pkg/apis/meta/v1k8s.io/client-go/kubernetesk8s.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 clientsetclientset, err : kubernetes.NewForConfig(config)//这个客户端工具如果生成失败的话后面的操作也无法完成所以这里也报panic即可if err ! nil {panic(err.Error())}//3. 操作集群//创建deploymentvar deploy deployv1.Deployment//给deployment传参要把必须传的参数都传进去不然创建会报错deploy.Name mydeploydeploy.Namespace test1//副本数replicas : int32(1)deploy.Spec.Replicas replicas//mathlabelslabels : make(map[string]string)labels[app] nginx//Selector 是个指针类型需要先初始化//Selector *metav1.LabelSelector json:selector protobuf:bytes,2,opt,nameselectordeploy.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,nametemplate// 此时的labels要和selector的labels一样否则deployment就无法管理到poddeploy.Spec.Template.ObjectMeta.Labels labels//创建容器,容器是个切片可以创建多个容器var containers []corev1.Containervar container corev1.Containercontainer.Name nginxcontainer.Image nginx:1.7.9containers append(containers, container)container.Name rediscontainer.Image redis:6-alpinecontainers append(containers, container)deploy.Spec.Template.Spec.Containers containers_, err clientset.AppsV1().Deployments(test1).Create(context.TODO(), deploy, metav1.CreateOptions{})}查看创建的deploy
查看yaml文件两个容器都创建成功
[rootmaster01 svc ]#kubectl get deploy -n test1 -oyaml
apiVersion: v1
items:
- apiVersion: apps/v1kind: Deploymentmetadata:annotations:deployment.kubernetes.io/revision: 1creationTimestamp: 2024-11-05T09:58:43Zgeneration: 1labels:app: nginxname: mydeploynamespace: test1resourceVersion: 1079640uid: 8df3654a-71c6-45d5-888d-6329ed81dad7spec:progressDeadlineSeconds: 600replicas: 1revisionHistoryLimit: 10selector:matchLabels:app: nginxstrategy:rollingUpdate:maxSurge: 25%maxUnavailable: 25%type: RollingUpdatetemplate:metadata:creationTimestamp: nulllabels:app: nginxspec:containers:- image: nginx:1.7.9imagePullPolicy: IfNotPresentname: nginxresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: File- image: redis:6-alpineimagePullPolicy: IfNotPresentname: redisresources: {}terminationMessagePath: /dev/termination-logterminationMessagePolicy: FilednsPolicy: ClusterFirstrestartPolicy: AlwaysschedulerName: default-schedulersecurityContext: {}terminationGracePeriodSeconds: 30status:conditions:- lastTransitionTime: 2024-11-05T09:58:43ZlastUpdateTime: 2024-11-05T09:58:43Zmessage: Deployment does not have minimum availability.reason: MinimumReplicasUnavailablestatus: Falsetype: Available- lastTransitionTime: 2024-11-05T09:58:43ZlastUpdateTime: 2024-11-05T09:58:43Zmessage: ReplicaSet mydeploy-68dcc7d46d is progressing.reason: ReplicaSetUpdatedstatus: Truetype: ProgressingobservedGeneration: 1replicas: 1unavailableReplicas: 1updatedReplicas: 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 --imageredis --dry-runclient -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 mainimport (contextencoding/jsonfmtdeployv1 k8s.io/api/apps/v1metav1 k8s.io/apimachinery/pkg/apis/meta/v1k8s.io/client-go/kubernetesk8s.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 clientsetclientset, 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) errorerr 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开发效率。