From 0e22b2dfe7a24c528fb8ac58ece089bd032f5478 Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期二, 26 十二月 2023 17:49:34 +0800 Subject: [PATCH] 支持添加额外的env --- src/k8s/create.go | 208 +++++++++++++++++++++++++++++++++++---------------- 1 files changed, 143 insertions(+), 65 deletions(-) diff --git a/src/k8s/create.go b/src/k8s/create.go index 995af09..6c4ccc2 100644 --- a/src/k8s/create.go +++ b/src/k8s/create.go @@ -22,10 +22,25 @@ var ( replicas int32 = 3 port int32 = 9081 - rpcPort int32 = 9082 + rpcPort int32 = 9091 namespaces = []string{"guangsheng", "geruimi", "tongsheng"} usedNodePorts = make(map[int32]bool) ) + +type Config struct { + Client *kubernetes.Clientset // Kubernetes 瀹㈡埛绔� + Image string // 闀滃儚鍚嶇О + DBHost string // 鏁版嵁搴撳湴鍧� + DBName string //鏁版嵁搴撳悕绉� + HttpPort int32 // HTTP 绔彛 + RpcPort int32 // RPC 绔彛 + NameSpace string // Namespace + DeploymentName string // Deployment 鍚嶇О + ServiceName string // Service 鍚嶇О + ALHost string // 绠楁硶Host + Host string // 鏈嶅姟Host + NodeID string // Nsq鑺傜偣ID +} func create_test() { // 閰嶇疆 Kubernetes 闆嗙兢鐨� kubeconfig 璺緞 @@ -45,7 +60,7 @@ // 鍒涘缓澶氫釜 Namespace 涓嬬殑鐩稿悓鍚嶇О鐨� Deployment 鍜� Service for _, ns := range namespaces { - err = CreateDeploymentAndService(clientset, ns, ns, ns) + err = CreateDeploymentAndService(Config{Client: clientset, NameSpace: ns, DeploymentName: ns, ServiceName: ns}, nil) if err != nil { panic(err) } @@ -114,30 +129,29 @@ return nil } -func CreateDeploymentAndService(clientset *kubernetes.Clientset, namespace, deploymentName, serviceName string) error { - fmt.Println("\033[1;37;40mCreating resources in Namespace:", namespace, "\033[0m") +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(clientset, namespace, deploymentName, serviceName) + err := CheckAndDeleteResources(config.Client, config.NameSpace, config.DeploymentName, config.ServiceName) if err != nil { return err } - // 鍒涘缓 Namespace - err = createNamespace(clientset, namespace) + config.HttpPort, config.RpcPort, err = getTwoNodePort(config.Client) if err != nil { return err } // 鍒涘缓 Deployment - err = createDeployment(clientset, namespace, deploymentName) + err = createDeployment(config, extendEnvs) if err != nil { return err } - log.Printf("Waiting for Deployment %s to be ready...\n", deploymentName) + log.Printf("Waiting for Deployment %s to be ready...\n", config.DeploymentName) // 鍒涘缓 Service - err = createService(clientset, namespace, serviceName) + err = createService(config) if err != nil { return err } @@ -145,8 +159,8 @@ return nil } -// createNamespace 鍒涘缓鎸囧畾鐨� Namespace -func createNamespace(clientset *kubernetes.Clientset, namespace string) error { +// CreateNamespace 鍒涘缓鎸囧畾鐨� Namespace +func CreateNamespace(clientset *kubernetes.Clientset, namespace string) error { log.Printf("Creating Namespace: %s\n", namespace) ns := &apiv1.Namespace{ @@ -167,25 +181,97 @@ 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", + }, + } -func createDeployment(clientset *kubernetes.Clientset, namespace, deploymentName string) error { - fmt.Println("\033[1;37;40mCreating Deployment:", deploymentName, "\033[0m") + 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: deploymentName, + Name: config.DeploymentName, }, Spec: appsv1.DeploymentSpec{ Replicas: &replicas, Selector: &metav1.LabelSelector{ MatchLabels: map[string]string{ - "cid": namespace, + "cid": config.NameSpace, }, }, Template: apiv1.PodTemplateSpec{ ObjectMeta: metav1.ObjectMeta{ Labels: map[string]string{ - "cid": namespace, + "cid": config.NameSpace, }, }, Spec: apiv1.PodSpec{ @@ -196,42 +282,17 @@ WhenUnsatisfiable: apiv1.DoNotSchedule, LabelSelector: &metav1.LabelSelector{ MatchLabels: map[string]string{ - "cid": namespace, + "cid": config.NameSpace, }, }, - ImagePullPolicy: apiv1.PullAlways, // 璁剧疆闀滃儚鎷夊彇绛栫暐涓� Always }, }, Containers: []apiv1.Container{ { - Name: namespace, - Image: "192.168.20.119/apsserver/apsserver:v0.5", - Env: []apiv1.EnvVar{ - { - Name: "NODE_ID", - Value: namespace, - }, - { - Name: "DB_HOST", - Value: namespace, - }, - { - Name: "DB_NAME", - Value: namespace, - }, - { - Name: "DB_PORT", - Value: strconv.Itoa(3306), - }, - { - Name: "DB_USER", - Value: namespace, - }, - { - Name: "DB_PASSWD", - Value: namespace + "@Basic2023", - }, - }, + Name: config.NameSpace, + Image: config.Image, + Env: envs, + ImagePullPolicy: apiv1.PullAlways, // 璁剧疆闀滃儚鎷夊彇绛栫暐涓� Always }, }, }, @@ -239,35 +300,30 @@ }, } - _, err := clientset.AppsV1().Deployments(namespace).Create(context.TODO(), deployment, metav1.CreateOptions{}) + _, 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", deploymentName, namespace) + fmt.Printf("Deployment %s already exists in Namespace %s\n", config.DeploymentName, config.NameSpace) } else { - fmt.Printf("Deployment %s created in Namespace %s\n", deploymentName, namespace) + fmt.Printf("Deployment %s created in Namespace %s\n", config.DeploymentName, config.NameSpace) } return nil } // createService 鍒涘缓鎸囧畾鐨� Service -func createService(clientset *kubernetes.Clientset, namespace, serviceName string) error { - fmt.Println("\033[1;37;40mCreating Service:", serviceName, "\033[0m") - - //nodePort, err := getRandomNodePort(clientset) - //if err != nil { - // return err - //} +func createService(config Config) error { + fmt.Println("\033[1;37;40mCreating Service:", config.ServiceName, "\033[0m") service := &apiv1.Service{ ObjectMeta: metav1.ObjectMeta{ - Name: serviceName, + Name: config.ServiceName, }, Spec: apiv1.ServiceSpec{ Selector: map[string]string{ - "cid": namespace, + "cid": config.NameSpace, }, Type: apiv1.ServiceTypeNodePort, Ports: []apiv1.ServicePort{ @@ -276,31 +332,53 @@ Protocol: apiv1.ProtocolTCP, Port: port, // 闆嗙兢鍐呴儴璁块棶绔彛 TargetPort: intstr.FromInt(int(port)), // 瀹瑰櫒瀵瑰绔彛 - NodePort: 0, // 澶栭儴璁块棶绔彛 + NodePort: config.HttpPort, // 澶栭儴璁块棶绔彛 }, { Name: "tcp", Protocol: apiv1.ProtocolTCP, Port: rpcPort, TargetPort: intstr.FromInt(int(rpcPort)), - NodePort: 0, + NodePort: config.RpcPort, }, }, + SessionAffinity: apiv1.ServiceAffinityClientIP, }, } - _, err := clientset.CoreV1().Services(namespace).Create(context.TODO(), service, metav1.CreateOptions{}) + _, 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", serviceName, namespace) + log.Printf("Service %s already exists in Namespace %s\n", config.ServiceName, config.NameSpace) } else { - log.Printf("Service %s created in Namespace %s\n", serviceName, namespace) + log.Printf("Service %s created in Namespace %s\n", config.ServiceName, config.NameSpace) } return nil +} + +func getTwoNodePort(client *kubernetes.Clientset) (nodePort1, nodePort2 int32, err error) { + nodePort1, err = getRandomNodePort(client) + if err != nil { + return 0, 0, err + } + + for { + nodePort2, err = getRandomNodePort(client) + if err != nil { + return 0, 0, err + } + + if nodePort2 != nodePort1 { + break + } + + } + + return nodePort1, nodePort2, nil } // getRandomNodePort 鑾峰彇涓�涓湭浣跨敤鐨勯殢鏈� NodePort @@ -370,7 +448,7 @@ if len(svc.Spec.Ports) > 0 { for _, p := range svc.Spec.Ports { // return tcp port - if p.Name == "tcp" { + if p.Name == "http" { return p.NodePort, nil } } -- Gitblit v1.8.0