package main import ( "flag" "fmt" "log" "os" "path/filepath" "time" "k8s.io/client-go/kubernetes" "k8s.io/client-go/tools/clientcmd" "basic.com/aps/aps_deploy.git/src/create" "basic.com/aps/aps_deploy.git/src/delete" ) var ( replicas int32 = 3 port int32 = 9081 usedNodePorts = make(map[int32]bool) namespaces = []string{"guangsheng", "geruimi", "tongsheng"} ) func main() { createCmd := flag.NewFlagSet("create", flag.ExitOnError) deleteCmd := flag.NewFlagSet("delete", flag.ExitOnError) testCmd := flag.NewFlagSet("test", flag.ExitOnError) createNamespace := createCmd.String("ns", "", "Namespace name") createDeployment := createCmd.String("deployment", "", "Deployment name") createService := createCmd.String("service", "", "Service name") deleteNamespace := deleteCmd.String("ns", "", "Namespace name") deleteDeployment := deleteCmd.String("deployment", "", "Deployment name") deleteService := deleteCmd.String("service", "", "Service name") if len(os.Args) < 2 { fmt.Println("create/delete/test command is required") os.Exit(1) } switch os.Args[1] { case "create": createCmd.Parse(os.Args[2:]) case "delete": deleteCmd.Parse(os.Args[2:]) case "test": testCmd.Parse(os.Args[2:]) default: flag.PrintDefaults() os.Exit(1) } // 配置 Kubernetes 集群的 kubeconfig 路径 kubeconfig := flag.String("kubeconfig", filepath.Join(homeDir(), ".kube", "config"), "kubeconfig file") flag.Parse() // 创建 Kubernetes 客户端 config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig) if err != nil { panic(err.Error()) } clientset, err := kubernetes.NewForConfig(config) if err != nil { panic(err.Error()) } // 执行 create 命令 if createCmd.Parsed() { if *createNamespace == "" || *createDeployment == "" || *createService == "" { fmt.Println("Namespace, Deployment, and Service names are required") createCmd.PrintDefaults() os.Exit(1) } err := create.CreateDeploymentAndService(clientset, *createNamespace, *createDeployment, *createService) if err != nil { panic(err) } nodeport, err := create.GetServiceNodePort(clientset, *createNamespace, *createService) if err != nil { panic(err) } log.Printf("Service NodePort: %d\n", nodeport) } // 执行 delete 命令 if deleteCmd.Parsed() { if *deleteNamespace == "" || *deleteDeployment == "" || *deleteService == "" { fmt.Println("Namespace, Deployment, and Service names are required") deleteCmd.PrintDefaults() os.Exit(1) } err := delete.DeleteResources(clientset, *deleteNamespace, *deleteDeployment, *deleteService) if err != nil { panic(err) } fmt.Println("Resources deleted.") } // 执行创建和删除测试 if testCmd.Parsed() { fmt.Println("\033[97;40mRunning create and delete tests...\033[0m") // 创建测试 fmt.Println("\033[97;40m--- Create Test ---\033[0m") for _, ns := range namespaces { deploymentName := ns serviceName := ns err := create.CreateDeploymentAndService(clientset, ns, deploymentName, serviceName) if err != nil { log.Printf("\033[97;41mFailed to create resources in namespace %s: %v\033[0m\n", ns, err) } else { nodeport, err := create.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) } } // 延迟 1000 秒后删除创建的资源 time.Sleep(1000 * time.Second) // 删除测试 fmt.Println("\033[97;40m--- Delete Test ---\033[0m") // 删除多个 Namespace 下的相同名称的 Deployment 和 Service for _, ns := range namespaces { err = delete.DeleteResources(clientset, ns, ns, ns) if err != nil { panic(err) } } fmt.Println("Resources deleted.") } } // homeDir 获取当前用户的家目录路径 func homeDir() string { if h := os.Getenv("HOME"); h != "" { return h } return os.Getenv("USERPROFILE") // Windows 环境下获取用户目录 }