From 8a42fccced7dc176ac363b1ff3a1256016dcab04 Mon Sep 17 00:00:00 2001 From: pixiake Date: Tue, 12 May 2020 23:21:25 +0800 Subject: [PATCH] refactor cmd --- cmd/{scale.go => apply.go} | 6 +- cmd/create/etcd.go | 3 +- cmd/create/{clustercfg.go => manifest.go} | 4 +- cmd/kubesphere/apply.go | 1 + cmd/kubesphere/create.go | 1 + pkg/cluster/kubernetes/tmpl/kubeadm.go | 8 ++- pkg/config/default.go | 69 ++++++++++++++++++++++- pkg/container-engine/docker/docker.go | 16 +++--- pkg/images/default.go | 19 +++++-- pkg/images/images.go | 6 +- pkg/install/install.go | 2 +- pkg/reset/reset.go | 2 +- pkg/scale/scale.go | 2 +- 13 files changed, 109 insertions(+), 30 deletions(-) rename cmd/{scale.go => apply.go} (79%) rename cmd/create/{clustercfg.go => manifest.go} (99%) create mode 100644 cmd/kubesphere/apply.go create mode 100644 cmd/kubesphere/create.go diff --git a/cmd/scale.go b/cmd/apply.go similarity index 79% rename from cmd/scale.go rename to cmd/apply.go index d3d98d31..669cf6c3 100644 --- a/cmd/scale.go +++ b/cmd/apply.go @@ -13,8 +13,8 @@ func NewCmdScaleCluster() *cobra.Command { verbose bool ) var clusterCmd = &cobra.Command{ - Use: "scale", - Short: "Scale cluster", + Use: "apply", + Short: "Apply a configuration to a cluster by filename", RunE: func(cmd *cobra.Command, args []string) error { logger := util.InitLogger(verbose) return scale.ScaleCluster(clusterCfgFile, logger, pkgDir, Verbose) @@ -22,7 +22,7 @@ func NewCmdScaleCluster() *cobra.Command { } clusterCmd.Flags().StringVarP(&clusterCfgFile, "config", "f", "", "") - clusterCmd.Flags().StringVarP(&pkgDir, "pkg", "", "", "") + clusterCmd.Flags().StringVarP(&pkgDir, "pkg", "", "", "release package (offline)") clusterCmd.Flags().BoolVarP(&verbose, "debug", "", true, "") return clusterCmd } diff --git a/cmd/create/etcd.go b/cmd/create/etcd.go index 22b4b06e..38b300a6 100644 --- a/cmd/create/etcd.go +++ b/cmd/create/etcd.go @@ -27,11 +27,10 @@ func NewCmdCreateEtcd() *cobra.Command { } func createEtcdCluster(clusterCfgFile string, logger *log.Logger) { - config.ParseClusterCfg(clusterCfgFile, logger) + config.ParseClusterCfg(clusterCfgFile, "", logger) //allNodes, etcdNodes, _, _, _ := cfg.GroupHosts() //etcd.EtcdPrepare(etcdNodes) //etcd.GenEtcdFiles(cfg, allNodes, etcdNodes) //etcd.GetEtcdCtl(etcdNodes, "amd64") //etcd.SetupEtcd(etcdNodes) - } diff --git a/cmd/create/clustercfg.go b/cmd/create/manifest.go similarity index 99% rename from cmd/create/clustercfg.go rename to cmd/create/manifest.go index ca2d6e9e..5973c928 100644 --- a/cmd/create/clustercfg.go +++ b/cmd/create/manifest.go @@ -8,8 +8,8 @@ import ( func NewCmdCreateCfg() *cobra.Command { var addons, name string var clusterCfgCmd = &cobra.Command{ - Use: "config", - Short: "Create Cluster-Info Config", + Use: "manifest", + Short: "Create Cluster Info Manifest", RunE: func(cmd *cobra.Command, args []string) error { err := config.GenerateK2ClusterObj(addons, name) if err != nil { diff --git a/cmd/kubesphere/apply.go b/cmd/kubesphere/apply.go new file mode 100644 index 00000000..3d8743f5 --- /dev/null +++ b/cmd/kubesphere/apply.go @@ -0,0 +1 @@ +package kubesphere diff --git a/cmd/kubesphere/create.go b/cmd/kubesphere/create.go new file mode 100644 index 00000000..3d8743f5 --- /dev/null +++ b/cmd/kubesphere/create.go @@ -0,0 +1 @@ +package kubesphere diff --git a/pkg/cluster/kubernetes/tmpl/kubeadm.go b/pkg/cluster/kubernetes/tmpl/kubeadm.go index 5c0e6e17..07bf37b5 100644 --- a/pkg/cluster/kubernetes/tmpl/kubeadm.go +++ b/pkg/cluster/kubernetes/tmpl/kubeadm.go @@ -133,8 +133,14 @@ func GenerateKubeadmCfg(mgr *manager.Manager) (string, error) { externalEtcd.CertFile = certFile externalEtcd.KeyFile = keyFile + var imageRepo string + if mgr.Cluster.Registry.PrivateRegistry != "" { + imageRepo = fmt.Sprintf("%s/%s", mgr.Cluster.Registry.PrivateRegistry, mgr.Cluster.Kubernetes.ImageRepo) + } else { + imageRepo = mgr.Cluster.Kubernetes.ImageRepo + } return util.Render(KubeadmCfgTempl, util.Data{ - "ImageRepo": mgr.Cluster.Kubernetes.ImageRepo, + "ImageRepo": imageRepo, "Version": mgr.Cluster.Kubernetes.Version, "ClusterName": mgr.Cluster.Kubernetes.ClusterName, "ControlPlaneEndpoint": fmt.Sprintf("%s:%s", mgr.Cluster.ControlPlaneEndpoint.Address, mgr.Cluster.ControlPlaneEndpoint.Port), diff --git a/pkg/config/default.go b/pkg/config/default.go index 4077af44..1b5e02bf 100644 --- a/pkg/config/default.go +++ b/pkg/config/default.go @@ -12,9 +12,10 @@ import ( "os/user" "path/filepath" "strconv" + "strings" ) -func ParseClusterCfg(clusterCfgPath string, logger *log.Logger) (*kubekeyapi.K2Cluster, error) { +func ParseClusterCfg(clusterCfgPath, addons string, logger *log.Logger) (*kubekeyapi.K2Cluster, error) { clusterCfg := kubekeyapi.K2Cluster{} if len(clusterCfgPath) == 0 { @@ -22,7 +23,7 @@ func ParseClusterCfg(clusterCfgPath string, logger *log.Logger) (*kubekeyapi.K2C if user.Name != "root" { return nil, errors.New(fmt.Sprintf("Current user is %s, Please use root !", user.Name)) } - clusterCfg = AllinoneHost(user) + clusterCfg = AllinoneCfg(user, addons) } else { fp, err := filepath.Abs(clusterCfgPath) if err != nil { @@ -148,7 +149,7 @@ func SetDefaultClusterCfg(cfg *kubekeyapi.K2ClusterSpec) kubekeyapi.Kubernetes { return defaultClusterCfg } -func AllinoneHost(user *user.User) kubekeyapi.K2Cluster { +func AllinoneCfg(user *user.User, addons string) kubekeyapi.K2Cluster { allinoneCfg := kubekeyapi.K2Cluster{} if err := exec.Command("/bin/sh", "-c", "if [ ! -f \"$HOME/.ssh/id_rsa\" ]; then ssh-keygen -t rsa -P \"\" -f $HOME/.ssh/id_rsa && ls $HOME/.ssh;fi;").Run(); err != nil { log.Fatalf("Failed to generate public key: %v", err) @@ -166,5 +167,67 @@ func AllinoneHost(user *user.User) kubekeyapi.K2Cluster { Password: "", PrivateKeyPath: fmt.Sprintf("%s/.ssh/id_rsa", user.HomeDir), }) + + addonsList := strings.Split(addons, ",") + for _, addon := range addonsList { + switch strings.TrimSpace(addon) { + case "kubesphere": + allinoneCfg.Spec.Storage = kubekeyapi.Storage{ + DefaultStorageClass: "localVolume", + LocalVolume: kubekeyapi.LocalVolume{StorageClassName: "local"}, + } + allinoneCfg.Spec.KubeSphere = kubekeyapi.KubeSphere{ + Console: kubekeyapi.Console{ + EnableMultiLogin: false, + Port: 30880, + }, + Common: kubekeyapi.Common{ + MysqlVolumeSize: "20Gi", + MinioVolumeSize: "20Gi", + EtcdVolumeSize: "20Gi", + OpenldapVolumeSize: "2Gi", + RedisVolumSize: "2Gi", + }, + Openpitrix: kubekeyapi.Openpitrix{Enabled: false}, + Monitoring: kubekeyapi.Monitoring{ + PrometheusReplicas: 1, + PrometheusMemoryRequest: "400Mi", + PrometheusVolumeSize: "20Gi", + Grafana: kubekeyapi.Grafana{Enabled: false}, + }, + Logging: kubekeyapi.Logging{ + Enabled: false, + ElasticsearchMasterReplicas: 1, + ElasticsearchDataReplicas: 1, + LogsidecarReplicas: 2, + ElasticsearchMasterVolumeSize: "4Gi", + ElasticsearchDataVolumeSize: "20Gi", + LogMaxAge: 7, + ElkPrefix: "logstash", + Kibana: kubekeyapi.Kibana{Enabled: false}, + }, + Devops: kubekeyapi.Devops{ + Enabled: false, + JenkinsMemoryLim: "2Gi", + JenkinsMemoryReq: "1500Mi", + JenkinsVolumeSize: "8Gi", + JenkinsJavaOptsXms: "512m", + JenkinsJavaOptsXmx: "512m", + JenkinsJavaOptsMaxRAM: "2g", + Sonarqube: kubekeyapi.Sonarqube{ + Enabled: false, + PostgresqlVolumeSize: "8Gi", + }, + }, + Notification: kubekeyapi.Notification{Enabled: false}, + Alerting: kubekeyapi.Alerting{Enabled: false}, + ServiceMesh: kubekeyapi.ServiceMesh{Enabled: false}, + MetricsServer: kubekeyapi.MetricsServer{Enabled: false}, + } + case "": + default: + fmt.Println("This plugin is not supported: %s", strings.TrimSpace(addon)) + } + } return allinoneCfg } diff --git a/pkg/container-engine/docker/docker.go b/pkg/container-engine/docker/docker.go index 7fc1929b..385b454e 100644 --- a/pkg/container-engine/docker/docker.go +++ b/pkg/container-engine/docker/docker.go @@ -60,20 +60,20 @@ func InstallerDocker(mgr *manager.Manager) error { } func installDockerOnNode(mgr *manager.Manager, node *kubekeyapi.HostCfg, conn ssh.Connection) error { - cmd := "sudo sh -c \"[ -z $(which docker) ] && curl https://kubernetes.pek3b.qingstor.com/tools/kubekey/docker-install.sh | sh ; systemctl enable docker\"" - out, err := mgr.Runner.RunCmd(cmd) - if err != nil { - fmt.Println(out) - return errors.Wrap(errors.WithStack(err), "failed to install docker") - } + //cmd := "sudo sh -c \"if [ -z $(which docker) ]; then curl https://kubernetes.pek3b.qingstor.com/tools/kubekey/docker-install.sh | sh && systemctl enable docker; fi\"" + //out, err := mgr.Runner.RunCmd(cmd) + //if err != nil { + // fmt.Println(out) + // return errors.Wrap(errors.WithStack(err), "failed to install docker") + //} dockerConfig, err := GenerateDockerConfig(mgr) if err != nil { return err } dockerConfigBase64 := base64.StdEncoding.EncodeToString([]byte(dockerConfig)) - _, err1 := mgr.Runner.RunCmd(fmt.Sprintf("sudo -E /bin/sh -c \"echo %s | base64 -d > /etc/docker/daemon.json && systemctl reload docker\"", dockerConfigBase64)) + _, err1 := mgr.Runner.RunCmd(fmt.Sprintf("sudo -E /bin/sh -c \"if [ -z $(which docker) ]; then curl https://kubernetes.pek3b.qingstor.com/tools/kubekey/docker-install.sh | sh && systemctl enable docker && echo %s | base64 -d > /etc/docker/daemon.json && systemctl reload docker; fi\"", dockerConfigBase64)) if err1 != nil { - return errors.Wrap(errors.WithStack(err1), "failed to add docker config") + return errors.Wrap(errors.WithStack(err1), "failed to install docker") } return nil diff --git a/pkg/images/default.go b/pkg/images/default.go index 2db51cc5..67ffccdb 100644 --- a/pkg/images/default.go +++ b/pkg/images/default.go @@ -16,12 +16,12 @@ const ( func GetImage(mgr *manager.Manager, name string) *Image { var image Image ImageList := map[string]Image{ + "pause": {RepoAddr: "", Namespace: mgr.Cluster.Kubernetes.ImageRepo, Repo: "pause", Tag: "3.1", Group: K8s, Enable: true}, + "kube-apiserver": {RepoAddr: "", Namespace: mgr.Cluster.Kubernetes.ImageRepo, Repo: "kube-apiserver", Tag: mgr.Cluster.Kubernetes.Version, Group: Master, Enable: true}, + "kube-controller-manager": {RepoAddr: "", Namespace: mgr.Cluster.Kubernetes.ImageRepo, Repo: "kube-controller-manager", Tag: mgr.Cluster.Kubernetes.Version, Group: Master, Enable: true}, + "kube-scheduler": {RepoAddr: "", Namespace: mgr.Cluster.Kubernetes.ImageRepo, Repo: "kube-scheduler", Tag: mgr.Cluster.Kubernetes.Version, Group: Master, Enable: true}, + "kube-proxy": {RepoAddr: "", Namespace: mgr.Cluster.Kubernetes.ImageRepo, Repo: "kube-proxy", Tag: mgr.Cluster.Kubernetes.Version, Group: K8s, Enable: true}, "etcd": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "kubesphere", Repo: "etcd", Tag: kubekeyapi.DefaultEtcdVersion, Group: Etcd, Enable: true}, - "pause": {RepoAddr: "", Namespace: kubekeyapi.DefaultKubeImageRepo, Repo: "pause", Tag: "3.1", Group: K8s, Enable: true}, - "kube-apiserver": {RepoAddr: "", Namespace: kubekeyapi.DefaultKubeImageRepo, Repo: "kube-apiserver", Tag: mgr.Cluster.Kubernetes.Version, Group: Master, Enable: true}, - "kube-controller-manager": {RepoAddr: "", Namespace: kubekeyapi.DefaultKubeImageRepo, Repo: "kube-controller-manager", Tag: mgr.Cluster.Kubernetes.Version, Group: Master, Enable: true}, - "kube-scheduler": {RepoAddr: "", Namespace: kubekeyapi.DefaultKubeImageRepo, Repo: "kube-scheduler", Tag: mgr.Cluster.Kubernetes.Version, Group: Master, Enable: true}, - "kube-proxy": {RepoAddr: "", Namespace: kubekeyapi.DefaultKubeImageRepo, Repo: "kube-proxy", Tag: mgr.Cluster.Kubernetes.Version, Group: K8s, Enable: true}, "coredns": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "coredns", Repo: "coredns", Tag: "1.6.0", Group: K8s, Enable: true}, "k8s-dns-node-cache": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "kubesphere", Repo: "k8s-dns-node-cache", Tag: "1.15.12", Group: K8s, Enable: true}, "calico-kube-controllers": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "calico", Repo: "kube-controllers", Tag: kubekeyapi.DefaultCalicoVersion, Group: K8s, Enable: strings.EqualFold(mgr.Cluster.Network.Plugin, "calico")}, @@ -30,6 +30,15 @@ func GetImage(mgr *manager.Manager, name string) *Image { "calico-flexvol": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "calico", Repo: "pod2daemon-flexvol", Tag: kubekeyapi.DefaultCalicoVersion, Group: K8s, Enable: strings.EqualFold(mgr.Cluster.Network.Plugin, "calico")}, "flannel": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "kubesphere", Repo: "flannel", Tag: kubekeyapi.DefaultFlannelVersion, Group: K8s, Enable: strings.EqualFold(mgr.Cluster.Network.Plugin, "flannel")}, } + + if mgr.Cluster.Registry.PrivateRegistry != "" { + ImageList["pause"] = Image{RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: mgr.Cluster.Kubernetes.ImageRepo, Repo: "pause", Tag: "3.1", Group: K8s, Enable: true} + ImageList["kube-apiserver"] = Image{RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: mgr.Cluster.Kubernetes.ImageRepo, Repo: "kube-apiserver", Tag: mgr.Cluster.Kubernetes.Version, Group: Master, Enable: true} + ImageList["kube-controller-manager"] = Image{RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: mgr.Cluster.Kubernetes.ImageRepo, Repo: "kube-controller-manager", Tag: mgr.Cluster.Kubernetes.Version, Group: Master, Enable: true} + ImageList["kube-scheduler"] = Image{RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: mgr.Cluster.Kubernetes.ImageRepo, Repo: "kube-scheduler", Tag: mgr.Cluster.Kubernetes.Version, Group: Master, Enable: true} + ImageList["kube-proxy"] = Image{RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: mgr.Cluster.Kubernetes.ImageRepo, Repo: "kube-proxy", Tag: mgr.Cluster.Kubernetes.Version, Group: Master, Enable: true} + } + image = ImageList[name] return &image } diff --git a/pkg/images/images.go b/pkg/images/images.go index 11a6aaf0..ddd14d92 100644 --- a/pkg/images/images.go +++ b/pkg/images/images.go @@ -63,21 +63,21 @@ func preDownloadImages(mgr *manager.Manager, node *kubekeyapi.HostCfg, conn ssh. for _, image := range imagesList { if node.IsMaster && image.Group == "master" && image.Enable { - fmt.Printf("[%s] Downloading image: %s\n", node.Name, image.ImageName()) + fmt.Printf("[%s] Download image: %s\n", node.Name, image.ImageName()) _, err := mgr.Runner.RunCmd(fmt.Sprintf("sudo -E docker pull %s", image.ImageName())) if err != nil { return errors.Wrap(errors.WithStack(err), fmt.Sprintf("failed to download image: %s", image.ImageName())) } } if (node.IsMaster || node.IsWorker) && image.Group == "k8s" && image.Enable { - fmt.Printf("[%s] Downloading image: %s\n", node.Name, image.ImageName()) + fmt.Printf("[%s] Download image: %s\n", node.Name, image.ImageName()) _, err := mgr.Runner.RunCmd(fmt.Sprintf("sudo -E docker pull %s", image.ImageName())) if err != nil { return errors.Wrap(errors.WithStack(err), fmt.Sprintf("failed to download image: %s", image.ImageName())) } } if node.IsEtcd && image.Group == "etcd" && image.Enable { - fmt.Printf("[%s] Downloading image: %s\n", node.Name, image.ImageName()) + fmt.Printf("[%s] Download image: %s\n", node.Name, image.ImageName()) _, err := mgr.Runner.RunCmd(fmt.Sprintf("sudo -E docker pull %s", image.ImageName())) if err != nil { return errors.Wrap(errors.WithStack(err), fmt.Sprintf("failed to download image: %s", image.ImageName())) diff --git a/pkg/install/install.go b/pkg/install/install.go index a1d51702..90f64b44 100644 --- a/pkg/install/install.go +++ b/pkg/install/install.go @@ -18,7 +18,7 @@ import ( ) func CreateCluster(clusterCfgFile string, logger *log.Logger, addons, pkg string, verbose bool) error { - cfg, err := config.ParseClusterCfg(clusterCfgFile, logger) + cfg, err := config.ParseClusterCfg(clusterCfgFile, addons, logger) if err != nil { return errors.Wrap(err, "failed to download cluster config") } diff --git a/pkg/reset/reset.go b/pkg/reset/reset.go index 551eb477..cc142e3e 100644 --- a/pkg/reset/reset.go +++ b/pkg/reset/reset.go @@ -12,7 +12,7 @@ import ( ) func ResetCluster(clusterCfgFile string, logger *log.Logger, verbose bool) error { - cfg, err := config.ParseClusterCfg(clusterCfgFile, logger) + cfg, err := config.ParseClusterCfg(clusterCfgFile, "", logger) if err != nil { return errors.Wrap(err, "failed to download cluster config") } diff --git a/pkg/scale/scale.go b/pkg/scale/scale.go index 16de104b..ed9dafd0 100644 --- a/pkg/scale/scale.go +++ b/pkg/scale/scale.go @@ -12,7 +12,7 @@ import ( ) func ScaleCluster(clusterCfgFile string, logger *log.Logger, pkg string, verbose bool) error { - cfg, err := config.ParseClusterCfg(clusterCfgFile, logger) + cfg, err := config.ParseClusterCfg(clusterCfgFile, "", logger) if err != nil { return errors.Wrap(err, "failed to download cluster config") }