wmj-test/src/k8s_client.go

111 lines
2.8 KiB
Go

package k8s_manager
import (
"context"
"fmt"
"github.com/goccy/go-json"
log "github.com/sirupsen/logrus"
appv1 "k8s.io/api/apps/v1"
v1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
)
type K8sClient struct {
*kubernetes.Clientset
Namespace string
}
func CreateClient() *K8sClient {
var err error
config, err := rest.InClusterConfig()
if err != nil {
log.WithError(err).Error("InClusterConfig")
return nil
}
client, err := kubernetes.NewForConfig(config)
if err != nil {
log.WithError(err).Error("NewForConfig")
}
return &K8sClient{client, "apps"}
}
func (c *K8sClient) ListPods() {
pods, err := c.CoreV1().Pods("").List(context.Background(), metav1.ListOptions{})
if err != nil {
log.WithError(err).Error("ListPods")
} else {
fmt.Printf("There are %d pods in the cluster\n", len(pods.Items))
}
}
func (c *K8sClient) GetAppStatus(app *AppModel) (*appv1.DeploymentStatus, error) {
get, err := c.AppsV1().Deployments(c.Namespace).Get(context.Background(), app.DeploymentName(), metav1.GetOptions{})
// log.WithError(err).WithField("dep", get).WithField("name", app.DeploymentName()).Info("GetAppStatus")
return &get.Status, err
}
func (c *K8sClient) CreateApp(app *AppModel) {
var rep int32 = 1
labelKey, labelValue := app.GetLabel()
labels := map[string]string{labelKey: labelValue}
deployment := &appv1.Deployment{
ObjectMeta: metav1.ObjectMeta{
Name: app.DeploymentName(),
Labels: labels,
},
Spec: appv1.DeploymentSpec{
Replicas: &rep,
Selector: &metav1.LabelSelector{
MatchLabels: labels,
},
Template: v1.PodTemplateSpec{
ObjectMeta: metav1.ObjectMeta{
Labels: labels,
},
Spec: v1.PodSpec{
Containers: []v1.Container{{
Name: app.ContainerName(),
Image: app.Image,
Command: app.GetCommandOrBlack(),
Env: app.GetEnv(),
VolumeMounts: nil,
}},
},
},
},
}
deployment, err := c.AppsV1().Deployments(c.Namespace).Create(context.Background(), deployment, metav1.CreateOptions{})
if err != nil {
d, _ := json.Marshal(deployment)
fmt.Println(string(d))
log.WithError(err).Error("Create Deployment error.")
}
service := &v1.Service{
ObjectMeta: metav1.ObjectMeta{
Name: app.ServiceName(),
},
Spec: v1.ServiceSpec{
Type: v1.ServiceTypeClusterIP,
ClusterIP: "None",
Selector: labels,
},
}
service, err = c.CoreV1().Services(c.Namespace).Create(context.Background(), service, metav1.CreateOptions{})
if err != nil {
log.WithError(err).Error("Create Service ")
}
}
func (c *K8sClient) DeleteApp(app *AppModel) {
err := c.AppsV1().Deployments(c.Namespace).Delete(context.Background(), app.DeploymentName(), metav1.DeleteOptions{})
if err != nil {
log.WithError(err).Error("Delete error ", app.DeploymentName())
return
}
}