From 68c007e836384635d843bbc61174fae5b09ccd1c Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期六, 06 一月 2024 17:08:07 +0800 Subject: [PATCH] 增加对crm,wms,srm的部署支持 --- src/k8s/create_srm.go | 208 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 208 insertions(+), 0 deletions(-) diff --git a/src/k8s/create_srm.go b/src/k8s/create_srm.go new file mode 100644 index 0000000..e612e14 --- /dev/null +++ b/src/k8s/create_srm.go @@ -0,0 +1,208 @@ +package k8s + +import ( + "context" + "fmt" + appsv1 "k8s.io/api/apps/v1" + apiv1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/util/intstr" + "log" + "strconv" +) + +type SrmCreate struct{} + +func (c *SrmCreate) CreateDeploymentAndService(config Config, extendEnv map[string]string) error { + fmt.Println("\033[1;37;40mCreating resources in Namespace:", config.NameSpace, "\033[0m") + + // 妫�娴嬪苟鍒犻櫎宸插瓨鍦ㄧ殑 Deployment 鍜� Service + err := CheckAndDeleteResources(config.Client, config.NameSpace, config.DeploymentName, config.ServiceName) + if err != nil { + return err + } + + config.HttpPort, err = getRandomNodePort(config.Client) + if err != nil { + return err + } + + // 鍒涘缓 Deployment + err = c.CreateDeployment(config, extendEnv) + if err != nil { + return err + } + + log.Printf("Waiting for Deployment %s to be ready...\n", config.DeploymentName) + // 鍒涘缓 Service + err = c.CreateService(config) + if err != nil { + return err + } + + return nil +} + +func (c *SrmCreate) CreateEnv(config Config, pairs map[string]string) []apiv1.EnvVar { + envs := []apiv1.EnvVar{ + { + Name: "DB_HOST", + ValueFrom: &apiv1.EnvVarSource{ + FieldRef: &apiv1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "status.hostIP", + }, + }, + }, + { + Name: "DB_NAME", + Value: config.NameSpace, + }, + { + Name: "DB_PORT", + Value: strconv.Itoa(6446), + }, + { + Name: "DB_USER", + Value: config.NameSpace, + }, + { + Name: "DB_PASSWD", + Value: config.NameSpace + "@Basic2023", + }, + } + + if config.ALHost != "" { + envs = append(envs, apiv1.EnvVar{ + Name: "AL_HOST", + Value: config.ALHost, + }) + } + + if config.NodeID != "" { + envs = append(envs, apiv1.EnvVar{ + Name: "NODE_ID", + Value: config.NodeID, + }) + } + + if len(pairs) > 0 { + for name, value := range pairs { + envs = append(envs, apiv1.EnvVar{ + Name: name, + Value: value, + }) + } + } + for name, value := range pairs { + envs = append(envs, apiv1.EnvVar{ + Name: name, + Value: value, + }) + } + return envs +} +func (c *SrmCreate) CreateDeployment(config Config, extendEnv map[string]string) error { + fmt.Println("\033[1;37;40mCreating Deployment:", config.DeploymentName, "\033[0m") + fmt.Printf("Srm CreateDeployment config:%+v\n", config) + envs := c.CreateEnv(config, extendEnv) + deployment := &appsv1.Deployment{ + ObjectMeta: metav1.ObjectMeta{ + Name: config.DeploymentName, + }, + Spec: appsv1.DeploymentSpec{ + Replicas: &replicas, + Selector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "cid": c.GetCid(config), + }, + }, + Template: apiv1.PodTemplateSpec{ + ObjectMeta: metav1.ObjectMeta{ + Labels: map[string]string{ + "cid": c.GetCid(config), + }, + }, + Spec: apiv1.PodSpec{ + TopologySpreadConstraints: []apiv1.TopologySpreadConstraint{ + { + MaxSkew: 1, + TopologyKey: "kubernetes.io/hostname", + WhenUnsatisfiable: apiv1.DoNotSchedule, + LabelSelector: &metav1.LabelSelector{ + MatchLabels: map[string]string{ + "cid": c.GetCid(config), + }, + }, + }, + }, + Containers: []apiv1.Container{ + { + Name: config.DeploymentName, + Image: config.Image, + Env: envs, + ImagePullPolicy: apiv1.PullIfNotPresent, // 璁剧疆闀滃儚鎷夊彇绛栫暐涓� Always + }, + }, + }, + }, + }, + } + + _, err := config.Client.AppsV1().Deployments(config.NameSpace).Create(context.TODO(), deployment, metav1.CreateOptions{}) + if err != nil { + if !errors.IsAlreadyExists(err) { + return fmt.Errorf("failed to create Deployment: %v", err) + } + fmt.Printf("Deployment %s already exists in Namespace %s\n", config.DeploymentName, config.NameSpace) + } else { + fmt.Printf("Deployment %s created in Namespace %s\n", config.DeploymentName, config.NameSpace) + } + + return nil +} + +// createService 鍒涘缓鎸囧畾鐨� Service +func (c *SrmCreate) CreateService(config Config) error { + fmt.Println("\033[1;37;40mCreating Service:", config.ServiceName, "\033[0m") + + service := &apiv1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: config.ServiceName, + }, + Spec: apiv1.ServiceSpec{ + Selector: map[string]string{ + "cid": c.GetCid(config), + }, + Type: apiv1.ServiceTypeNodePort, + Ports: []apiv1.ServicePort{ + { + Name: "http", + Protocol: apiv1.ProtocolTCP, + Port: port, // 闆嗙兢鍐呴儴璁块棶绔彛 + TargetPort: intstr.FromInt(int(port)), // 瀹瑰櫒瀵瑰绔彛 + NodePort: config.HttpPort, // 澶栭儴璁块棶绔彛 + }, + }, + SessionAffinity: apiv1.ServiceAffinityClientIP, + }, + } + + _, err := config.Client.CoreV1().Services(config.NameSpace).Create(context.TODO(), service, metav1.CreateOptions{}) + + if err != nil { + if !errors.IsAlreadyExists(err) { + return fmt.Errorf("failed to create Service: %v", err) + } + log.Printf("Service %s already exists in Namespace %s\n", config.ServiceName, config.NameSpace) + } else { + log.Printf("Service %s created in Namespace %s\n", config.ServiceName, config.NameSpace) + } + + return nil +} + +func (c *SrmCreate) GetCid(config Config) string { + return fmt.Sprintf("%v-%v", config.NameSpace, "srm") +} -- Gitblit v1.8.0