diff --git a/pkg/karmadactl/cmdinit/cmdinit.go b/pkg/karmadactl/cmdinit/cmdinit.go index 5e2d3fcab..8776892ed 100644 --- a/pkg/karmadactl/cmdinit/cmdinit.go +++ b/pkg/karmadactl/cmdinit/cmdinit.go @@ -93,12 +93,7 @@ func NewCmdInit(parentCommand string) *cobra.Command { }, } flags := cmd.Flags() - - releaseVer, err := version.ParseGitVersion(version.Get().GitVersion) - if err != nil { - klog.Infof("No default release version found. build version: %s", version.Get().String()) - releaseVer = &version.ReleaseVersion{} // initialize to avoid panic - } + flags.StringVarP(&opts.ImageRegistry, "private-image-registry", "", "", "Private image registry where pull images from. If set, all required images will be downloaded from it, it would be useful in offline installation scenarios. In addition, you still can use --kube-image-registry to specify the registry for Kubernetes's images.") // kube image registry flags.StringVarP(&opts.KubeImageMirrorCountry, "kube-image-mirror-country", "", "", "Country code of the kube image registry to be used. For Chinese mainland users, set it to cn") flags.StringVarP(&opts.KubeImageRegistry, "kube-image-registry", "", "", "Kube image registry. For Chinese mainland users, you may use local gcr.io mirrors such as registry.cn-hangzhou.aliyuncs.com/google_containers to override default kube image registry") @@ -114,29 +109,28 @@ func NewCmdInit(parentCommand string) *cobra.Command { flags.StringVarP(&opts.EtcdStorageMode, "etcd-storage-mode", "", "hostPath", fmt.Sprintf("etcd data storage mode(%s). value is PVC, specify --storage-classes-name", strings.Join(kubernetes.SupportedStorageMode(), ","))) flags.StringVarP(&opts.EtcdImage, "etcd-image", "", "", "etcd image") - flags.StringVarP(&opts.EtcdInitImage, "etcd-init-image", "", "docker.io/alpine:3.15.1", "etcd init container image") + flags.StringVarP(&opts.EtcdInitImage, "etcd-init-image", "", kubernetes.DefaultInitImage, "etcd init container image") flags.Int32VarP(&opts.EtcdReplicas, "etcd-replicas", "", 1, "etcd replica set, cluster 3,5...singular") flags.StringVarP(&opts.EtcdHostDataPath, "etcd-data", "", "/var/lib/karmada-etcd", "etcd data path,valid in hostPath mode.") flags.StringVarP(&opts.EtcdNodeSelectorLabels, "etcd-node-selector-labels", "", "", "etcd pod select the labels of the node. valid in hostPath mode ( e.g. --etcd-node-selector-labels karmada.io/etcd=true)") flags.StringVarP(&opts.EtcdPersistentVolumeSize, "etcd-pvc-size", "", "5Gi", "etcd data path,valid in pvc mode.") // karmada - crdURL := fmt.Sprintf("https://github.com/karmada-io/karmada/releases/download/%s/crds.tar.gz", releaseVer.FirstMinorRelease()) - flags.StringVar(&opts.CRDs, "crds", crdURL, "Karmada crds resource.(local file e.g. --crds /root/crds.tar.gz)") + flags.StringVar(&opts.CRDs, "crds", kubernetes.DefaultCrdURL, "Karmada crds resource.(local file e.g. --crds /root/crds.tar.gz)") flags.StringVarP(&opts.KarmadaAPIServerAdvertiseAddress, "karmada-apiserver-advertise-address", "", "", "The IP address the Karmada API Server will advertise it's listening on. If not set, the address on the master node will be used.") flags.Int32VarP(&opts.KarmadaAPIServerNodePort, "port", "p", 32443, "Karmada apiserver service node port") flags.StringVarP(&opts.KarmadaDataPath, "karmada-data", "d", "/etc/karmada", "Karmada data path. kubeconfig cert and crds files") flags.StringVarP(&opts.KarmadaPkiPath, "karmada-pki", "", "/etc/karmada/pki", "Karmada pki path. Karmada cert files") flags.StringVarP(&opts.KarmadaAPIServerImage, "karmada-apiserver-image", "", "", "Kubernetes apiserver image") flags.Int32VarP(&opts.KarmadaAPIServerReplicas, "karmada-apiserver-replicas", "", 1, "Karmada apiserver replica set") - flags.StringVarP(&opts.KarmadaSchedulerImage, "karmada-scheduler-image", "", fmt.Sprintf("docker.io/karmada/karmada-scheduler:%s", releaseVer.PatchRelease()), "Karmada scheduler image") + flags.StringVarP(&opts.KarmadaSchedulerImage, "karmada-scheduler-image", "", kubernetes.DefaultKarmadaSchedulerImage, "Karmada scheduler image") flags.Int32VarP(&opts.KarmadaSchedulerReplicas, "karmada-scheduler-replicas", "", 1, "Karmada scheduler replica set") flags.StringVarP(&opts.KubeControllerManagerImage, "karmada-kube-controller-manager-image", "", "", "Kubernetes controller manager image") flags.Int32VarP(&opts.KubeControllerManagerReplicas, "karmada-kube-controller-manager-replicas", "", 1, "Karmada kube controller manager replica set") - flags.StringVarP(&opts.KarmadaControllerManagerImage, "karmada-controller-manager-image", "", fmt.Sprintf("docker.io/karmada/karmada-controller-manager:%s", releaseVer.PatchRelease()), "Karmada controller manager image") + flags.StringVarP(&opts.KarmadaControllerManagerImage, "karmada-controller-manager-image", "", kubernetes.DefaultKarmadaControllerManagerImage, "Karmada controller manager image") flags.Int32VarP(&opts.KarmadaControllerManagerReplicas, "karmada-controller-manager-replicas", "", 1, "Karmada controller manager replica set") - flags.StringVarP(&opts.KarmadaWebhookImage, "karmada-webhook-image", "", fmt.Sprintf("docker.io/karmada/karmada-webhook:%s", releaseVer.PatchRelease()), "Karmada webhook image") + flags.StringVarP(&opts.KarmadaWebhookImage, "karmada-webhook-image", "", kubernetes.DefualtKarmadaWebhookImage, "Karmada webhook image") flags.Int32VarP(&opts.KarmadaWebhookReplicas, "karmada-webhook-replicas", "", 1, "Karmada webhook replica set") - flags.StringVarP(&opts.KarmadaAggregatedAPIServerImage, "karmada-aggregated-apiserver-image", "", fmt.Sprintf("docker.io/karmada/karmada-aggregated-apiserver:%s", releaseVer.PatchRelease()), "Karmada aggregated apiserver image") + flags.StringVarP(&opts.KarmadaAggregatedAPIServerImage, "karmada-aggregated-apiserver-image", "", kubernetes.DefaultKarmadaAggregatedAPIServerImage, "Karmada aggregated apiserver image") flags.Int32VarP(&opts.KarmadaAggregatedAPIServerReplicas, "karmada-aggregated-apiserver-replicas", "", 1, "Karmada aggregated apiserver replica set") return cmd diff --git a/pkg/karmadactl/cmdinit/kubernetes/deploy.go b/pkg/karmadactl/cmdinit/kubernetes/deploy.go index 7bd0fe4cf..7f3799527 100644 --- a/pkg/karmadactl/cmdinit/kubernetes/deploy.go +++ b/pkg/karmadactl/cmdinit/kubernetes/deploy.go @@ -25,6 +25,7 @@ import ( "github.com/karmada-io/karmada/pkg/karmadactl/cmdinit/utils" "github.com/karmada-io/karmada/pkg/karmadactl/util" "github.com/karmada-io/karmada/pkg/karmadactl/util/apiclient" + "github.com/karmada-io/karmada/pkg/version" ) var ( @@ -44,9 +45,24 @@ var ( options.FrontProxyClientCertAndKeyName, } + karmadaRelease string + defaultEtcdImage = "etcd:3.5.3-0" defaultKubeAPIServerImage = "kube-apiserver:v1.25.2" defaultKubeControllerManagerImage = "kube-controller-manager:v1.25.2" + + // DefaultCrdURL Karmada crds resource + DefaultCrdURL string + // DefaultInitImage etcd init container image + DefaultInitImage string + // DefaultKarmadaSchedulerImage Karmada scheduler image + DefaultKarmadaSchedulerImage string + // DefaultKarmadaControllerManagerImage Karmada controller manager image + DefaultKarmadaControllerManagerImage string + // DefualtKarmadaWebhookImage Karmada webhook image + DefualtKarmadaWebhookImage string + // DefaultKarmadaAggregatedAPIServerImage Karmada aggregated apiserver image + DefaultKarmadaAggregatedAPIServerImage string ) const ( @@ -55,8 +71,25 @@ const ( etcdStorageModeHostPath = "hostPath" ) +func init() { + releaseVer, err := version.ParseGitVersion(version.Get().GitVersion) + if err != nil { + klog.Infof("No default release version found. build version: %s", version.Get().String()) + releaseVer = &version.ReleaseVersion{} // initialize to avoid panic + } + karmadaRelease = releaseVer.PatchRelease() + + DefaultCrdURL = fmt.Sprintf("https://github.com/karmada-io/karmada/releases/download/%s/crds.tar.gz", releaseVer.FirstMinorRelease()) + DefaultInitImage = "docker.io/alpine:3.15.1" + DefaultKarmadaSchedulerImage = fmt.Sprintf("docker.io/karmada/karmada-scheduler:%s", releaseVer.PatchRelease()) + DefaultKarmadaControllerManagerImage = fmt.Sprintf("docker.io/karmada/karmada-controller-manager:%s", releaseVer.PatchRelease()) + DefualtKarmadaWebhookImage = fmt.Sprintf("docker.io/karmada/karmada-webhook:%s", releaseVer.PatchRelease()) + DefaultKarmadaAggregatedAPIServerImage = fmt.Sprintf("docker.io/karmada/karmada-aggregated-apiserver:%s", releaseVer.PatchRelease()) +} + // CommandInitOption holds all flags options for init. type CommandInitOption struct { + ImageRegistry string KubeImageRegistry string KubeImageMirrorCountry string EtcdImage string @@ -508,6 +541,9 @@ func (i *CommandInitOption) kubeRegistry() string { } } + if i.ImageRegistry != "" { + return i.ImageRegistry + } return imageRepositories["global"] } @@ -527,6 +563,14 @@ func (i *CommandInitOption) kubeControllerManagerImage() string { return i.kubeRegistry() + "/" + defaultKubeControllerManagerImage } +// get etcd-init image +func (i *CommandInitOption) etcdInitImage() string { + if i.ImageRegistry != "" && i.EtcdInitImage == DefaultInitImage { + return i.ImageRegistry + "/alpine:3.15.1" + } + return i.EtcdInitImage +} + // get etcd image func (i *CommandInitOption) etcdImage() string { if i.EtcdImage != "" { @@ -535,6 +579,38 @@ func (i *CommandInitOption) etcdImage() string { return i.kubeRegistry() + "/" + defaultEtcdImage } +// get karmada-scheduler image +func (i *CommandInitOption) karmadaSchedulerImage() string { + if i.ImageRegistry != "" && i.KarmadaSchedulerImage == DefaultKarmadaSchedulerImage { + return i.ImageRegistry + "/karmada-scheduler:" + karmadaRelease + } + return i.KarmadaSchedulerImage +} + +// get karmada-controller-manager +func (i *CommandInitOption) karmadaControllerManagerImage() string { + if i.ImageRegistry != "" && i.KarmadaControllerManagerImage == DefaultKarmadaControllerManagerImage { + return i.ImageRegistry + "/karmada-controller-manager:" + karmadaRelease + } + return i.KarmadaControllerManagerImage +} + +// get karmada-webhook image +func (i *CommandInitOption) karmadaWebhookImage() string { + if i.ImageRegistry != "" && i.KarmadaWebhookImage == DefualtKarmadaWebhookImage { + return i.ImageRegistry + "/karmada-webhook:" + karmadaRelease + } + return i.KarmadaWebhookImage +} + +// get karmada-aggregated-apiserver image +func (i *CommandInitOption) karmadaAggregatedAPIServerImage() string { + if i.ImageRegistry != "" && i.KarmadaAggregatedAPIServerImage == DefaultKarmadaAggregatedAPIServerImage { + return i.ImageRegistry + "/karmada-aggregated-apiserver:" + karmadaRelease + } + return i.KarmadaAggregatedAPIServerImage +} + func generateServerURL(serverIP string, nodePort int32) (string, error) { _, ipType, err := utils.ParseIP(serverIP) if err != nil { diff --git a/pkg/karmadactl/cmdinit/kubernetes/deployments.go b/pkg/karmadactl/cmdinit/kubernetes/deployments.go index ff000f4e6..f15ec1f6a 100644 --- a/pkg/karmadactl/cmdinit/kubernetes/deployments.go +++ b/pkg/karmadactl/cmdinit/kubernetes/deployments.go @@ -399,7 +399,7 @@ func (i *CommandInitOption) makeKarmadaSchedulerDeployment() *appsv1.Deployment Containers: []corev1.Container{ { Name: schedulerDeploymentNameAndServiceAccountName, - Image: i.KarmadaSchedulerImage, + Image: i.karmadaSchedulerImage(), Command: []string{ "/bin/karmada-scheduler", "--kubeconfig=/etc/kubeconfig", @@ -514,7 +514,7 @@ func (i *CommandInitOption) makeKarmadaControllerManagerDeployment() *appsv1.Dep Containers: []corev1.Container{ { Name: controllerManagerDeploymentAndServiceName, - Image: i.KarmadaControllerManagerImage, + Image: i.karmadaControllerManagerImage(), Command: []string{ "/bin/karmada-controller-manager", "--kubeconfig=/etc/kubeconfig", @@ -631,7 +631,7 @@ func (i *CommandInitOption) makeKarmadaWebhookDeployment() *appsv1.Deployment { Containers: []corev1.Container{ { Name: webhookDeploymentAndServiceAccountAndServiceName, - Image: i.KarmadaWebhookImage, + Image: i.karmadaWebhookImage(), Command: []string{ "/bin/karmada-webhook", "--kubeconfig=/etc/kubeconfig", @@ -776,7 +776,7 @@ func (i *CommandInitOption) makeKarmadaAggregatedAPIServerDeployment() *appsv1.D Containers: []corev1.Container{ { Name: karmadaAggregatedAPIServerDeploymentAndServiceName, - Image: i.KarmadaAggregatedAPIServerImage, + Image: i.karmadaAggregatedAPIServerImage(), Command: []string{ "/bin/karmada-aggregated-apiserver", "--kubeconfig=/etc/kubeconfig", diff --git a/pkg/karmadactl/cmdinit/kubernetes/statefulset.go b/pkg/karmadactl/cmdinit/kubernetes/statefulset.go index b5e1add3d..eb5ba073f 100644 --- a/pkg/karmadactl/cmdinit/kubernetes/statefulset.go +++ b/pkg/karmadactl/cmdinit/kubernetes/statefulset.go @@ -136,7 +136,7 @@ peer-transport-security: initial-cluster-state: new initial-cluster-token: etcd-cluster initial-cluster: %s -listen-peer-urls: http://${%s}:%v +listen-peer-urls: http://${%s}:%v listen-client-urls: https://${%s}:%v,http://127.0.0.1:%v initial-advertise-peer-urls: http://${%s}:%v advertise-client-urls: https://${%s}.%s.%s.svc.cluster.local:%v @@ -288,7 +288,7 @@ func (i *CommandInitOption) makeETCDStatefulSet() *appsv1.StatefulSet { podSpec.InitContainers = []corev1.Container{ { Name: "etcd-init-conf", - Image: i.EtcdInitImage, + Image: i.etcdInitImage(), Command: i.etcdInitContainerCommand(), VolumeMounts: []corev1.VolumeMount{ {