|
8 | 8 |
|
9 | 9 | "github.com/spf13/cobra"
|
10 | 10 | corev1 "k8s.io/api/core/v1"
|
| 11 | + extensionsclient "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset" |
11 | 12 | apierrors "k8s.io/apimachinery/pkg/api/errors"
|
12 | 13 | metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
13 | 14 | "k8s.io/client-go/kubernetes"
|
@@ -60,9 +61,11 @@ type CommandJoinOptions struct {
|
60 | 61 | UseProxy string
|
61 | 62 |
|
62 | 63 | EnableTree bool
|
| 64 | + LeafModel string |
63 | 65 |
|
64 |
| - KosmosClient versioned.Interface |
65 |
| - K8sClient kubernetes.Interface |
| 66 | + KosmosClient versioned.Interface |
| 67 | + K8sClient kubernetes.Interface |
| 68 | + K8sExtensionsClient extensionsclient.Interface |
66 | 69 | }
|
67 | 70 |
|
68 | 71 | // NewCmdJoin join resource to Kosmos control plane.
|
@@ -99,6 +102,7 @@ func NewCmdJoin(f ctlutil.Factory) *cobra.Command {
|
99 | 102 | flags.StringVar(&o.IpFamily, "ip-family", utils.DefaultIPv4, "Specify the IP protocol version used by network devices, common IP families include IPv4 and IPv6.")
|
100 | 103 | flags.StringVar(&o.UseProxy, "use-proxy", "false", "Set whether to enable proxy.")
|
101 | 104 | flags.BoolVar(&o.EnableTree, "enable-tree", false, "Turn on clustertree.")
|
| 105 | + flags.StringVar(&o.LeafModel, "leaf-model", "", "Set leaf cluster model, which supports one-to-one model.") |
102 | 106 | flags.IntVarP(&o.WaitTime, "wait-time", "", utils.DefaultWaitTime, "Wait the specified time for the Kosmos install ready.")
|
103 | 107 |
|
104 | 108 | return cmd
|
@@ -147,7 +151,12 @@ func (o *CommandJoinOptions) Complete(f ctlutil.Factory) error {
|
147 | 151 |
|
148 | 152 | o.K8sClient, err = kubernetes.NewForConfig(clusterConfig)
|
149 | 153 | if err != nil {
|
150 |
| - return fmt.Errorf("kosmosctl join complete error, generate basic client failed: %v", err) |
| 154 | + return fmt.Errorf("kosmosctl join complete error, generate K8s basic client failed: %v", err) |
| 155 | + } |
| 156 | + |
| 157 | + o.K8sExtensionsClient, err = extensionsclient.NewForConfig(clusterConfig) |
| 158 | + if err != nil { |
| 159 | + return fmt.Errorf("kosmosctl join complete error, generate K8s extensions client failed: %v", err) |
151 | 160 | }
|
152 | 161 | } else {
|
153 | 162 | return fmt.Errorf("kosmosctl join complete error, arg ClusterKubeConfig is required")
|
@@ -246,10 +255,62 @@ func (o *CommandJoinOptions) runCluster() error {
|
246 | 255 | cluster.Spec.ClusterLinkOptions.CNI = o.CNI
|
247 | 256 | }
|
248 | 257 |
|
249 |
| - // ToDo ClusterTree currently has no init parameters, can be expanded later. |
250 |
| - //if o.EnableTree { |
251 |
| - // |
252 |
| - //} |
| 258 | + if o.EnableTree { |
| 259 | + serviceExport, err := util.GenerateCustomResourceDefinition(manifest.ServiceExport, nil) |
| 260 | + if err != nil { |
| 261 | + return err |
| 262 | + } |
| 263 | + _, err = o.K8sExtensionsClient.ApiextensionsV1().CustomResourceDefinitions().Create(context.Background(), serviceExport, metav1.CreateOptions{}) |
| 264 | + if err != nil { |
| 265 | + if !apierrors.IsAlreadyExists(err) { |
| 266 | + return fmt.Errorf("kosmosctl join run error, crd options failed: %v", err) |
| 267 | + } |
| 268 | + } |
| 269 | + klog.Info("Create CRD " + serviceExport.Name + " successful.") |
| 270 | + |
| 271 | + serviceImport, err := util.GenerateCustomResourceDefinition(manifest.ServiceImport, nil) |
| 272 | + if err != nil { |
| 273 | + return err |
| 274 | + } |
| 275 | + _, err = o.K8sExtensionsClient.ApiextensionsV1().CustomResourceDefinitions().Create(context.Background(), serviceImport, metav1.CreateOptions{}) |
| 276 | + if err != nil { |
| 277 | + if !apierrors.IsAlreadyExists(err) { |
| 278 | + return fmt.Errorf("kosmosctl join run error, crd options failed: %v", err) |
| 279 | + } |
| 280 | + } |
| 281 | + klog.Info("Create CRD " + serviceImport.Name + " successful.") |
| 282 | + |
| 283 | + if len(o.LeafModel) > 0 { |
| 284 | + switch o.LeafModel { |
| 285 | + case "one-to-one": |
| 286 | + // ToDo Perform follow-up query based on the leaf cluster label |
| 287 | + nodes, err := o.K8sClient.CoreV1().Nodes().List(context.Background(), metav1.ListOptions{ |
| 288 | + LabelSelector: utils.KosmosNodeJoinLabel + "=" + utils.KosmosNodeJoinValue, |
| 289 | + }) |
| 290 | + if err != nil { |
| 291 | + return fmt.Errorf("kosmosctl join run error, list cluster node failed: %v", err) |
| 292 | + } |
| 293 | + var leafModels []v1alpha1.LeafModel |
| 294 | + for _, n := range nodes.Items { |
| 295 | + leafModel := v1alpha1.LeafModel{ |
| 296 | + LeafNodeName: n.Name, |
| 297 | + Taints: []corev1.Taint{ |
| 298 | + { |
| 299 | + Effect: utils.KosmosNodeTaintEffect, |
| 300 | + Key: utils.KosmosNodeTaintKey, |
| 301 | + Value: utils.KosmosNodeValue, |
| 302 | + }, |
| 303 | + }, |
| 304 | + NodeSelector: v1alpha1.NodeSelector{ |
| 305 | + NodeName: n.Name, |
| 306 | + }, |
| 307 | + } |
| 308 | + leafModels = append(leafModels, leafModel) |
| 309 | + } |
| 310 | + cluster.Spec.ClusterTreeOptions.LeafModels = leafModels |
| 311 | + } |
| 312 | + } |
| 313 | + } |
253 | 314 |
|
254 | 315 | if o.RootFlag {
|
255 | 316 | cluster.Annotations = map[string]string{
|
|
0 commit comments