From 39505623606de0312969439848d98194621ad9aa Mon Sep 17 00:00:00 2001 From: helen Date: Sun, 13 Nov 2022 20:46:52 +0800 Subject: [PATCH] Karmadactl init use idempotency acceleration Signed-off-by: helen --- pkg/karmadactl/cmdinit/kubernetes/deploy.go | 18 +++--- pkg/karmadactl/cmdinit/kubernetes/secret.go | 56 ------------------- pkg/karmadactl/cmdinit/kubernetes/services.go | 55 ------------------ pkg/karmadactl/util/idempotency.go | 14 ++--- 4 files changed, 16 insertions(+), 127 deletions(-) diff --git a/pkg/karmadactl/cmdinit/kubernetes/deploy.go b/pkg/karmadactl/cmdinit/kubernetes/deploy.go index 7bd0fe4cf..c3988feb5 100644 --- a/pkg/karmadactl/cmdinit/kubernetes/deploy.go +++ b/pkg/karmadactl/cmdinit/kubernetes/deploy.go @@ -276,7 +276,7 @@ func (i *CommandInitOption) createCertsSecrets() error { } kubeConfigSecret := i.SecretFromSpec(KubeConfigSecretAndMountName, corev1.SecretTypeOpaque, map[string]string{KubeConfigSecretAndMountName: string(configBytes)}) - if err = i.CreateSecret(kubeConfigSecret); err != nil { + if err = util.CreateOrUpdateSecret(i.KubeClientSet, kubeConfigSecret); err != nil { return err } // Create certs Secret @@ -287,7 +287,7 @@ func (i *CommandInitOption) createCertsSecrets() error { fmt.Sprintf("%s.key", options.EtcdServerCertAndKeyName): string(i.CertAndKeyFileData[fmt.Sprintf("%s.key", options.EtcdServerCertAndKeyName)]), } etcdSecret := i.SecretFromSpec(etcdCertName, corev1.SecretTypeOpaque, etcdCert) - if err := i.CreateSecret(etcdSecret); err != nil { + if err := util.CreateOrUpdateSecret(i.KubeClientSet, etcdSecret); err != nil { return err } @@ -297,7 +297,7 @@ func (i *CommandInitOption) createCertsSecrets() error { karmadaCert[fmt.Sprintf("%s.key", v)] = string(i.CertAndKeyFileData[fmt.Sprintf("%s.key", v)]) } karmadaSecret := i.SecretFromSpec(karmadaCertsName, corev1.SecretTypeOpaque, karmadaCert) - if err := i.CreateSecret(karmadaSecret); err != nil { + if err := util.CreateOrUpdateSecret(i.KubeClientSet, karmadaSecret); err != nil { return err } @@ -306,7 +306,7 @@ func (i *CommandInitOption) createCertsSecrets() error { "tls.key": string(i.CertAndKeyFileData[fmt.Sprintf("%s.key", options.KarmadaCertAndKeyName)]), } karmadaWebhookSecret := i.SecretFromSpec(webhookCertsName, corev1.SecretTypeOpaque, karmadaWebhookCert) - if err := i.CreateSecret(karmadaWebhookSecret); err != nil { + if err := util.CreateOrUpdateSecret(i.KubeClientSet, karmadaWebhookSecret); err != nil { return err } @@ -314,7 +314,7 @@ func (i *CommandInitOption) createCertsSecrets() error { } func (i *CommandInitOption) initKarmadaAPIServer() error { - if err := i.CreateService(i.makeEtcdService(etcdStatefulSetAndServiceName)); err != nil { + if err := util.CreateOrUpdateService(i.KubeClientSet, i.makeEtcdService(etcdStatefulSetAndServiceName)); err != nil { return err } klog.Info("create etcd StatefulSets") @@ -329,7 +329,7 @@ func (i *CommandInitOption) initKarmadaAPIServer() error { } klog.Info("create karmada ApiServer Deployment") - if err := i.CreateService(i.makeKarmadaAPIServerService()); err != nil { + if err := util.CreateOrUpdateService(i.KubeClientSet, i.makeKarmadaAPIServerService()); err != nil { return err } if _, err := i.KubeClientSet.AppsV1().Deployments(i.Namespace).Create(context.TODO(), i.makeKarmadaAPIServerDeployment(), metav1.CreateOptions{}); err != nil { @@ -342,7 +342,7 @@ func (i *CommandInitOption) initKarmadaAPIServer() error { // Create karmada-aggregated-apiserver // https://github.com/karmada-io/karmada/blob/master/artifacts/deploy/karmada-aggregated-apiserver.yaml klog.Info("create karmada aggregated apiserver Deployment") - if err := i.CreateService(i.karmadaAggregatedAPIServerService()); err != nil { + if err := util.CreateOrUpdateService(i.KubeClientSet, i.karmadaAggregatedAPIServerService()); err != nil { klog.Exitln(err) } if _, err := i.KubeClientSet.AppsV1().Deployments(i.Namespace).Create(context.TODO(), i.makeKarmadaAggregatedAPIServerDeployment(), metav1.CreateOptions{}); err != nil { @@ -362,7 +362,7 @@ func (i *CommandInitOption) initKarmadaComponent() error { // Create karmada-kube-controller-manager // https://github.com/karmada-io/karmada/blob/master/artifacts/deploy/kube-controller-manager.yaml klog.Info("create karmada kube controller manager Deployment") - if err := i.CreateService(i.kubeControllerManagerService()); err != nil { + if err := util.CreateOrUpdateService(i.KubeClientSet, i.kubeControllerManagerService()); err != nil { klog.Exitln(err) } if _, err := deploymentClient.Create(context.TODO(), i.makeKarmadaKubeControllerManagerDeployment(), metav1.CreateOptions{}); err != nil { @@ -395,7 +395,7 @@ func (i *CommandInitOption) initKarmadaComponent() error { // Create karmada-webhook // https://github.com/karmada-io/karmada/blob/master/artifacts/deploy/karmada-webhook.yaml klog.Info("create karmada webhook Deployment") - if err := i.CreateService(i.karmadaWebhookService()); err != nil { + if err := util.CreateOrUpdateService(i.KubeClientSet, i.karmadaWebhookService()); err != nil { klog.Exitln(err) } if _, err := deploymentClient.Create(context.TODO(), i.makeKarmadaWebhookDeployment(), metav1.CreateOptions{}); err != nil { diff --git a/pkg/karmadactl/cmdinit/kubernetes/secret.go b/pkg/karmadactl/cmdinit/kubernetes/secret.go index a377a9857..264938a59 100644 --- a/pkg/karmadactl/cmdinit/kubernetes/secret.go +++ b/pkg/karmadactl/cmdinit/kubernetes/secret.go @@ -1,14 +1,8 @@ package kubernetes import ( - "context" - "fmt" - corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" - applycorev1 "k8s.io/client-go/applyconfigurations/core/v1" - applymetav1 "k8s.io/client-go/applyconfigurations/meta/v1" - "k8s.io/klog/v2" ) // SecretFromSpec secret spec @@ -28,53 +22,3 @@ func (i *CommandInitOption) SecretFromSpec(name string, secretType corev1.Secret StringData: data, } } - -// CreateSecret receive SecretFromSpec create secret -func (i *CommandInitOption) CreateSecret(secret *corev1.Secret) error { - secretClient := i.KubeClientSet.CoreV1().Secrets(i.Namespace) - - secretList, err := secretClient.List(context.TODO(), metav1.ListOptions{}) - if err != nil { - return err - } - - // Update if secret exists. - for _, v := range secretList.Items { - if secret.Name == v.Name { - t := &applycorev1.SecretApplyConfiguration{ - TypeMetaApplyConfiguration: applymetav1.TypeMetaApplyConfiguration{ - APIVersion: &secret.APIVersion, - Kind: &secret.Kind, - }, - ObjectMetaApplyConfiguration: &applymetav1.ObjectMetaApplyConfiguration{ - Name: &secret.Name, - Namespace: &secret.Namespace, - }, - Immutable: v.Immutable, - Data: secret.Data, - StringData: secret.StringData, - Type: &secret.Type, - } - - _, err = secretClient.Apply(context.TODO(), t, metav1.ApplyOptions{ - TypeMeta: metav1.TypeMeta{ - APIVersion: secret.APIVersion, - Kind: secret.Kind, - }, - FieldManager: "apply", - }) - if err != nil { - return fmt.Errorf("apply secret %s failed: %v", secret.Name, err) - } - klog.Infof("secret %s update successfully.", secret.Name) - return nil - } - } - - _, err = secretClient.Create(context.TODO(), secret, metav1.CreateOptions{}) - if err != nil { - return fmt.Errorf("create secret %s failed: %v", secret.Name, err) - } - klog.Infof("secret %s Create successfully.", secret.Name) - return nil -} diff --git a/pkg/karmadactl/cmdinit/kubernetes/services.go b/pkg/karmadactl/cmdinit/kubernetes/services.go index d0c54dd4e..09198c7bb 100644 --- a/pkg/karmadactl/cmdinit/kubernetes/services.go +++ b/pkg/karmadactl/cmdinit/kubernetes/services.go @@ -2,71 +2,16 @@ package kubernetes import ( "context" - "fmt" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/util/intstr" - applycorev1 "k8s.io/client-go/applyconfigurations/core/v1" - applymetav1 "k8s.io/client-go/applyconfigurations/meta/v1" "k8s.io/klog/v2" ) // serviceLabels remove via Labels karmada service var serviceLabels = map[string]string{"karmada.io/bootstrapping": "service-defaults"} -// CreateService create service -func (i *CommandInitOption) CreateService(service *corev1.Service) error { - serviceClient := i.KubeClientSet.CoreV1().Services(i.Namespace) - - serviceList, err := serviceClient.List(context.TODO(), metav1.ListOptions{}) - if err != nil { - return err - } - - // Update if service exists. - for _, v := range serviceList.Items { - if service.Name == v.Name { - t := &applycorev1.ServiceApplyConfiguration{ - TypeMetaApplyConfiguration: applymetav1.TypeMetaApplyConfiguration{ - APIVersion: &service.APIVersion, - Kind: &service.Kind, - }, - ObjectMetaApplyConfiguration: &applymetav1.ObjectMetaApplyConfiguration{ - Name: &service.Name, - Namespace: &service.Namespace, - }, - Spec: &applycorev1.ServiceSpecApplyConfiguration{ - ClusterIP: &service.Spec.ClusterIP, - ClusterIPs: service.Spec.ClusterIPs, - Type: &service.Spec.Type, - Selector: service.Spec.Selector, - }, - } - - _, err = serviceClient.Apply(context.TODO(), t, metav1.ApplyOptions{ - TypeMeta: metav1.TypeMeta{ - APIVersion: service.APIVersion, - Kind: service.Kind, - }, - FieldManager: "apply", - }) - if err != nil { - return fmt.Errorf("apply service %s failed: %v", service.Name, err) - } - klog.Infof("service %s update successfully.", service.Name) - return nil - } - } - - _, err = serviceClient.Create(context.TODO(), service, metav1.CreateOptions{}) - if err != nil { - return fmt.Errorf("create service %s failed: %v", service.Name, err) - } - klog.Infof("service %s create successfully.", service.Name) - return nil -} - // makeEtcdService etcd service func (i *CommandInitOption) makeEtcdService(name string) *corev1.Service { return &corev1.Service{ diff --git a/pkg/karmadactl/util/idempotency.go b/pkg/karmadactl/util/idempotency.go index fc2c322ee..660981e06 100644 --- a/pkg/karmadactl/util/idempotency.go +++ b/pkg/karmadactl/util/idempotency.go @@ -20,7 +20,7 @@ import ( func CreateService(client kubeclient.Interface, service *corev1.Service) error { if _, err := client.CoreV1().Services(service.ObjectMeta.Namespace).Create(context.TODO(), service, metav1.CreateOptions{}); err != nil { if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("unable to create service: %v", err) + return fmt.Errorf("unable to create Service: %v", err) } klog.Warningf("Service %s is existed, creation process will skip", service.ObjectMeta.Name) @@ -32,7 +32,7 @@ func CreateService(client kubeclient.Interface, service *corev1.Service) error { func CreateOrUpdateSecret(client kubeclient.Interface, secret *corev1.Secret) error { if _, err := client.CoreV1().Secrets(secret.Namespace).Create(context.TODO(), secret, metav1.CreateOptions{}); err != nil { if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("unable to create service: %v", err) + return fmt.Errorf("unable to create Secret: %v", err) } existSecret, err := client.CoreV1().Secrets(secret.Namespace).Get(context.TODO(), secret.Name, metav1.GetOptions{}) @@ -43,7 +43,7 @@ func CreateOrUpdateSecret(client kubeclient.Interface, secret *corev1.Secret) er secret.ResourceVersion = existSecret.ResourceVersion if _, err := client.CoreV1().Secrets(secret.ObjectMeta.Namespace).Update(context.TODO(), secret, metav1.UpdateOptions{}); err != nil { - return fmt.Errorf("unable to update deployment: %v", err) + return fmt.Errorf("unable to update Secret: %v", err) } } return nil @@ -53,7 +53,7 @@ func CreateOrUpdateSecret(client kubeclient.Interface, secret *corev1.Secret) er func CreateOrUpdateDeployment(client kubeclient.Interface, deploy *appsv1.Deployment) error { if _, err := client.AppsV1().Deployments(deploy.Namespace).Create(context.TODO(), deploy, metav1.CreateOptions{}); err != nil { if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("unable to create deployment: %v", err) + return fmt.Errorf("unable to create Deployment: %v", err) } existDeployment, err := client.AppsV1().Deployments(deploy.Namespace).Get(context.TODO(), deploy.Name, metav1.GetOptions{}) @@ -64,7 +64,7 @@ func CreateOrUpdateDeployment(client kubeclient.Interface, deploy *appsv1.Deploy deploy.ResourceVersion = existDeployment.ResourceVersion if _, err := client.AppsV1().Deployments(deploy.ObjectMeta.Namespace).Update(context.TODO(), deploy, metav1.UpdateOptions{}); err != nil { - return fmt.Errorf("unable to update deployment: %v", err) + return fmt.Errorf("unable to update Deployment: %v", err) } } return nil @@ -74,7 +74,7 @@ func CreateOrUpdateDeployment(client kubeclient.Interface, deploy *appsv1.Deploy func CreateOrUpdateAPIService(apiRegistrationClient *aggregator.Clientset, apiservice *apiregistrationv1.APIService) error { if _, err := apiRegistrationClient.ApiregistrationV1().APIServices().Create(context.TODO(), apiservice, metav1.CreateOptions{}); err != nil { if !apierrors.IsAlreadyExists(err) { - return fmt.Errorf("unable to create apiService: %v", err) + return fmt.Errorf("unable to create APIService: %v", err) } existAPIService, err := apiRegistrationClient.ApiregistrationV1().APIServices().Get(context.TODO(), apiservice.ObjectMeta.Name, metav1.GetOptions{}) @@ -85,7 +85,7 @@ func CreateOrUpdateAPIService(apiRegistrationClient *aggregator.Clientset, apise apiservice.ObjectMeta.ResourceVersion = existAPIService.ObjectMeta.ResourceVersion if _, err := apiRegistrationClient.ApiregistrationV1().APIServices().Update(context.TODO(), apiservice, metav1.UpdateOptions{}); err != nil { - return fmt.Errorf("unable to update apiService: %v", err) + return fmt.Errorf("unable to update APIService: %v", err) } } return nil