diff --git a/pkg/cluster/etcd/tmpl/certs.go b/pkg/cluster/etcd/tmpl/certs.go index ab75bc27..8511e940 100644 --- a/pkg/cluster/etcd/tmpl/certs.go +++ b/pkg/cluster/etcd/tmpl/certs.go @@ -17,20 +17,23 @@ limitations under the License. package tmpl import ( + "strings" + "text/template" + kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" "github.com/kubesphere/kubekey/pkg/util" "github.com/kubesphere/kubekey/pkg/util/manager" "github.com/lithammer/dedent" - "strings" - "text/template" ) +// Add is used in the template to implement the addition operation. func Add(a int, b int) int { return a + b } var ( - funcMap = template.FuncMap{"Add": Add} + funcMap = template.FuncMap{"Add": Add} + // EtcdSslCfgTempl defines the template of openssl's configuration for etcd. EtcdSslCfgTempl = template.Must(template.New("etcdSslCfg").Funcs(funcMap).Parse( dedent.Dedent(`[req] req_extensions = v3_req @@ -66,6 +69,7 @@ IP.{{ Add $i 1 }} = {{ $v }} `))) + // EtcdSslTempl defines the template of the script for generating etcd certs. EtcdSslTempl = template.Must(template.New("etcdSsl").Parse( dedent.Dedent(`#!/bin/bash @@ -176,6 +180,7 @@ mv *.pem ${SSLDIR}/ `))) ) +// GenerateEtcdSslCfg is used to generate openssl configuration content for etcd. func GenerateEtcdSslCfg(cfg *kubekeyapiv1alpha1.ClusterSpec) (string, error) { dnsList := []string{"localhost", "etcd.kube-system.svc.cluster.local", "etcd.kube-system.svc", "etcd.kube-system", "etcd"} ipList := []string{"127.0.0.1"} @@ -197,10 +202,10 @@ func GenerateEtcdSslCfg(cfg *kubekeyapiv1alpha1.ClusterSpec) (string, error) { }) } +// GenerateEtcdSslScript is used to generate the script content for generating etcd certs. func GenerateEtcdSslScript(mgr *manager.Manager) (string, error) { var masters []string var hosts []string - //_, etcdNodes, masterNodes, _, _ , _:= cfg.GroupHosts() for _, host := range mgr.EtcdNodes { masters = append(masters, host.Name) diff --git a/pkg/cluster/etcd/tmpl/etcd.go b/pkg/cluster/etcd/tmpl/etcd.go index 77065f92..5b98f16f 100644 --- a/pkg/cluster/etcd/tmpl/etcd.go +++ b/pkg/cluster/etcd/tmpl/etcd.go @@ -18,16 +18,18 @@ package tmpl import ( "fmt" + "strings" + "text/template" + kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" "github.com/kubesphere/kubekey/pkg/cluster/preinstall" "github.com/kubesphere/kubekey/pkg/util" "github.com/kubesphere/kubekey/pkg/util/manager" "github.com/lithammer/dedent" - "strings" - "text/template" ) var ( + // EtcdServiceTempl defines the template of etcd's service for systemd. EtcdServiceTempl = template.Must(template.New("EtcdService").Parse( dedent.Dedent(`[Unit] {{- if .EtcdContainer }} @@ -63,6 +65,7 @@ Restart=always WantedBy=multi-user.target `))) + // EtcdEnvTempl defines the template of etcd's env. EtcdEnvTempl = template.Must(template.New("etcdEnv").Parse( dedent.Dedent(`# Environment file for etcd {{ .Tag }} ETCD_DATA_DIR=/var/lib/etcd @@ -103,6 +106,7 @@ ETCDCTL_KEY_FILE=/etc/ssl/etcd/ssl/admin-{{ .Hostname }}-key.pem ETCDCTL_CERT_FILE=/etc/ssl/etcd/ssl/admin-{{ .Hostname }}.pem `))) + // EtcdTempl defines the template of etcd's container binary. EtcdTempl = template.Must(template.New("etcd").Parse( dedent.Dedent(`#!/bin/bash /usr/bin/docker run \ @@ -121,6 +125,7 @@ ETCDCTL_CERT_FILE=/etc/ssl/etcd/ssl/admin-{{ .Hostname }}.pem `))) ) +// GenerateEtcdBinary is used to generate etcd's container binary content. func GenerateEtcdBinary(mgr *manager.Manager, index int) (string, error) { return util.Render(EtcdTempl, util.Data{ "Name": fmt.Sprintf("etcd%d", index+1), @@ -128,6 +133,7 @@ func GenerateEtcdBinary(mgr *manager.Manager, index int) (string, error) { }) } +// GenerateEtcdService is used to generate the etcd's service content for systemd. func GenerateEtcdService(index int, etcdContainer bool) (string, error) { return util.Render(EtcdServiceTempl, util.Data{ "Name": fmt.Sprintf("etcd%d", index+1), @@ -135,6 +141,7 @@ func GenerateEtcdService(index int, etcdContainer bool) (string, error) { }) } +// GenerateEtcdEnv is used to generate the etcd's env content. func GenerateEtcdEnv(node *kubekeyapiv1alpha1.HostCfg, index int, endpoints []string, state string) (string, error) { UnsupportedArch := false if node.Arch != "amd64" { diff --git a/pkg/cluster/etcd/tmpl/etcdbackup.go b/pkg/cluster/etcd/tmpl/etcdbackup.go index bd74e478..a30692bf 100644 --- a/pkg/cluster/etcd/tmpl/etcdbackup.go +++ b/pkg/cluster/etcd/tmpl/etcdbackup.go @@ -3,15 +3,17 @@ package tmpl import ( "errors" "fmt" + "strconv" + "strings" + "text/template" + kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" "github.com/kubesphere/kubekey/pkg/util" "github.com/kubesphere/kubekey/pkg/util/manager" "github.com/lithammer/dedent" - "strconv" - "strings" - "text/template" ) +// EtcdBackupScriptTmpl defines the template of etcd backup script. var EtcdBackupScriptTmpl = template.Must(template.New("etcdBackupScript").Parse( dedent.Dedent(`#!/bin/bash @@ -62,6 +64,7 @@ rm -rf /tmp/file `))) +// EtcdBackupScript is used to generate etcd backup script content. func EtcdBackupScript(mgr *manager.Manager, node *kubekeyapiv1alpha1.HostCfg) (string, error) { ips := []string{} var etcdBackupHour string @@ -75,7 +78,8 @@ func EtcdBackupScript(mgr *manager.Manager, node *kubekeyapiv1alpha1.HostCfg) (s etcdBackupHour = strconv.Itoa(period / 60) } if period > 1440 { - return "", errors.New("Etcd backup cannot last more than one day, Please change it to within one day.") + fmt.Println("Etcd backup cannot last more than one day, Please change it to within one day.") + return "", errors.New("etcd backup cannot last more than one day") } } diff --git a/pkg/cluster/kubernetes/tmpl/kubeadm.go b/pkg/cluster/kubernetes/tmpl/kubeadm.go index 726e0279..69ac8628 100644 --- a/pkg/cluster/kubernetes/tmpl/kubeadm.go +++ b/pkg/cluster/kubernetes/tmpl/kubeadm.go @@ -29,7 +29,7 @@ import ( "github.com/pkg/errors" ) -// KubeadmCfgTempl define the template of kubeadm configuration file. +// KubeadmCfgTempl defines the template of kubeadm configuration file. var KubeadmCfgTempl = template.Must(template.New("kubeadmCfg").Parse( dedent.Dedent(`--- apiVersion: kubeadm.k8s.io/v1beta2 @@ -45,7 +45,7 @@ etcd: keyFile: {{ .ExternalEtcd.KeyFile }} dns: type: CoreDNS - imageRepository: {{ .CorednsRepo }}coredns + imageRepository: {{ .CorednsRepo }} imageTag: {{ .CorednsTag }} imageRepository: {{ .ImageRepo }} kubernetesVersion: {{ .Version }} @@ -102,7 +102,7 @@ scheduler: --- apiVersion: kubeadm.k8s.io/v1beta2 kind: InitConfiguration -nodeRegistration: +nodeRegistration:ClusterCfgTempl criSocket: {{ .CriSock }} {{- end }} --- @@ -195,21 +195,6 @@ func GenerateKubeadmCfg(mgr *manager.Manager) (string, error) { externalEtcd.CertFile = certFile externalEtcd.KeyFile = keyFile - // generate images repo configuration - var imageRepo string - if mgr.Cluster.Registry.PrivateRegistry != "" { - imageRepo = fmt.Sprintf("%s/%s", mgr.Cluster.Registry.PrivateRegistry, kubekeyapiv1alpha1.DefaultKubeImageNamespace) - } else { - imageRepo = kubekeyapiv1alpha1.DefaultKubeImageNamespace - } - - var corednsRepo string - if mgr.Cluster.Registry.PrivateRegistry != "" { - corednsRepo = fmt.Sprintf("%s/", mgr.Cluster.Registry.PrivateRegistry) - } else { - corednsRepo = "" - } - // generate cri configuration switch mgr.Cluster.Kubernetes.ContainerManager { case "docker": @@ -234,8 +219,8 @@ func GenerateKubeadmCfg(mgr *manager.Manager) (string, error) { } return util.Render(KubeadmCfgTempl, util.Data{ - "ImageRepo": imageRepo, - "CorednsRepo": corednsRepo, + "ImageRepo": strings.TrimSuffix(preinstall.GetImage(mgr, "kube-apiserver").ImageRepo(), "/kube-apiserver"), + "CorednsRepo": strings.TrimSuffix(preinstall.GetImage(mgr, "coredns").ImageRepo(), "/coredns"), "CorednsTag": preinstall.GetImage(mgr, "coredns").Tag, "Version": mgr.Cluster.Kubernetes.Version, "ClusterName": mgr.Cluster.Kubernetes.ClusterName, diff --git a/pkg/cluster/kubernetes/tmpl/kubelet.go b/pkg/cluster/kubernetes/tmpl/kubelet.go index 4e8e354c..4616e990 100644 --- a/pkg/cluster/kubernetes/tmpl/kubelet.go +++ b/pkg/cluster/kubernetes/tmpl/kubelet.go @@ -26,6 +26,7 @@ import ( ) var ( + // KubeletServiceTempl defines the template of kubelete service for systemd. KubeletServiceTempl = template.Must(template.New("kubeletService").Parse( dedent.Dedent(`[Unit] Description=kubelet: The Kubernetes Node Agent @@ -41,6 +42,7 @@ RestartSec=10 WantedBy=multi-user.target `))) + // KubeletEnvTempl defines the template of kubelet's Env for the kubelet's systemd service. KubeletEnvTempl = template.Must(template.New("kubeletEnv").Parse( dedent.Dedent(`# Note: This dropin only works with kubeadm and kubelet v1.11+ [Service] @@ -57,10 +59,12 @@ ExecStart=/usr/local/bin/kubelet $KUBELET_KUBECONFIG_ARGS $KUBELET_CONFIG_ARGS $ `))) ) +// GenerateKubeletService is used to generate kubelet's service content for systemd. func GenerateKubeletService() (string, error) { return util.Render(KubeletServiceTempl, util.Data{}) } +// GenerateKubeletEnv is used to generate the env content of kubelet's service for systemd. func GenerateKubeletEnv(mgr *manager.Manager, node *kubekeyapiv1alpha1.HostCfg) (string, error) { var containerRuntime string diff --git a/pkg/cluster/preinstall/prepull_images.go b/pkg/cluster/preinstall/prepull_images.go index cbb1a765..ace09bef 100644 --- a/pkg/cluster/preinstall/prepull_images.go +++ b/pkg/cluster/preinstall/prepull_images.go @@ -77,11 +77,11 @@ func GetImage(mgr *manager.Manager, name string) images.Image { } ImageList := map[string]images.Image{ - "pause": {RepoAddr: "", Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "pause", Tag: pauseTag, Group: kubekeyapiv1alpha1.K8s, Enable: true}, - "kube-apiserver": {RepoAddr: "", Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-apiserver", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.Master, Enable: true}, - "kube-controller-manager": {RepoAddr: "", Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-controller-manager", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.Master, Enable: true}, - "kube-scheduler": {RepoAddr: "", Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-scheduler", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.Master, Enable: true}, - "kube-proxy": {RepoAddr: "", Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-proxy", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.K8s, Enable: true}, + "pause": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "pause", Tag: pauseTag, Group: kubekeyapiv1alpha1.K8s, Enable: true}, + "kube-apiserver": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-apiserver", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.Master, Enable: true}, + "kube-controller-manager": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-controller-manager", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.Master, Enable: true}, + "kube-scheduler": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-scheduler", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.Master, Enable: true}, + "kube-proxy": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-proxy", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.K8s, Enable: true}, "etcd": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "etcd", Tag: kubekeyapiv1alpha1.DefaultEtcdVersion, Group: kubekeyapiv1alpha1.Etcd, Enable: true}, // network "coredns": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "coredns", Repo: "coredns", Tag: "1.6.9", Group: kubekeyapiv1alpha1.K8s, Enable: true}, @@ -96,19 +96,8 @@ func GetImage(mgr *manager.Manager, name string) images.Image { "operator-generic": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "cilium", Repo: "operator-generic", Tag: kubekeyapiv1alpha1.DefaultCiliumVersion, Group: kubekeyapiv1alpha1.K8s, Enable: strings.EqualFold(mgr.Cluster.Network.Plugin, "cilium")}, "kubeovn": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "kubeovn", Repo: "kube-ovn", Tag: kubekeyapiv1alpha1.DefaultKubeovnVersion, Group: kubekeyapiv1alpha1.K8s, Enable: strings.EqualFold(mgr.Cluster.Network.Plugin, "kubeovn")}, // storage - "provisioner-localpv": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "kubesphere", Repo: "provisioner-localpv", Tag: "2.3.0", Group: kubekeyapiv1alpha1.Worker, Enable: false}, - "openebs-tools": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "kubesphere", Repo: "openebs-tools", Tag: "3.8", Group: kubekeyapiv1alpha1.Worker, Enable: false}, - "linux-utils": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "kubesphere", Repo: "linux-utils", Tag: "2.3.0", Group: kubekeyapiv1alpha1.Worker, Enable: false}, - "rbd-provisioner": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "kubesphere", Repo: "rbd-provisioner", Tag: "v2.1.1-k8s1.11", Group: kubekeyapiv1alpha1.Worker, Enable: false}, - "nfs-client-provisioner": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "kubesphere", Repo: "nfs-client-provisioner", Tag: "v3.1.0-k8s1.11", Group: kubekeyapiv1alpha1.Worker, Enable: false}, - } - - if mgr.Cluster.Registry.PrivateRegistry != "" { - ImageList["pause"] = images.Image{RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "pause", Tag: pauseTag, Group: kubekeyapiv1alpha1.K8s, Enable: true} - ImageList["kube-apiserver"] = images.Image{RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-apiserver", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.Master, Enable: true} - ImageList["kube-controller-manager"] = images.Image{RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-controller-manager", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.Master, Enable: true} - ImageList["kube-scheduler"] = images.Image{RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-scheduler", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.Master, Enable: true} - ImageList["kube-proxy"] = images.Image{RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: kubekeyapiv1alpha1.DefaultKubeImageNamespace, Repo: "kube-proxy", Tag: mgr.Cluster.Kubernetes.Version, Group: kubekeyapiv1alpha1.Master, Enable: true} + "provisioner-localpv": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "openebs", Repo: "provisioner-localpv", Tag: "2.3.0", Group: kubekeyapiv1alpha1.Worker, Enable: false}, + "linux-utils": {RepoAddr: mgr.Cluster.Registry.PrivateRegistry, Namespace: "openebs", Repo: "linux-utils", Tag: "2.3.0", Group: kubekeyapiv1alpha1.Worker, Enable: false}, } image = ImageList[name] diff --git a/pkg/config/from_cluster.go b/pkg/config/from_cluster.go index 9b3a5a84..515ed113 100644 --- a/pkg/config/from_cluster.go +++ b/pkg/config/from_cluster.go @@ -21,21 +21,23 @@ import ( "context" "encoding/base64" "fmt" - kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" - "github.com/kubesphere/kubekey/pkg/util" - "github.com/lithammer/dedent" - "github.com/pkg/errors" - "github.com/spf13/viper" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "net" "os" "os/exec" "path/filepath" "strings" "text/template" + + kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" + "github.com/kubesphere/kubekey/pkg/util" + "github.com/lithammer/dedent" + "github.com/pkg/errors" + "github.com/spf13/viper" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) var ( + // ClusterCfgTempl defines the template of cluster configuration file for the existing cluster. ClusterCfgTempl = template.Must(template.New("ClusterCfg").Parse( dedent.Dedent(`apiVersion: kubekey.kubesphere.io/v1alpha1 kind: Cluster @@ -65,7 +67,6 @@ spec: port: {{ .Options.ControlPlaneEndpointPort }} kubernetes: version: {{ .Options.KubeVersion }} - imageRepo: kubesphere clusterName: {{ .Options.ClusterName }} proxyMode: {{ .Options.ProxyMode }} masqueradeAll: {{ .Options.MasqueradeAll }} @@ -81,12 +82,14 @@ spec: `))) ) +// GenerateClusterCfgStr is used to generate cluster configuration content. func GenerateClusterCfgStr(opt *OptionsCluster) (string, error) { return util.Render(ClusterCfgTempl, util.Data{ "Options": opt, }) } +// OptionsCluster defineds the parameters of cluster configuration for the existing cluster. type OptionsCluster struct { Name string Hosts []string @@ -107,6 +110,7 @@ type OptionsCluster struct { ControlPlaneEndpointPort string } +// GetInfoFromCluster is used to fetch information from the existing cluster. func GetInfoFromCluster(config, name string) (*OptionsCluster, error) { clientset, err := util.NewClient(config) if err != nil { @@ -223,6 +227,7 @@ func GetInfoFromCluster(config, name string) (*OptionsCluster, error) { return &opt, nil } +// GenerateConfigFromCluster is used to generate cluster configuration file from the existing cluster's information. func GenerateConfigFromCluster(cfgPath, kubeconfig, name string) error { opt, err := GetInfoFromCluster(kubeconfig, name) if err != nil { diff --git a/pkg/config/generate.go b/pkg/config/generate.go index ca95fa6b..842a04c1 100644 --- a/pkg/config/generate.go +++ b/pkg/config/generate.go @@ -20,19 +20,21 @@ import ( "bufio" "encoding/base64" "fmt" - kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" - "github.com/kubesphere/kubekey/pkg/kubesphere" - "github.com/kubesphere/kubekey/pkg/util" - "github.com/lithammer/dedent" - "github.com/pkg/errors" "os" "os/exec" "path/filepath" "strings" "text/template" + + kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" + "github.com/kubesphere/kubekey/pkg/kubesphere" + "github.com/kubesphere/kubekey/pkg/util" + "github.com/lithammer/dedent" + "github.com/pkg/errors" ) var ( + // ClusterObjTempl defines the template of cluster configuration file default. ClusterObjTempl = template.Must(template.New("Cluster").Parse( dedent.Dedent(`apiVersion: kubekey.kubesphere.io/v1alpha1 kind: Cluster @@ -73,6 +75,7 @@ spec: `))) ) +// Options defineds the parameters of cluster configuration. type Options struct { Name string KubeVersion string @@ -80,6 +83,7 @@ type Options struct { KubeSphereConfigMap string } +// GenerateClusterObjStr is used to generate cluster configuration content. func GenerateClusterObjStr(opt *Options) (string, error) { return util.Render(ClusterObjTempl, util.Data{ "KubeVersion": kubekeyapiv1alpha1.DefaultKubeVersion, @@ -87,6 +91,7 @@ func GenerateClusterObjStr(opt *Options) (string, error) { }) } +// GenerateClusterObj is used to generate cluster configuration file func GenerateClusterObj(k8sVersion, ksVersion, name, kubeconfig, clusterCfgPath string, ksEnabled, fromCluster bool) error { if fromCluster { err := GenerateConfigFromCluster(clusterCfgPath, kubeconfig, name) @@ -152,6 +157,7 @@ func GenerateClusterObj(k8sVersion, ksVersion, name, kubeconfig, clusterCfgPath return nil } +// CheckConfigFileStatus is used to check the status of cluster configuration file. func CheckConfigFileStatus(path string) { if util.IsExist(path) { reader := bufio.NewReader(os.Stdin) diff --git a/pkg/config/parse.go b/pkg/config/parse.go index 9211b28f..64f6b641 100644 --- a/pkg/config/parse.go +++ b/pkg/config/parse.go @@ -19,6 +19,13 @@ package config import ( "bufio" "fmt" + "os" + "os/exec" + "os/user" + "path/filepath" + "runtime" + "strings" + kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" "github.com/kubesphere/kubekey/pkg/kubesphere" "github.com/kubesphere/kubekey/pkg/util" @@ -26,14 +33,9 @@ import ( log "github.com/sirupsen/logrus" "gopkg.in/yaml.v2" k8syaml "k8s.io/apimachinery/pkg/util/yaml" - "os" - "os/exec" - "os/user" - "path/filepath" - "runtime" - "strings" ) +// ParseClusterCfg is used to generate Cluster object and cluster's name. func ParseClusterCfg(clusterCfgPath, k8sVersion, ksVersion string, ksEnabled bool, logger *log.Logger) (*kubekeyapiv1alpha1.Cluster, string, error) { var ( clusterCfg *kubekeyapiv1alpha1.Cluster @@ -56,6 +58,7 @@ func ParseClusterCfg(clusterCfgPath, k8sVersion, ksVersion string, ksEnabled boo return clusterCfg, objName, nil } +// ParseCfg is used to parse the specified cluster configuration file. func ParseCfg(clusterCfgPath, k8sVersion, ksVersion string, ksEnabled bool) (*kubekeyapiv1alpha1.Cluster, string, error) { var objName string clusterCfg := kubekeyapiv1alpha1.Cluster{} @@ -107,7 +110,7 @@ func ParseCfg(clusterCfgPath, k8sVersion, ksVersion string, ksEnabled bool) (*ku clusterCfg.Spec.KubeSphere.Configurations = "---\n" + string(content) clusterCfg.Spec.KubeSphere.Version = "v2.1.1" default: - return nil, "", errors.Wrap(err, fmt.Sprintf("Unsupported versions: %s", labels["version"])) + return nil, "", errors.Wrap(err, fmt.Sprintf("Unsupported version: %s", labels["version"])) } } } @@ -125,6 +128,9 @@ func ParseCfg(clusterCfgPath, k8sVersion, ksVersion string, ksEnabled bool) (*ku case "v2.1.1": clusterCfg.Spec.KubeSphere.Version = "v2.1.1" clusterCfg.Spec.KubeSphere.Configurations = kubesphere.V2_1_1 + case "latest": + clusterCfg.Spec.KubeSphere.Version = "latest" + clusterCfg.Spec.KubeSphere.Configurations = kubesphere.V3_0_0 default: return nil, "", errors.New(fmt.Sprintf("Unsupported version: %s", strings.TrimSpace(ksVersion))) } @@ -133,6 +139,7 @@ func ParseCfg(clusterCfgPath, k8sVersion, ksVersion string, ksEnabled bool) (*ku return &clusterCfg, objName, nil } +// AllinoneCfg is used to generate cluster object for all-in-one mode. func AllinoneCfg(user *user.User, k8sVersion, ksVersion string, ksEnabled bool, logger *log.Logger) (*kubekeyapiv1alpha1.Cluster, string) { allinoneCfg := kubekeyapiv1alpha1.Cluster{} if output, 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;").CombinedOutput(); err != nil { @@ -185,6 +192,9 @@ func AllinoneCfg(user *user.User, k8sVersion, ksVersion string, ksEnabled bool, case "v2.1.1": allinoneCfg.Spec.KubeSphere.Version = "v2.1.1" allinoneCfg.Spec.KubeSphere.Configurations = kubesphere.V2_1_1 + case "latest": + allinoneCfg.Spec.KubeSphere.Version = "latest" + allinoneCfg.Spec.KubeSphere.Configurations = kubesphere.V3_0_0 default: logger.Fatalf("Unsupported version: %s", strings.TrimSpace(ksVersion)) } diff --git a/pkg/deploy/kubesphere.go b/pkg/deploy/kubesphere.go index a4dd3259..e2c77ae7 100644 --- a/pkg/deploy/kubesphere.go +++ b/pkg/deploy/kubesphere.go @@ -21,12 +21,13 @@ import ( "bytes" "context" "fmt" + "strings" + "github.com/kubesphere/kubekey/pkg/addons/manifests" "github.com/kubesphere/kubekey/pkg/kubesphere" "github.com/kubesphere/kubekey/pkg/util" "github.com/pkg/errors" k8syaml "k8s.io/apimachinery/pkg/util/yaml" - "strings" ) func DeployKubeSphere(version, repo, kubeconfig string) error { @@ -45,9 +46,9 @@ func DeployKubeSphere(version, repo, kubeconfig string) error { return err } installerYaml = str - case "v3.0.0": + case "v3.0.0", "latest": kubesphereConfig = kubesphere.V3_0_0 - str, err := kubesphere.GenerateKubeSphereYaml(repo, "v3.0.0") + str, err := kubesphere.GenerateKubeSphereYaml(repo, version) if err != nil { return err } diff --git a/pkg/images/images.go b/pkg/images/images.go index 9759f21f..6f6a4ac7 100644 --- a/pkg/images/images.go +++ b/pkg/images/images.go @@ -18,47 +18,50 @@ package images import ( "fmt" + "os" + kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" "github.com/kubesphere/kubekey/pkg/util/manager" "github.com/pkg/errors" ) +const ( + cnRegistry = "registry.cn-beijing.aliyuncs.com" + cnNamespaceOverride = "kubesphereio" +) + +// Image defines image's info. type Image struct { - RepoAddr string - Namespace string - Repo string - Tag string - Group string - Enable bool + RepoAddr string + Namespace string + NamespaceOverride string + Repo string + Tag string + Group string + Enable bool } +// Images contains a list of Image type Images struct { Images []Image } +// ImageName is used to generate image's full name. func (image Image) ImageName() string { - var prefix string - - if image.RepoAddr == "" { - if image.Namespace == "" { - prefix = "" - } else { - prefix = fmt.Sprintf("%s/", image.Namespace) - } - } else { - if image.Namespace == "" { - prefix = fmt.Sprintf("%s/library/", image.RepoAddr) - } else { - prefix = fmt.Sprintf("%s/%s/", image.RepoAddr, image.Namespace) - } - } - - return fmt.Sprintf("%s%s:%s", prefix, image.Repo, image.Tag) + return fmt.Sprintf("%s:%s", image.ImageRepo(), image.Tag) } +// ImageRepo is used to generate image's repo address. func (image Image) ImageRepo() string { var prefix string + if os.Getenv("KKZONE") == "cn" { + if image.RepoAddr == "" || image.RepoAddr == cnRegistry { + image.RepoAddr = cnRegistry + image.NamespaceOverride = cnNamespaceOverride + } + } + if image.RepoAddr == "" { if image.Namespace == "" { prefix = "" @@ -66,16 +69,21 @@ func (image Image) ImageRepo() string { prefix = fmt.Sprintf("%s/", image.Namespace) } } else { - if image.Namespace == "" { - prefix = fmt.Sprintf("%s/library/", image.RepoAddr) + if image.NamespaceOverride == "" { + if image.Namespace == "" { + prefix = fmt.Sprintf("%s/library/", image.RepoAddr) + } else { + prefix = fmt.Sprintf("%s/%s/", image.RepoAddr, image.Namespace) + } } else { - prefix = fmt.Sprintf("%s/%s/", image.RepoAddr, image.Namespace) + prefix = fmt.Sprintf("%s/%s/", image.RepoAddr, image.NamespaceOverride) } } return fmt.Sprintf("%s%s", prefix, image.Repo) } +// PullImages is used to pull images in the list of Image. func (images *Images) PullImages(mgr *manager.Manager, node *kubekeyapiv1alpha1.HostCfg) error { pullCmd := "docker" switch mgr.Cluster.Kubernetes.ContainerManager { diff --git a/pkg/kubesphere/kubesphere.go b/pkg/kubesphere/kubesphere.go index 8819bfe4..b91a419a 100644 --- a/pkg/kubesphere/kubesphere.go +++ b/pkg/kubesphere/kubesphere.go @@ -19,11 +19,13 @@ package kubesphere import ( "encoding/base64" "fmt" - kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" + "os" "regexp" "strings" "time" + kubekeyapiv1alpha1 "github.com/kubesphere/kubekey/apis/kubekey/v1alpha1" + "github.com/kubesphere/kubekey/pkg/plugins/storage" "github.com/kubesphere/kubekey/pkg/util/manager" "github.com/pkg/errors" @@ -119,8 +121,8 @@ EOF if _, err := mgr.Runner.ExecuteCmd(fmt.Sprintf("sudo -E /bin/sh -c \"echo %s | base64 -d >> /etc/kubernetes/addons/kubesphere.yaml\"", ConfigurationBase64), 2, false); err != nil { return errors.Wrap(errors.WithStack(err), "Failed to generate kubesphere manifests") } - case "v3.0.0": - kubesphereYaml, err := GenerateKubeSphereYaml(mgr.Cluster.Registry.PrivateRegistry, "v3.0.0") + case "v3.0.0", "latest": + kubesphereYaml, err := GenerateKubeSphereYaml(mgr.Cluster.Registry.PrivateRegistry, mgr.Cluster.KubeSphere.Version) if err != nil { return err } @@ -154,6 +156,16 @@ EOF } } + if mgr.Cluster.KubeSphere.Version == "latest" && (os.Getenv("KKZONE") == "cn" || mgr.Cluster.Registry.PrivateRegistry == "registry.cn-beijing.aliyuncs.com") { + if _, err := mgr.Runner.ExecuteCmd(fmt.Sprintf("sudo /bin/sh -c \"sed -i '/zone/s/\\:.*/\\: %s/g' /etc/kubernetes/addons/kubesphere.yaml\"", "cn"), 2, false); err != nil { + return errors.Wrap(errors.WithStack(err), fmt.Sprintf("Failed to add private registry: %s", mgr.Cluster.Registry.PrivateRegistry)) + } + } else { + if _, err := mgr.Runner.ExecuteCmd("sudo /bin/sh -c \"sed -i '/zone/d' /etc/kubernetes/addons/kubesphere.yaml\"", 2, false); err != nil { + return errors.Wrap(errors.WithStack(err), fmt.Sprintf("Failed to remove private registry")) + } + } + _, err3 := mgr.Runner.ExecuteCmd(`cat <