diff --git a/cmd/agent/app/agent.go b/cmd/agent/app/agent.go index 19a41bdc7..e8584ad89 100644 --- a/cmd/agent/app/agent.go +++ b/cmd/agent/app/agent.go @@ -7,6 +7,7 @@ import ( "os" "github.com/spf13/cobra" + corev1 "k8s.io/api/core/v1" kubeclientset "k8s.io/client-go/kubernetes" restclient "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" @@ -18,7 +19,6 @@ import ( "github.com/karmada-io/karmada/pkg/controllers/execution" "github.com/karmada-io/karmada/pkg/controllers/mcs" "github.com/karmada-io/karmada/pkg/controllers/status" - karmadaclientset "github.com/karmada-io/karmada/pkg/generated/clientset/versioned" "github.com/karmada-io/karmada/pkg/karmadactl" "github.com/karmada-io/karmada/pkg/util" "github.com/karmada-io/karmada/pkg/util/gclient" @@ -152,15 +152,22 @@ func setupControllers(mgr controllerruntime.Manager, opts *options.Options, stop } func registerWithControlPlaneAPIServer(controlPlaneRestConfig *restclient.Config, memberClusterName string) error { - karmadaClient := karmadaclientset.NewForConfigOrDie(controlPlaneRestConfig) + client := gclient.NewForConfigOrDie(controlPlaneRestConfig) + + namespaceObj := &corev1.Namespace{} + namespaceObj.Name = util.NamespaceClusterLease + + if err := util.CreateNamespaceIfNotExist(client, namespaceObj); err != nil { + klog.Errorf("Failed to create namespace(%s) object, error: %v", namespaceObj.Name, err) + return err + } clusterObj := &clusterv1alpha1.Cluster{} clusterObj.Name = memberClusterName clusterObj.Spec.SyncMode = clusterv1alpha1.Pull - _, err := karmadactl.CreateClusterObject(karmadaClient, clusterObj, false) - if err != nil { - klog.Errorf("failed to create cluster object. cluster name: %s, error: %v", memberClusterName, err) + if err := util.CreateClusterIfNotExist(client, clusterObj); err != nil { + klog.Errorf("Failed to create cluster(%s) object, error: %v", clusterObj.Name, err) return err } diff --git a/hack/deploy-karmada-agent.sh b/hack/deploy-karmada-agent.sh index 9657af9f4..8985be36c 100755 --- a/hack/deploy-karmada-agent.sh +++ b/hack/deploy-karmada-agent.sh @@ -53,7 +53,9 @@ MEMBER_CLUSTER_NAME=$4 source "${REPO_ROOT}"/hack/util.sh # install agent to member cluster -CURR_KUBECONFIG=$KUBECONFIG # backup current kubeconfig +if [ -n "${KUBECONFIG+x}" ];then + CURR_KUBECONFIG=$KUBECONFIG # backup current kubeconfig +fi export KUBECONFIG="${MEMBER_CLUSTER_KUBECONFIG}" # switch to member cluster kubectl config use-context "${MEMBER_CLUSTER_NAME}" @@ -92,5 +94,9 @@ kubectl apply -f "${TEMP_PATH}"/karmada-agent.yaml # Wait for karmada-etcd to come up before launching the rest of the components. util::wait_pod_ready "${AGENT_POD_LABEL}" "${KARMADA_SYSTEM_NAMESPACE}" -# recover the kubeconfig before installing agent -export KUBECONFIG="${CURR_KUBECONFIG}" +# recover the kubeconfig before installing agent if necessary +if [ -n "${CURR_KUBECONFIG+x}" ];then + export KUBECONFIG="${CURR_KUBECONFIG}" +else + unset KUBECONFIG +fi diff --git a/pkg/util/cluster.go b/pkg/util/cluster.go index 0e5eb5b8f..ce13a6a76 100644 --- a/pkg/util/cluster.go +++ b/pkg/util/cluster.go @@ -3,6 +3,7 @@ package util import ( "context" + apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" "k8s.io/apimachinery/pkg/types" "sigs.k8s.io/controller-runtime/pkg/client" @@ -28,3 +29,17 @@ func GetCluster(hostClient client.Client, clusterName string) (*v1alpha1.Cluster } return cluster, nil } + +// CreateClusterIfNotExist try to create the cluster if it does not exist. +func CreateClusterIfNotExist(client client.Client, clusterObj *v1alpha1.Cluster) error { + cluster := &v1alpha1.Cluster{} + if err := client.Get(context.TODO(), types.NamespacedName{Name: clusterObj.Name}, cluster); err != nil { + if !apierrors.IsNotFound(err) { + return err + } + if err := client.Create(context.TODO(), clusterObj); err != nil { + return err + } + } + return nil +} diff --git a/pkg/util/namespace.go b/pkg/util/namespace.go index 8e15ec1bf..08ead2972 100644 --- a/pkg/util/namespace.go +++ b/pkg/util/namespace.go @@ -6,7 +6,9 @@ import ( corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/types" kubeclient "k8s.io/client-go/kubernetes" + "sigs.k8s.io/controller-runtime/pkg/client" ) // IsNamespaceExist tells if specific already exists. @@ -45,3 +47,17 @@ func DeleteNamespace(client kubeclient.Interface, namespace string) error { } return nil } + +// CreateNamespaceIfNotExist try to create the namespace if it does not exist. +func CreateNamespaceIfNotExist(client client.Client, namespaceObj *corev1.Namespace) error { + namespace := &corev1.Namespace{} + if err := client.Get(context.TODO(), types.NamespacedName{Name: namespaceObj.Name}, namespace); err != nil { + if !apierrors.IsNotFound(err) { + return err + } + if err := client.Create(context.TODO(), namespaceObj); err != nil { + return err + } + } + return nil +}