clinet-go 操作deployment
项目地址: https://github.com/zhang19523zhao/zhgolang
写了一些常用的用法、分别为对deployment的创建、删除、更新、获取信息的操作,下面直接上代码。
zhanghao@zhanghaodeMacBook-Air Demo2 % tree
.
├── client
│ └── clientsetInit.go
├── deployments
│ ├── CreateDeploymentYaml.go
│ ├── DeleteDeployment.go
│ ├── ListDeploymentInfo.go
│ └── UpdateDeployment.go
├── etc
│ └── kube.conf
├── go.mod
├── go.sum
├── main.go
└── yamls
└── nginx.yaml
Client
clientsetInit.go
package client
import (
"fmt"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/tools/clientcmd"
"log"
)
// 定义全局变量输K8sClientset
var K8sClientset *kubernetes.Clientset
func init() {
configPath := "etc/kube.conf"
config, err := clientcmd.BuildConfigFromFlags("", configPath)
if err != nil {
fmt.Println(err)
}
K8sClientset, err = kubernetes.NewForConfig(config)
if err != nil {
log.Fatal(err)
}
}
deployments
CreateDeploymentYaml.go
package deployments
import (
"context"
"encoding/json"
appv1 "k8s.io/api/apps/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"os"
"sigs.k8s.io/yaml"
)
type CreateDplForYaml struct {
clientset *kubernetes.Clientset
}
func (this *CreateDplForYaml) CreateDep(yamlPath string) error {
ctx := context.Background()
Dep := &appv1.Deployment{}
// 读取yaml内容
b, err := os.ReadFile(yamlPath)
if err != nil {
return err
}
// 将yaml 转化成 josn
depJson, err := yaml.YAMLToJSON(b)
if err != nil {
return err
}
// 将json 绑定到Dep上
if err := json.Unmarshal(depJson, Dep); err != nil {
return err
}
if _, err := this.clientset.AppsV1().Deployments("default").Create(ctx, Dep, metav1.CreateOptions{}); err != nil {
return err
}
return nil
}
func NewCreateDplForYaml(clientset *kubernetes.Clientset) *CreateDplForYaml {
return &CreateDplForYaml{
clientset: clientset,
}
}
DeleteDeployment.go
package deployments
import (
"context"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
)
type DeleteDep struct {
clientset *kubernetes.Clientset
}
func NewDeleteDep(clientset *kubernetes.Clientset) *DeleteDep {
return &DeleteDep{
clientset: clientset,
}
}
// 删除Deployment
func (this *DeleteDep) Delete(dploymentName string) error {
return this.clientset.AppsV1().Deployments("default").Delete(context.Background(), dploymentName, metav1.DeleteOptions{})
}
ListDeploymentInfo.go
package deployments
import (
"context"
"fmt"
appv1 "k8s.io/api/apps/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
)
type ListDplInfo struct {
clientset *kubernetes.Clientset
}
func NewListDplInfo(clientset *kubernetes.Clientset) *ListDplInfo {
return &ListDplInfo{
clientset: clientset,
}
}
func (this *ListDplInfo) GetDep() *appv1.DeploymentList {
ctx := context.Background()
listopt := metav1.ListOptions{}
deploymentList, err := this.clientset.AppsV1().Deployments("default").List(ctx, listopt)
if err != nil {
fmt.Println(err)
}
return deploymentList
}
// 打印出deployment 名字
func (this *ListDplInfo) Name() {
depList := this.GetDep()
// 遍历获取deployment 名字
for _, deployment := range depList.Items {
fmt.Println(deployment.Name)
}
}
// 打印出 deployment 副本数
func (this *ListDplInfo) Replicas() {
depList := this.GetDep()
// 遍历获取deployment 名字
for _, deployment := range depList.Items {
fmt.Println(deployment.Name,
deployment.Status.Replicas, // 总副本数
deployment.Status.AvailableReplicas, // 可用副本数
deployment.Status.UnavailableReplicas, // 不可用副本数
)
}
}
UpdateDeployment.go
package deployments
import (
"context"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
)
type UpdateDep struct {
clientset *kubernetes.Clientset
}
func NewUpdateDep(clientset *kubernetes.Clientset) *UpdateDep {
return &UpdateDep{
clientset: clientset,
}
}
// 这里修改Replicas 副本数为例
func (this *UpdateDep) UpdateReplicas(depName string, num int32) error {
ctx := context.Background()
dep, err := this.clientset.AppsV1().Deployments("default").Get(ctx, depName, metav1.GetOptions{})
if err != nil {
return err
}
// 修改副本数
dep.Spec.Replicas = &num
_, err = this.clientset.AppsV1().Deployments("default").Update(ctx, dep, metav1.UpdateOptions{})
return err
}
main.go
package main
import (
"Demo2/client"
"Demo2/deployments"
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func main() {
clientset := client.K8sClientset
deplist := deployments.NewListDplInfo(clientset)
//获取 deployment 名字
deplist.Name()
//打印deployment 副本数
deplist.Replicas()
// 根据yaml创建deployment
depcreate := deployments.NewCreateDplForYaml(clientset)
fmt.Println(depcreate.CreateDep("yamls/nginx.yaml"))
fmt.Println(clientset.AppsV1().Deployments("default").Delete(context.Background(), "web1", metav1.DeleteOptions{}))
// 更新deployment的副本数
deployments.NewUpdateDep(clientset).UpdateReplicas("web1", 3)
deplist.Replicas()
ployments.NewCreateDplForYaml(clientset)
fmt.Println(depcreate.CreateDep("yamls/nginx.yaml"))
fmt.Println(clientset.AppsV1().Deployments("default").Delete(context.Background(), "web1", metav1.DeleteOptions{}))
// 更新deployment的副本数
deployments.NewUpdateDep(clientset).UpdateReplicas("web1", 3)
deplist.Replic
}