Merge pull request #402 from pixiake/aliyun-image-repo

support aliyun images repo
This commit is contained in:
KubeSphere CI Bot 2020-12-23 13:53:50 +08:00 committed by GitHub
commit d2a78d20c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 155 additions and 110 deletions

View File

@ -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)

View File

@ -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" {

View File

@ -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")
}
}

View File

@ -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,

View File

@ -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

View File

@ -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]

View File

@ -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 {

View File

@ -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)

View File

@ -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))
}

View File

@ -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
}

View File

@ -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 {

View File

@ -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 <<EOF | /usr/local/bin/kubectl apply -f -
apiVersion: v1
kind: Namespace

View File

@ -18,10 +18,12 @@ package kubesphere
import (
"fmt"
"github.com/kubesphere/kubekey/pkg/util"
"github.com/lithammer/dedent"
"os"
"strings"
"text/template"
"github.com/kubesphere/kubekey/pkg/util"
"github.com/lithammer/dedent"
)
const (
@ -103,6 +105,7 @@ metadata:
labels:
version: v3.0.0
spec:
zone: ""
local_registry: ""
persistence:
storageClass: ""
@ -413,14 +416,18 @@ spec:
)
func GenerateKubeSphereYaml(repo, version string) (string, error) {
if repo == "" {
if strings.Contains(version, "latest") {
repo = "kubespheredev"
} else {
repo = "kubesphere"
}
if os.Getenv("KKZONE") == "cn" {
repo = "registry.cn-beijing.aliyuncs.com/kubesphereio"
} else {
repo = fmt.Sprintf("%s/kubesphere", repo)
if repo == "" {
if strings.Contains(version, "latest") {
repo = "kubespheredev"
} else {
repo = "kubesphere"
}
} else {
repo = fmt.Sprintf("%s/kubesphere", repo)
}
}
return util.Render(KubeSphereTempl, util.Data{

View File

@ -17,13 +17,15 @@ limitations under the License.
package local_volume
import (
"text/template"
"github.com/kubesphere/kubekey/pkg/cluster/preinstall"
"github.com/kubesphere/kubekey/pkg/util"
"github.com/kubesphere/kubekey/pkg/util/manager"
"github.com/lithammer/dedent"
"text/template"
)
// OpenebsTempl defines the template of openebs' manifests.
var OpenebsTempl = template.Must(template.New("openebs").Parse(
dedent.Dedent(`---
#Sample storage classes for OpenEBS Local PV
@ -173,10 +175,10 @@ spec:
periodSeconds: 60
`)))
// GenerateOpenebsManifests is used to generate openebs' mainfests content.
func GenerateOpenebsManifests(mgr *manager.Manager) (string, error) {
return util.Render(OpenebsTempl, util.Data{
"ProvisionerLocalPVImage": preinstall.GetImage(mgr, "provisioner-localpv").ImageName(),
"OpenebsToolsImage": preinstall.GetImage(mgr, "openebs-tools").ImageName(),
"LinuxUtilsImage": preinstall.GetImage(mgr, "linux-utils").ImageName(),
})
}