Merge pull request #2791 from helen-frank/feature/UseIdempotency

Karmadactl init use idempotency acceleration
This commit is contained in:
karmada-bot 2022-11-16 10:31:26 +08:00 committed by GitHub
commit ff7d1a9e15
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 16 additions and 127 deletions

View File

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

View File

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

View File

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

View File

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