From 2ad213b923c4475efe7d76dfdcbb8323616a6a3a Mon Sep 17 00:00:00 2001
From: wangpengfei <274878379@qq.com>
Date: 星期四, 08 六月 2023 14:30:37 +0800
Subject: [PATCH] fix 修改 util Cluster 根据ClusterId 保存并读取kube config

---
 src/k8s/create.go |  139 +++++++++++++++++++++++++++++++++-------------
 1 files changed, 99 insertions(+), 40 deletions(-)

diff --git a/src/k8s/create.go b/src/k8s/create.go
index 12b995c..fc089ee 100644
--- a/src/k8s/create.go
+++ b/src/k8s/create.go
@@ -22,9 +22,23 @@
 var (
 	replicas      int32 = 3
 	port          int32 = 9081
+	rpcPort       int32 = 9091
 	namespaces          = []string{"guangsheng", "geruimi", "tongsheng"}
 	usedNodePorts       = make(map[int32]bool)
 )
+
+type Config struct {
+	Client         *kubernetes.Clientset // Kubernetes 瀹㈡埛绔�
+	Image          string                // 闀滃儚鍚嶇О
+	DBHost         string                // 鏁版嵁搴撳湴鍧�
+	HttpPort       int32                 // HTTP 绔彛
+	RpcPort        int32                 // RPC 绔彛
+	NameSpace      string                // Namespace
+	DeploymentName string                // Deployment 鍚嶇О
+	ServiceName    string                // Service 鍚嶇О
+	ALHost         string                // 绠楁硶Host
+	Host           string                // 鏈嶅姟Host
+}
 
 func create_test() {
 	// 閰嶇疆 Kubernetes 闆嗙兢鐨� kubeconfig 璺緞
@@ -44,7 +58,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})
 		if err != nil {
 			panic(err)
 		}
@@ -113,29 +127,35 @@
 	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) 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)
+	err = createNamespace(config.Client, config.NameSpace)
+	if err != nil {
+		return err
+	}
+
+	config.HttpPort, config.RpcPort, err = getTwoNodePort(config.Client)
 	if err != nil {
 		return err
 	}
 
 	// 鍒涘缓 Deployment
-	err = createDeployment(clientset, namespace, deploymentName)
+	err = createDeployment(config)
 	if err != nil {
 		return err
 	}
 
+	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
 	}
@@ -166,24 +186,24 @@
 	return nil
 }
 
-func createDeployment(clientset *kubernetes.Clientset, namespace, deploymentName string) error {
-	fmt.Println("\033[1;37;40mCreating Deployment:", deploymentName, "\033[0m")
+func createDeployment(config Config) error {
+	fmt.Println("\033[1;37;40mCreating Deployment:", config.DeploymentName, "\033[0m")
 
 	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{
@@ -194,27 +214,35 @@
 							WhenUnsatisfiable: apiv1.DoNotSchedule,
 							LabelSelector: &metav1.LabelSelector{
 								MatchLabels: map[string]string{
-									"cid": namespace,
+									"cid": config.NameSpace,
 								},
 							},
 						},
 					},
 					Containers: []apiv1.Container{
 						{
-							Name:  namespace,
-							Image: "192.168.20.119/apsserver/apsserver:v0.2",
+							Name:  config.NameSpace,
+							Image: config.Image,
 							Env: []apiv1.EnvVar{
 								{
-									Name:  "NODE_ID",
-									Value: namespace,
+									Name:  "GRPC_PORT",
+									Value: fmt.Sprint(config.RpcPort),
 								},
 								{
 									Name:  "DB_HOST",
-									Value: namespace,
+									Value: config.DBHost,
+								},
+								{
+									Name:  "HOST",
+									Value: config.Host,
+								},
+								{
+									Name:  "AL_HOST",
+									Value: config.ALHost,
 								},
 								{
 									Name:  "DB_NAME",
-									Value: namespace,
+									Value: config.NameSpace,
 								},
 								{
 									Name:  "DB_PORT",
@@ -222,13 +250,14 @@
 								},
 								{
 									Name:  "DB_USER",
-									Value: namespace,
+									Value: config.NameSpace,
 								},
 								{
 									Name:  "DB_PASSWD",
-									Value: namespace + "@Basic2023",
+									Value: config.NameSpace + "@Basic2023",
 								},
 							},
+							ImagePullPolicy: apiv1.PullAlways, // 璁剧疆闀滃儚鎷夊彇绛栫暐涓� Always
 						},
 					},
 				},
@@ -236,60 +265,85 @@
 		},
 	}
 
-	_, 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{
 				{
 					Name:       "http",
 					Protocol:   apiv1.ProtocolTCP,
-					Port:       port,
-					TargetPort: intstr.FromInt(int(port)),
-					NodePort:   nodePort,
+					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 = 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)
 		}
-		fmt.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 {
-		fmt.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
@@ -357,7 +411,12 @@
 
 	// 鑾峰彇绗竴涓鍙g殑 NodePort
 	if len(svc.Spec.Ports) > 0 {
-		return svc.Spec.Ports[0].NodePort, nil
+		for _, p := range svc.Spec.Ports {
+			// return tcp port
+			if p.Name == "http" {
+				return p.NodePort, nil
+			}
+		}
 	}
 
 	return 0, fmt.Errorf("no ports defined for Service %s", serviceName)

--
Gitblit v1.8.0