111 lines
2.8 KiB
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
|
|
}
|
|
}
|