package main
|
|
import (
|
"flag"
|
"fmt"
|
"log"
|
"os"
|
"path/filepath"
|
"time"
|
|
"basic.com/aps/aps_deploy.git/src/cluster"
|
"basic.com/aps/aps_deploy.git/src/rancher"
|
"basic.com/aps/aps_deploy.git/src/util"
|
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/tools/clientcmd"
|
|
"basic.com/aps/aps_deploy.git/src/k8s"
|
|
"github.com/spf13/viper"
|
)
|
|
var (
|
replicas int32 = 3
|
port int32 = 9081
|
usedNodePorts = make(map[int32]bool)
|
namespaces = []string{"guangsheng", "geruimi", "tongsheng"}
|
)
|
|
func rancher_install_test(node rancher.Node) {
|
/* nodes := []Node{
|
{
|
Roles: []string{"etcd", "controlplane", "worker"},
|
IP: "192.168.20.189",
|
SSHUsername: "basic",
|
SSHPassword: "123",
|
SSHPort: 22,
|
},
|
{
|
Roles: []string{"worker"},
|
IP: "192.168.20.10",
|
SSHUsername: "basic",
|
SSHPassword: "123",
|
SSHPort: 22,
|
},
|
{
|
Roles: []string{"worker"},
|
IP: "192.168.20.115",
|
SSHUsername: "basic",
|
SSHPassword: "alien123",
|
SSHPort: 22,
|
},
|
// Add more nodes here if needed
|
}*/
|
|
//install rancher on master node
|
err := rancher.InstallDockerAndRancher(node.IP, node.SSHUsername, node.SSHPassword, node.SSHPort)
|
if err != nil {
|
log.Fatalf("Failed to install Rancher: %v", err)
|
}
|
|
os.Exit(0)
|
}
|
|
func cluster_test(clusterName string, rancherClusterConfig rancher.RancherClusterConfig) {
|
|
// Create the cluster
|
// Rancher configuration
|
/*rancherConfig := RancherConfig{
|
RancherURL: "https://192.168.20.119:8443",
|
BearerToken: "token-nnrsc:w68zdt8s47fnpjd5xqdl5hhzpz4j2d56kt5nx49nsswcbpdzc28kh5",
|
}*/
|
|
fmt.Println(rancherClusterConfig)
|
fmt.Println(rancherClusterConfig.RancherURL)
|
fmt.Println(rancherClusterConfig.BearerToken)
|
// Deploy clusterId
|
clusterID, err := cluster.GetClusterID(rancherClusterConfig.RancherURL, rancherClusterConfig.BearerToken, clusterName)
|
if err != nil {
|
fmt.Printf("Cluster not found: %s %v\n", clusterName, err)
|
_, err = cluster.CreateCluster(rancherClusterConfig, clusterName)
|
if err != nil {
|
log.Fatalf("Failed to create cluster: %v", err)
|
}
|
fmt.Printf("Cluster created: %s\n", clusterName)
|
clusterID, err = cluster.GetClusterID(rancherClusterConfig.RancherURL, rancherClusterConfig.BearerToken, clusterName)
|
if err != nil {
|
log.Fatal(err)
|
}
|
}
|
fmt.Println(clusterID)
|
|
// Deploy nodeCommand
|
nodeCommand, err := cluster.GetNodeCommand(rancherClusterConfig.RancherURL, rancherClusterConfig.BearerToken, clusterID)
|
if err != nil {
|
log.Fatal(err)
|
}
|
fmt.Println(nodeCommand)
|
|
for _, node := range rancherClusterConfig.Nodes {
|
//Deploy Docker on each node
|
err = util.InstallDocker(node.IP, node.SSHUsername, node.SSHPassword, node.SSHPort)
|
if err != nil {
|
log.Fatal(err)
|
}
|
|
// Deploy Kubectl on each node
|
err = util.InstallKubectl(node.IP, node.SSHUsername, node.SSHPassword, node.SSHPort)
|
if err != nil {
|
log.Fatal(err)
|
}
|
|
// Deploy Kubernetes roles on each node
|
err = cluster.Deployk8sRolesOnNode(node.IP, node.SSHUsername, node.SSHPassword, nodeCommand, node.SSHPort, node.Roles)
|
if err != nil {
|
log.Fatal(err)
|
}
|
}
|
os.Exit(0)
|
}
|
|
func main() {
|
createCmd := flag.NewFlagSet("create", flag.ExitOnError)
|
deleteCmd := flag.NewFlagSet("delete", flag.ExitOnError)
|
testCmd := flag.NewFlagSet("test", flag.ExitOnError)
|
clusterCmd := flag.NewFlagSet("cluster", flag.ExitOnError)
|
rancherInstallCmd := flag.NewFlagSet("rancher_install", 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/cluster/rancher_install 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:])
|
case "cluster":
|
clusterCmd.Parse(os.Args[2:])
|
case "rancher_install":
|
rancherInstallCmd.Parse(os.Args[2:])
|
default:
|
flag.PrintDefaults()
|
os.Exit(1)
|
}
|
|
if rancherInstallCmd.Parsed() {
|
//// 初始化配置解析库
|
//viper.SetConfigName("config")
|
//viper.SetConfigType("yaml")
|
//viper.AddConfigPath("./config")
|
//
|
//// 读取配置文件
|
//err := viper.ReadInConfig()
|
//if err != nil {
|
// log.Fatalf("Failed to read config file: %v", err)
|
//}
|
|
// 解析配置文件中的字段
|
var rancherClusterConfig rancher.RancherClusterConfig
|
//err = viper.Unmarshal(&rancherClusterConfig)
|
//if err != nil {
|
// log.Fatalf("Failed to unmarshal config: %v", err)
|
//}
|
|
rancherClusterConfig.Nodes = make([]rancher.Node, 3)
|
rancherClusterConfig.Nodes[0] = rancher.Node{
|
Roles: []string{"worker"},
|
IP: "192.168.20.189",
|
SSHUsername: "basic",
|
SSHPassword: "123",
|
SSHPort: 22,
|
}
|
|
rancher_install_test(rancherClusterConfig.Nodes[0])
|
os.Exit(1)
|
}
|
|
// 执行 create 命令
|
if createCmd.Parsed() {
|
|
// 配置 Kubernetes 集群的 kubeconfig 路径
|
kubeconfig := flag.String("kubeconfig", filepath.Join(util.HomeDir(), ".kube", "config"), "kubeconfig file")
|
flag.Parse()
|
|
fmt.Println(&kubeconfig)
|
|
// 创建 Kubernetes 客户端
|
config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
|
if err != nil {
|
panic(err.Error())
|
}
|
|
fmt.Println(&config)
|
|
clientset, err := kubernetes.NewForConfig(config)
|
if err != nil {
|
panic(err.Error())
|
}
|
|
if *createNamespace == "" || *createDeployment == "" || *createService == "" {
|
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,
|
})
|
if err != nil {
|
panic(err)
|
}
|
|
nodeport, err := k8s.GetServiceNodePort(clientset, *createNamespace, *createService)
|
if err != nil {
|
panic(err)
|
}
|
|
log.Printf("Service NodePort: %d\n", nodeport)
|
}
|
|
// 执行 delete 命令
|
if deleteCmd.Parsed() {
|
// 配置 Kubernetes 集群的 kubeconfig 路径
|
kubeconfig := flag.String("kubeconfig", filepath.Join(util.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())
|
}
|
|
if *deleteNamespace == "" || *deleteDeployment == "" || *deleteService == "" {
|
fmt.Println("Namespace, Deployment, and Service names are required")
|
deleteCmd.PrintDefaults()
|
os.Exit(1)
|
}
|
|
err = k8s.DeleteResources(clientset, *deleteNamespace, *deleteDeployment, *deleteService)
|
if err != nil {
|
panic(err)
|
}
|
|
fmt.Println("Resources deleted.")
|
}
|
|
// 执行创建和删除测试
|
if testCmd.Parsed() {
|
// 配置 Kubernetes 集群的 kubeconfig 路径
|
kubeconfig := flag.String("kubeconfig", filepath.Join(util.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())
|
}
|
|
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 := k8s.CreateDeploymentAndService(k8s.Config{
|
Client: clientset,
|
NameSpace: ns,
|
DeploymentName: deploymentName,
|
ServiceName: serviceName,
|
})
|
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)
|
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 = k8s.DeleteResources(clientset, ns, ns, ns)
|
if err != nil {
|
panic(err)
|
}
|
}
|
|
fmt.Println("Resources deleted.")
|
}
|
|
if clusterCmd.Parsed() {
|
// 初始化配置解析库
|
viper.SetConfigName("config")
|
viper.SetConfigType("yaml")
|
viper.AddConfigPath("./config")
|
|
// 读取配置文件
|
err := viper.ReadInConfig()
|
if err != nil {
|
log.Fatalf("Failed to read config file: %v", err)
|
}
|
|
// 解析配置文件中的字段
|
var rancherClusterConfig rancher.RancherClusterConfig
|
err = viper.Unmarshal(&rancherClusterConfig)
|
if err != nil {
|
log.Fatalf("Failed to unmarshal config: %v", err)
|
}
|
clusterName := "kubernetus"
|
fmt.Println(rancherClusterConfig)
|
cluster_test(clusterName, rancherClusterConfig)
|
}
|
|
}
|