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.go | 467 ++++++++++++---------- src/k8s/create_wms.go | 212 ++++++++++ src/main/main.go | 80 ++- .gitignore | 1 src/k8s/create_crm.go | 208 +++++++++ src/k8s/delete.go | 30 + src/k8s/create_srm.go | 208 +++++++++ 7 files changed, 960 insertions(+), 246 deletions(-) diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..485dee6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea diff --git a/src/k8s/create.go b/src/k8s/create.go index 6c4ccc2..2380d1e 100644 --- a/src/k8s/create.go +++ b/src/k8s/create.go @@ -20,11 +20,19 @@ ) var ( - replicas int32 = 3 + replicas int32 = 1 port int32 = 9081 rpcPort int32 = 9091 - namespaces = []string{"guangsheng", "geruimi", "tongsheng"} + namespaces = []string{"testFactory1", "testFactory2", "testFactory3"} usedNodePorts = make(map[int32]bool) + Projects = []string{ProjectAps, ProjectCrm, ProjectSrm, ProjectWms} +) + +const ( + ProjectAps = "aps" + ProjectCrm = "crm" + ProjectSrm = "srm" + ProjectWms = "wms" ) type Config struct { @@ -60,9 +68,16 @@ // 鍒涘缓澶氫釜 Namespace 涓嬬殑鐩稿悓鍚嶇О鐨� Deployment 鍜� Service for _, ns := range namespaces { - err = CreateDeploymentAndService(Config{Client: clientset, NameSpace: ns, DeploymentName: ns, ServiceName: ns}, nil) + err = CreateNamespace(clientset, ns) if err != nil { panic(err) + } + for _, proj := range Projects { + obj := GetCreateObj(proj) + err = obj.CreateDeploymentAndService(Config{Client: clientset, NameSpace: ns, DeploymentName: proj, ServiceName: proj}, nil) + if err != nil { + panic(err) + } } nodeport, err := GetServiceNodePort(clientset, ns, ns) @@ -71,7 +86,22 @@ } log.Printf("Service NodePort: %d\n", nodeport) + } +} + +func GetCreateObj(proj string) Create { + switch proj { + case ProjectAps: + return &ApsCreate{} + case ProjectCrm: + return &CrmCreate{} + case ProjectSrm: + return &SrmCreate{} + case ProjectWms: + return &WmsCreate{} + } + return nil } // CheckAndDeleteResources 妫�娴嬪苟鍒犻櫎鎸囧畾鐨� Namespace銆丏eployment 鍜� Service @@ -129,36 +159,6 @@ return nil } -func CreateDeploymentAndService(config Config, extendEnvs 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, config.RpcPort, err = getTwoNodePort(config.Client) - if err != nil { - return err - } - - // 鍒涘缓 Deployment - err = createDeployment(config, extendEnvs) - if err != nil { - return err - } - - log.Printf("Waiting for Deployment %s to be ready...\n", config.DeploymentName) - // 鍒涘缓 Service - err = createService(config) - if err != nil { - return err - } - - return nil -} - // CreateNamespace 鍒涘缓鎸囧畾鐨� Namespace func CreateNamespace(clientset *kubernetes.Clientset, namespace string) error { log.Printf("Creating Namespace: %s\n", namespace) @@ -177,184 +177,6 @@ log.Printf("Namespace %s already exists\n", namespace) } else { log.Printf("Namespace %s created\n", namespace) - } - - return nil -} -func createEnv(config Config, pairs map[string]string) []apiv1.EnvVar { - envs := []apiv1.EnvVar{ - { - Name: "GRPC_PORT", - Value: fmt.Sprint(config.RpcPort), - }, - { - Name: "DB_HOST", - ValueFrom: &apiv1.EnvVarSource{ - FieldRef: &apiv1.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "status.hostIP", - }, - }, - }, - { - Name: "HOST", - ValueFrom: &apiv1.EnvVarSource{ - FieldRef: &apiv1.ObjectFieldSelector{ - APIVersion: "v1", - FieldPath: "status.hostIP", - }, - }, - }, - { - Name: "DB_NAME", - Value: config.DBName, - }, - { - 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 createDeployment(config Config, extendEnvs map[string]string) error { - fmt.Println("\033[1;37;40mCreating Deployment:", config.DeploymentName, "\033[0m") - - envs := createEnv(config, extendEnvs) - deployment := &appsv1.Deployment{ - ObjectMeta: metav1.ObjectMeta{ - Name: config.DeploymentName, - }, - Spec: appsv1.DeploymentSpec{ - Replicas: &replicas, - Selector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "cid": config.NameSpace, - }, - }, - Template: apiv1.PodTemplateSpec{ - ObjectMeta: metav1.ObjectMeta{ - Labels: map[string]string{ - "cid": config.NameSpace, - }, - }, - Spec: apiv1.PodSpec{ - TopologySpreadConstraints: []apiv1.TopologySpreadConstraint{ - { - MaxSkew: 1, - TopologyKey: "kubernetes.io/hostname", - WhenUnsatisfiable: apiv1.DoNotSchedule, - LabelSelector: &metav1.LabelSelector{ - MatchLabels: map[string]string{ - "cid": config.NameSpace, - }, - }, - }, - }, - Containers: []apiv1.Container{ - { - Name: config.NameSpace, - Image: config.Image, - Env: envs, - ImagePullPolicy: apiv1.PullAlways, // 璁剧疆闀滃儚鎷夊彇绛栫暐涓� Always - }, - }, - }, - }, - }, - } - - _, err := config.Client.AppsV1().Deployments(config.DeploymentName).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 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": config.NameSpace, - }, - Type: apiv1.ServiceTypeNodePort, - Ports: []apiv1.ServicePort{ - { - Name: "http", - Protocol: apiv1.ProtocolTCP, - Port: port, // 闆嗙兢鍐呴儴璁块棶绔彛 - TargetPort: intstr.FromInt(int(port)), // 瀹瑰櫒瀵瑰绔彛 - NodePort: config.HttpPort, // 澶栭儴璁块棶绔彛 - }, - { - Name: "tcp", - Protocol: apiv1.ProtocolTCP, - Port: rpcPort, - TargetPort: intstr.FromInt(int(rpcPort)), - NodePort: config.RpcPort, - }, - }, - SessionAffinity: apiv1.ServiceAffinityClientIP, - }, - } - - _, err := config.Client.CoreV1().Services(config.ServiceName).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 @@ -456,3 +278,226 @@ return 0, fmt.Errorf("no ports defined for Service %s", serviceName) } + +type Create interface { + CreateDeploymentAndService(config Config, extendEnv map[string]string) error + CreateEnv(config Config, pairs map[string]string) []apiv1.EnvVar + CreateDeployment(config Config, extendEnv map[string]string) error + CreateService(config Config) error + GetCid(config Config) string +} + +type ApsCreate struct{} + +func (c *ApsCreate) 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, config.RpcPort, err = getTwoNodePort(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 *ApsCreate) CreateEnv(config Config, pairs map[string]string) []apiv1.EnvVar { + envs := []apiv1.EnvVar{ + { + Name: "GRPC_PORT", + Value: fmt.Sprint(config.RpcPort), + }, + { + Name: "DB_HOST", + ValueFrom: &apiv1.EnvVarSource{ + FieldRef: &apiv1.ObjectFieldSelector{ + APIVersion: "v1", + FieldPath: "status.hostIP", + }, + }, + }, + { + Name: "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 *ApsCreate) CreateDeployment(config Config, extendEnv map[string]string) error { + fmt.Println("\033[1;37;40mCreating Deployment:", config.DeploymentName, "\033[0m") + log.Printf("Aps 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.NameSpace, + 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 *ApsCreate) 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, // 澶栭儴璁块棶绔彛 + }, + { + Name: "tcp", + Protocol: apiv1.ProtocolTCP, + Port: rpcPort, + TargetPort: intstr.FromInt(int(rpcPort)), + NodePort: config.RpcPort, + }, + }, + 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 *ApsCreate) GetCid(config Config) string { + return fmt.Sprintf("%v-%v", config.NameSpace, "aps") +} diff --git a/src/k8s/create_crm.go b/src/k8s/create_crm.go new file mode 100644 index 0000000..a65b6ab --- /dev/null +++ b/src/k8s/create_crm.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 CrmCreate struct{} + +func (c *CrmCreate) CreateDeploymentAndService(config Config, extendEnv map[string]string) error { + fmt.Println("\033[1;37;40mCreating resources in Namespace:", config.NameSpace, "\033[0m") + fmt.Printf("Crm CreateDeployment config:%+v\n", config) + // 妫�娴嬪苟鍒犻櫎宸插瓨鍦ㄧ殑 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 *CrmCreate) 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_PORT", + Value: strconv.Itoa(6446), + }, + { + Name: "DB_NAME", + Value: config.NameSpace + "_crm", + }, + { + 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 *CrmCreate) CreateDeployment(config Config, extendEnv map[string]string) error { + fmt.Println("\033[1;37;40mCreating Deployment:", config.DeploymentName, "\033[0m") + + 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 *CrmCreate) 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 *CrmCreate) GetCid(config Config) string { + return fmt.Sprintf("%v-%v", config.NameSpace, "crm") +} 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") +} diff --git a/src/k8s/create_wms.go b/src/k8s/create_wms.go new file mode 100644 index 0000000..29c477e --- /dev/null +++ b/src/k8s/create_wms.go @@ -0,0 +1,212 @@ +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 WmsCreate struct{} + +func (c *WmsCreate) CreateDeploymentAndService(config Config, extendEnv map[string]string) error { + fmt.Println("\033[1;37;40mCreating resources in Namespace:", config.NameSpace, "\033[0m") + fmt.Printf("Wms CreateDeployment config:%+v\n", config) + // 妫�娴嬪苟鍒犻櫎宸插瓨鍦ㄧ殑 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 *WmsCreate) CreateEnv(config Config, pairs map[string]string) []apiv1.EnvVar { + envs := []apiv1.EnvVar{ + { + Name: "GRPC_PORT", + Value: fmt.Sprint(config.RpcPort), + }, + { + 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 *WmsCreate) CreateDeployment(config Config, extendEnv map[string]string) error { + fmt.Println("\033[1;37;40mCreating Deployment:", config.DeploymentName, "\033[0m") + + 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 *WmsCreate) 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 *WmsCreate) GetCid(config Config) string { + return fmt.Sprintf("%v-%v", config.NameSpace, "wms") +} diff --git a/src/k8s/delete.go b/src/k8s/delete.go index 8d99f16..8410b76 100644 --- a/src/k8s/delete.go +++ b/src/k8s/delete.go @@ -14,9 +14,6 @@ ) func delete_test() { - var ( - namespaces = []string{"guangsheng", "geruimi", "tongsheng"} - ) // 閰嶇疆 Kubernetes 闆嗙兢鐨� kubeconfig 璺緞 kubeconfig := flag.String("kubeconfig", filepath.Join(util.HomeDir(), ".kube", "config"), "kubeconfig file") @@ -35,7 +32,32 @@ // 鍒犻櫎澶氫釜 Namespace 涓嬬殑鐩稿悓鍚嶇О鐨� Deployment 鍜� Service for _, ns := range namespaces { - err = DeleteResources(clientset, ns, ns, ns) + for _, proj := range Projects { + if proj == ProjectAps { + err := deleteDeployment(clientset, ns, ns) + if err != nil { + panic(err) + } + // 鍒犻櫎 Service + err = deleteService(clientset, ns, ns) + if err != nil { + panic(err) + } + } else { + err := deleteDeployment(clientset, ns, proj) + if err != nil { + panic(err) + } + // 鍒犻櫎 Service + err = deleteService(clientset, ns, proj) + if err != nil { + panic(err) + } + } + } + + // 鍒犻櫎 Namespace + err = DeleteNamespace(Config{Client: clientset, NameSpace: ns}) if err != nil { panic(err) } diff --git a/src/main/main.go b/src/main/main.go index 530cf63..41dfb85 100644 --- a/src/main/main.go +++ b/src/main/main.go @@ -20,10 +20,10 @@ ) var ( - replicas int32 = 3 + replicas int32 = 1 port int32 = 9081 usedNodePorts = make(map[int32]bool) - namespaces = []string{"guangsheng", "geruimi", "tongsheng"} + namespaces = []string{"testFactory1", "testFactory2", "testFactory3"} ) func rancher_install_test(node rancher.Node) { @@ -127,8 +127,9 @@ createNamespace := createCmd.String("ns", "", "Namespace name") createDeployment := createCmd.String("deployment", "", "Deployment name") + fmt.Println(createDeployment) createService := createCmd.String("service", "", "Service name") - + fmt.Println(createService) deleteNamespace := deleteCmd.String("ns", "", "Namespace name") deleteDeployment := deleteCmd.String("deployment", "", "Deployment name") deleteService := deleteCmd.String("service", "", "Service name") @@ -176,9 +177,9 @@ rancherClusterConfig.Nodes = make([]rancher.Node, 3) rancherClusterConfig.Nodes[0] = rancher.Node{ Roles: []string{"worker"}, - IP: "192.168.20.189", - SSHUsername: "basic", - SSHPassword: "123", + IP: "192.168.49.1", + SSHUsername: "me", + SSHPassword: "123456", SSHPort: 22, } @@ -208,23 +209,31 @@ panic(err.Error()) } - if *createNamespace == "" || *createDeployment == "" || *createService == "" { + if *createNamespace == "" { fmt.Println("Namespace, Deployment, and Service names are required") createCmd.PrintDefaults() os.Exit(1) } - err = k8s.CreateDeploymentAndService(k8s.Config{ - Client: clientset, - NameSpace: *createNamespace, - DeploymentName: *createDeployment, - ServiceName: *createService, - }, nil) + err = k8s.CreateNamespace(clientset, *createNamespace) if err != nil { panic(err) } + for _, proj := range k8s.Projects { + obj := k8s.GetCreateObj(proj) + err = obj.CreateDeploymentAndService(k8s.Config{ + Client: clientset, + NameSpace: *createNamespace, + DeploymentName: proj, + ServiceName: proj, + Image: "fai365.com:9088/aps/aps", + }, nil) + if err != nil { + panic(err) + } + } - nodeport, err := k8s.GetServiceNodePort(clientset, *createNamespace, *createService) + nodeport, err := k8s.GetServiceNodePort(clientset, *createNamespace, "aps") if err != nil { panic(err) } @@ -255,9 +264,14 @@ os.Exit(1) } - err = k8s.DeleteResources(clientset, *deleteNamespace, *deleteDeployment, *deleteService) - if err != nil { - panic(err) + for _, proj := range k8s.Projects { + err = k8s.DeleteResources(clientset, *deleteNamespace, proj, proj) + if err != nil { + panic(err) + } + if err != nil { + panic(err) + } } fmt.Println("Resources deleted.") @@ -287,23 +301,27 @@ for _, ns := range namespaces { deploymentName := ns serviceName := ns - err := k8s.CreateDeploymentAndService(k8s.Config{ - Client: clientset, - NameSpace: ns, - DeploymentName: deploymentName, - ServiceName: serviceName, - }, nil) - if err != nil { - log.Printf("\033[97;41mFailed to create resources in namespace %s: %v\033[0m\n", ns, err) - } else { - nodeport, err := k8s.GetServiceNodePort(clientset, ns, ns) + for _, proj := range k8s.Projects { + obj := k8s.GetCreateObj(proj) + err = obj.CreateDeploymentAndService(k8s.Config{ + Client: clientset, + NameSpace: ns, + DeploymentName: deploymentName, + ServiceName: serviceName, + }, nil) if err != nil { - panic(err) - } + log.Printf("\033[97;41mFailed to create resources in namespace %s: %v\033[0m\n", ns, err) + } else { + nodeport, err := k8s.GetServiceNodePort(clientset, ns, ns) + if err != nil { + panic(err) + } - log.Printf("Service NodePort: %d\n", nodeport) - log.Printf("\033[97;42mSuccessfully created resources in namespace %s\033[0m\n", ns) + log.Printf("Service NodePort: %d\n", nodeport) + log.Printf("\033[97;42mSuccessfully created resources in namespace %s\033[0m\n", ns) + } } + } // 寤惰繜 1000 绉掑悗鍒犻櫎鍒涘缓鐨勮祫婧� -- Gitblit v1.8.0