Merge pull request #2791 from helen-frank/feature/UseIdempotency
Karmadactl init use idempotency acceleration
This commit is contained in:
commit
ff7d1a9e15
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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{
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue