0
点赞
收藏
分享

微信扫一扫

golang-cmdb资产管理系统开发,对接k8s、云平台、gitlab、Prometheus

简介:
   基于beego框架开发,这里对cmdb一些功能展示、deployment资源的操作核心代码展示;
   源码已托管至github:https://github.com/CosmicBDry/gocmdb.git

一.CMDB操作k8s集群

1.cmdb创建deployment资源

1)控制器菜单选择

image.png

2)点击新建按钮,新建deployment项目,填写部署表单

image.png

3)创建后结果如下

image.png

4)k8s集群后端验证已创建成功

image.png

2.对deployment资源的实时更新

1)点击配置按钮,对如下pod副本数进行调整

image.png

2)查看调整后的副本数

image.png

3)后端验证pod的副本数

image.png

3.deployment资源的删除操作

1)点击删除按钮,弹出确认删除提示

image.png

2)删除成功操作

image.png

3)后端验证是否删除

image.png

4.CMDB操作deployment资源核心代码展示

1)k8s的SDK相关的包导入

package models
import (
    "context"
    "time"
    appV1 "k8s.io/api/apps/v1"
    coreV1 "k8s.io/api/core/v1"
    metaV1 "k8s.io/apimachinery/pkg/apis/meta/v1"
    "k8s.io/client-go/kubernetes"
    kubeAppV1 "k8s.io/client-go/kubernetes/typed/apps/v1"
    "k8s.io/client-go/tools/clientcmd"
)

2)定义一个deployment结构体类型,用于获取接收deployment资源数据

type DeploymentInstace struct {
    Name                 string            `json:"app_name" form:"name"`
    NameSpace            string            `json:"namespace" form:"namespace"`
    CreationTimestamp    time.Time         `json:"created_time"`
    RevisionHistoryLimit int32             `json:"revision_history_limit" form:"historyVersionLimit"`
    Replicas             int32             `json:"replicas" form:"replicas"`
    AvailableReplicas    int32             `json:"available_replicas"`
    Labels               map[string]string `json:"-" form:"labels"`
    ContainerName string `form:"containerName"`
    ImgUrl string `form:"imageUrl"`
    ContainerPortName    string       `json:"-"form:"containerPortName"`
    ContainerPort    int32 `form:"containerPort"`
    HostPort int32 `form:"hostPort"`
}

3)调用k8s的api接口获取指定名称空间的deployment资源的数据

func  DeploymentInstanceGet(kubeconfig,namespace,deploymentName string) (*DeploymentInstace,error){
    //通过kubeconfig集群认证文件生成一个客户端操作对象clientset
    clientset,err:=ClienSet(kubeconfig)
    if err !=nil{
        return nil,err
    }
    //创建一个deployment资源的接口对象DeploymentClient,用于操作指定名称空间的deployment资源
    DeploymentClient:=clientset.AppsV1().Deployments(namespace)
    //调用接口对象DeploymentClient中的Get方法,获取相应的deployment资源数据 deploymentInstance,err:=DeploymentClient.Get(context.TODO(),deploymentName,metaV1.GetOptions{})
    if err !=nil{
        return nil,err
    }
    //return返回指针类型的deployment结构体类型的实例
    return &DeploymentInstace{
        Name: deploymentInstance.Name,
        NameSpace: deploymentInstance.Namespace,
        CreationTimestamp:    deploymentInstance.CreationTimestamp.Time,
        RevisionHistoryLimit: *deploymentInstance.Spec.RevisionHistoryLimit,
        Replicas:   *deploymentInstance.Spec.Replicas,          
        AvailableReplicas: deploymentInstance.Status.AvailableReplicas,
        Labels: deploymentInstance.Spec.Selector.MatchLabels ,           
        ContainerName: deploymentInstance.Spec.Template.Spec.Containers[0].Name,
        ImgUrl: deploymentInstance.Spec.Template.Spec.Containers[0].Image,
        ContainerPortName:  deploymentInstance.Spec.Template.Spec.Containers[0].Ports[0].Name  ,
        ContainerPort: deploymentInstance.Spec.Template.Spec.Containers[0].Ports[0].ContainerPort ,
        HostPort: deploymentInstance.Spec.Template.Spec.Containers[0].Ports[0].HostPort,
    },nil
}

4)在集群中创建一个deployment控制器实例

func DeploymentInstanceCreate(kubeconfig string,deployment *DeploymentInstace)error{
    //定义deployment资源的创建清单,类似k8s中通过创建yaml清单来部署集群资源
    deploymentInstance := &appV1.Deployment{
        TypeMeta: metaV1.TypeMeta{ //定义deployment资源的apiVersion、kind类型等
            Kind:       "Deployment",
            APIVersion: "apps/v1",
        },
        ObjectMeta: metaV1.ObjectMeta{ //定义控制器的metadata:名称、namespace、labels等
            Name: deployment.Name,
            Namespace: deployment.NameSpace,
            Labels: deployment.Labels,
        },
        Spec: appV1.DeploymentSpec{ //定义deployment控制器的spec字段
            Replicas: &deployment.Replicas,
            Selector: &metaV1.LabelSelector{
                MatchLabels: deployment.Labels,
            },
            RevisionHistoryLimit: &deployment.RevisionHistoryLimit,     
                Template: coreV1.PodTemplateSpec{
                    ObjectMeta: metaV1.ObjectMeta{
                        //Name: "golang-pod",
                        Labels: deployment.Labels,
                    },
                    Spec: coreV1.PodSpec{
                        Containers: []coreV1.Container{
                            coreV1.Container{
                            Name: deployment.ContainerName,
                                Image: deployment.ImgUrl,
                                ImagePullPolicy: coreV1.PullIfNotPresent,
                                Ports: []coreV1.ContainerPort{
                                    coreV1.ContainerPort{
                                    Name: deployment.ContainerPortName,
                                    ContainerPort:  deployment.ContainerPort,
                                    HostPort: deployment.HostPort,
                                    Protocol: coreV1.ProtocolTCP,
                                    },
                                },
                            },
                        },
                    },
                },
            },
        }

        clientset,err:=ClienSet(kubeconfig)
            if err !=nil{
                return err
            }

        DeploymentClient:=clientset.AppsV1().Deployments(deployment.NameSpace)
        //调用DeploymentClient接口中的create方法,创建deployment资源
        _, err = DeploymentClient.Create(context.TODO(), deploymentInstance, metaV1.CreateOptions{})
        if err !=nil{
            return err
        }
    return nil
}

5)deployment资源更新

func DeploymentInstanceModify(kubeconfig string,newDeploymentInstance *DeploymentInstace)error{

    clientset,err:=ClienSet(kubeconfig)
    if err !=nil{
        return err
    }
    DeploymentClient:=clientset.AppsV1().Deployments(newDeploymentInstance.NameSpace)
    deploymentInstance,err:=DeploymentClient.Get(context.TODO(),newDeploymentInstance.Name,metaV1.GetOptions{})
    if err !=nil{
        return err
    }

    deploymentInstance.Spec.Replicas= &newDeploymentInstance.Replicas
    deploymentInstance.Spec.RevisionHistoryLimit =&newDeploymentInstance.RevisionHistoryLimit
    deploymentInstance.Spec.Template.Spec.Containers[0].Image= newDeploymentInstance.ImgUrl
    deploymentInstance.Spec.Template.Spec.Containers[0].Ports[0].ContainerPort = newDeploymentInstance.ContainerPort
    deploymentInstance.Spec.Template.Spec.Containers[0].Ports[0].HostPort = newDeploymentInstance.HostPort
    //调用DeploymentClient接口对象中的update方法,来更新deployment资源
    _,err=DeploymentClient.Update(context.TODO(),deploymentInstance,metaV1.UpdateOptions{})
    if err !=nil{
        return err
    }

    return nil

}

二.对接腾讯云、阿里云等云平台

1.以下实现是通过调用腾讯云、阿里云自带的api接口(SDK),将云平台注册到CMDB系统

image.png

2.调用云平台api抓取到的实例信息,以及对实例的简单操作

image.png

三.CMDB接收prometheus告警通知、job监控节点的配置

1.alertmanager告警通知

image.png

2.通过CMDB配置prometheus.yml主配置文件,添加或删除job

image.png

四.CMDB实现CICD流程(结合gitlab、shell脚本或ansible)

1.发布管理菜单

image.png

2.通过gitlab的webhook事件触发,发生代码提交,会自动注册最新提交的项目到cmdb系统,如下可查看项目提交相关信息

image.png

3.发布管理配置,配置master节点、后端发布节点、CICD功能的启用或禁用

image.png

4.查看构建记录文件,通过shell实现对go代码的构建编译

image.png

举报

相关推荐

0 条评论