-
Notifications
You must be signed in to change notification settings - Fork 887
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #2312 from lonelyCZ/pr-cluster-info
Set open cluster-info to distribute root CA certificates
- Loading branch information
Showing
5 changed files
with
178 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
99 changes: 99 additions & 0 deletions
99
pkg/karmadactl/cmdinit/bootstraptoken/clusterinfo/clusterinfo.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
package clusterinfo | ||
|
||
import ( | ||
"fmt" | ||
|
||
corev1 "k8s.io/api/core/v1" | ||
rbacv1 "k8s.io/api/rbac/v1" | ||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||
"k8s.io/apiserver/pkg/authentication/user" | ||
"k8s.io/client-go/kubernetes" | ||
"k8s.io/client-go/tools/clientcmd" | ||
clientcmdapi "k8s.io/client-go/tools/clientcmd/api" | ||
bootstrapapi "k8s.io/cluster-bootstrap/token/api" | ||
"k8s.io/klog/v2" | ||
|
||
"github.com/karmada-io/karmada/pkg/karmadactl/cmdinit/utils" | ||
) | ||
|
||
const ( | ||
// BootstrapSignerClusterRoleName sets the name for the ClusterRole that allows access to ConfigMaps in the kube-public ns | ||
BootstrapSignerClusterRoleName = "karmada:bootstrap-signer-clusterinfo" | ||
) | ||
|
||
// CreateBootstrapConfigMapIfNotExists creates the kube-public ConfigMap if it doesn't exist already | ||
func CreateBootstrapConfigMapIfNotExists(clientSet *kubernetes.Clientset, file string) error { | ||
klog.V(1).Infoln("[bootstrap-token] loading karmada admin kubeconfig") | ||
adminConfig, err := clientcmd.LoadFromFile(file) | ||
if err != nil { | ||
return fmt.Errorf("failed to load admin kubeconfig, %w", err) | ||
} | ||
if err = clientcmdapi.FlattenConfig(adminConfig); err != nil { | ||
return err | ||
} | ||
|
||
adminCluster := adminConfig.Contexts[adminConfig.CurrentContext].Cluster | ||
// Copy the cluster from admin.conf to the bootstrap kubeconfig, contains the CA cert and the server URL | ||
klog.V(1).Infoln("[bootstrap-token] copying the cluster from admin.conf to the bootstrap kubeconfig") | ||
bootstrapConfig := &clientcmdapi.Config{ | ||
Clusters: map[string]*clientcmdapi.Cluster{ | ||
"": adminConfig.Clusters[adminCluster], | ||
}, | ||
} | ||
bootstrapBytes, err := clientcmd.Write(*bootstrapConfig) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
// Create or update the ConfigMap in the kube-public namespace | ||
klog.V(1).Infoln("[bootstrap-token] creating/updating ConfigMap in kube-public namespace") | ||
return utils.CreateOrUpdateConfigMap(clientSet, &corev1.ConfigMap{ | ||
ObjectMeta: metav1.ObjectMeta{ | ||
Name: bootstrapapi.ConfigMapClusterInfo, | ||
Namespace: metav1.NamespacePublic, | ||
}, | ||
Data: map[string]string{ | ||
bootstrapapi.KubeConfigKey: string(bootstrapBytes), | ||
}, | ||
}) | ||
} | ||
|
||
// CreateClusterInfoRBACRules creates the RBAC rules for exposing the cluster-info ConfigMap in the kube-public namespace to unauthenticated users | ||
func CreateClusterInfoRBACRules(clientSet *kubernetes.Clientset) error { | ||
klog.V(1).Infoln("creating the RBAC rules for exposing the cluster-info ConfigMap in the kube-public namespace") | ||
err := utils.CreateOrUpdateRole(clientSet, &rbacv1.Role{ | ||
ObjectMeta: metav1.ObjectMeta{ | ||
Name: BootstrapSignerClusterRoleName, | ||
Namespace: metav1.NamespacePublic, | ||
}, | ||
Rules: []rbacv1.PolicyRule{ | ||
{ | ||
Verbs: []string{"get"}, | ||
APIGroups: []string{""}, | ||
Resources: []string{"configmaps"}, | ||
ResourceNames: []string{bootstrapapi.ConfigMapClusterInfo}, | ||
}, | ||
}, | ||
}) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
return utils.CreateOrUpdateRoleBinding(clientSet, &rbacv1.RoleBinding{ | ||
ObjectMeta: metav1.ObjectMeta{ | ||
Name: BootstrapSignerClusterRoleName, | ||
Namespace: metav1.NamespacePublic, | ||
}, | ||
RoleRef: rbacv1.RoleRef{ | ||
APIGroup: rbacv1.GroupName, | ||
Kind: "Role", | ||
Name: BootstrapSignerClusterRoleName, | ||
}, | ||
Subjects: []rbacv1.Subject{ | ||
{ | ||
Kind: rbacv1.UserKind, | ||
Name: user.Anonymous, | ||
}, | ||
}, | ||
}) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
package utils | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
|
||
corev1 "k8s.io/api/core/v1" | ||
apierrors "k8s.io/apimachinery/pkg/api/errors" | ||
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||
"k8s.io/client-go/kubernetes" | ||
"k8s.io/klog/v2" | ||
) | ||
|
||
// CreateOrUpdateConfigMap creates a ConfigMap if the target resource doesn't exist. If the resource exists already, this function will update the resource instead. | ||
func CreateOrUpdateConfigMap(clientSet *kubernetes.Clientset, cm *corev1.ConfigMap) error { | ||
if _, err := clientSet.CoreV1().ConfigMaps(cm.ObjectMeta.Namespace).Create(context.TODO(), cm, metav1.CreateOptions{}); err != nil { | ||
if !apierrors.IsAlreadyExists(err) { | ||
return fmt.Errorf("unable to create ConfigMap: %v", err) | ||
} | ||
|
||
if _, err := clientSet.CoreV1().ConfigMaps(cm.ObjectMeta.Namespace).Update(context.TODO(), cm, metav1.UpdateOptions{}); err != nil { | ||
return fmt.Errorf("unable to update ConfigMap: %v", err) | ||
} | ||
} | ||
klog.Infof("ConfigMap %s/%s has been created or updated.", cm.ObjectMeta.Namespace, cm.ObjectMeta.Name) | ||
|
||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters