mirror of
https://github.com/kubesphere/kubekey.git
synced 2025-12-26 01:22:51 +00:00
Merge pull request #402 from pixiake/aliyun-image-repo
support aliyun images repo
This commit is contained in:
commit
d2a78d20c4
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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" {
|
||||
|
|
|
|||
|
|
@ -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")
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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]
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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{
|
||||
|
|
|
|||
|
|
@ -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(),
|
||||
})
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue