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 ++++++++++++++++++++++++++++++++-------------------------- 1 files changed, 256 insertions(+), 211 deletions(-) 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") +} -- Gitblit v1.8.0