简介:
基于beego框架开发,这里对cmdb一些功能展示、deployment资源的操作核心代码展示;
源码已托管至github:https://github.com/CosmicBDry/gocmdb.git
一.CMDB操作k8s集群
1.cmdb创建deployment资源
1)控制器菜单选择

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

3)创建后结果如下

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

2.对deployment资源的实时更新
1)点击配置按钮,对如下pod副本数进行调整

2)查看调整后的副本数

3)后端验证pod的副本数

3.deployment资源的删除操作
1)点击删除按钮,弹出确认删除提示

2)删除成功操作

3)后端验证是否删除

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系统

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

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

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

四.CMDB实现CICD流程(结合gitlab、shell脚本或ansible)
1.发布管理菜单

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

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

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