Skip to content

Commit 7d76854

Browse files
authored
Merge pull request kosmos-io#121 from ONE7live/main
fix: Optimize kosmos install waiting process
2 parents d405a36 + 548babf commit 7d76854

File tree

5 files changed

+87
-63
lines changed

5 files changed

+87
-63
lines changed

pkg/kosmosctl/install/install.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,8 @@ func (o *CommandInstallOptions) runClusterlink() error {
255255
return fmt.Errorf("kosmosctl install clusterlink run error, deployment options failed: %v", err)
256256
}
257257
}
258-
if err = util.WaitDeploymentReady(o.Client, clusterlinkDeployment, o.WaitTime); err != nil {
258+
label := map[string]string{"app": clusterlinkDeployment.Labels["app"]}
259+
if err = util.WaitPodReady(o.Client, clusterlinkDeployment.Namespace, util.MapToString(label), o.WaitTime); err != nil {
259260
return fmt.Errorf("kosmosctl install clusterlink run error, deployment options failed: %v", err)
260261
} else {
261262
klog.Info("Deployment clusterlink-network-manager has been created.")
@@ -365,7 +366,8 @@ func (o *CommandInstallOptions) runClustertree() error {
365366
return fmt.Errorf("kosmosctl install clustertree run error, deployment options failed: %v", err)
366367
}
367368
}
368-
if err = util.WaitDeploymentReady(o.Client, clustertreeDeployment, o.WaitTime); err != nil {
369+
label := map[string]string{"app": clustertreeDeployment.Labels["app"]}
370+
if err = util.WaitPodReady(o.Client, clustertreeDeployment.Namespace, util.MapToString(label), o.WaitTime); err != nil {
369371
return fmt.Errorf("kosmosctl install clustertree run error, deployment options failed: %v", err)
370372
} else {
371373
klog.Info("Deployment clustertree-knode-manager has been created.")

pkg/kosmosctl/join/join.go

+43-33
Original file line numberDiff line numberDiff line change
@@ -31,33 +31,31 @@ import (
3131

3232
var joinExample = templates.Examples(i18n.T(`
3333
# Join cluster resource from a directory containing cluster.yaml, e.g:
34-
kosmosctl join cluster --cluster-name=[cluster-name] --master-kubeconfig=[master-kubeconfig] --cluster-kubeconfig=[cluster-kubeconfig]
34+
kosmosctl join cluster --name=[cluster-name] --master-kubeconfig=[master-kubeconfig] --cluster-kubeconfig=[cluster-kubeconfig]
3535
3636
# Join cluster resource without master-kubeconfig, e.g:
37-
kosmosctl join cluster --cluster-name=[cluster-name] --cluster-kubeconfig=[cluster-kubeconfig]
37+
kosmosctl join cluster --name=[cluster-name] --cluster-kubeconfig=[cluster-kubeconfig]
3838
3939
# Join knode resource, e.g:
40-
kosmosctl join knode --knode-name=[knode-name] --master-kubeconfig=[master-kubeconfig] --cluster-kubeconfig=[cluster-kubeconfig]
40+
kosmosctl join knode --name=[knode-name] --master-kubeconfig=[master-kubeconfig] --cluster-kubeconfig=[cluster-kubeconfig]
4141
4242
# Join knode resource without master-kubeconfig, e.g:
43-
kosmosctl join knode --knode-name=[knode-name] --cluster-kubeconfig=[cluster-kubeconfig]
43+
kosmosctl join knode --name=[knode-name] --cluster-kubeconfig=[cluster-kubeconfig]
4444
`))
4545

4646
type CommandJoinOptions struct {
4747
MasterKubeConfig string
4848
MasterKubeConfigStream []byte
4949
ClusterKubeConfig string
5050

51-
ClusterName string
51+
Name string
5252
CNI string
5353
DefaultNICName string
5454
ImageRegistry string
5555
NetworkType string
5656
UseProxy string
5757
WaitTime int
5858

59-
KnodeName string
60-
6159
Client kubernetes.Interface
6260
DynamicClient *dynamic.DynamicClient
6361
}
@@ -84,12 +82,11 @@ func NewCmdJoin(f ctlutil.Factory) *cobra.Command {
8482
flags := cmd.Flags()
8583
flags.StringVar(&o.MasterKubeConfig, "master-kubeconfig", "", "Absolute path to the master kubeconfig file.")
8684
flags.StringVar(&o.ClusterKubeConfig, "cluster-kubeconfig", "", "Absolute path to the cluster kubeconfig file.")
87-
flags.StringVar(&o.ClusterName, "cluster-name", "", "Specify the name of the member cluster to join.")
85+
flags.StringVar(&o.Name, "name", "", "Specify the name of the resource to join.")
8886
flags.StringVar(&o.CNI, "cni", "", "The cluster is configured using cni and currently supports calico and flannel.")
8987
flags.StringVar(&o.DefaultNICName, "default-nic", "", "Set default network interface card.")
9088
flags.StringVar(&o.ImageRegistry, "private-image-registry", utils.DefaultImageRepository, "Private image registry where pull images from. If set, all required images will be downloaded from it, it would be useful in offline installation scenarios. In addition, you still can use --kube-image-registry to specify the registry for Kubernetes's images.")
91-
flags.StringVar(&o.NetworkType, "network-type", "gateway", "Set the cluster network connection mode, which supports gateway and p2p modes. Gateway is used by default.")
92-
flags.StringVar(&o.KnodeName, "knode-name", "", "Specify the name of the knode to join.")
89+
flags.StringVar(&o.NetworkType, "network-type", utils.NetworkTypeP2P, "Set the cluster network connection mode, which supports gateway and p2p modes, p2p is used by default.")
9390
flags.StringVar(&o.UseProxy, "use-proxy", "false", "Set whether to enable proxy.")
9491
flags.IntVarP(&o.WaitTime, "wait-time", "", 120, "Wait the specified time for the Kosmos install ready.")
9592

@@ -142,16 +139,20 @@ func (o *CommandJoinOptions) Complete(f ctlutil.Factory) error {
142139
}
143140

144141
func (o *CommandJoinOptions) Validate(args []string) error {
142+
if len(o.Name) == 0 {
143+
return fmt.Errorf("kosmosctl join validate error, resource name is not valid")
144+
}
145+
145146
switch args[0] {
146147
case "cluster":
147-
_, err := o.DynamicClient.Resource(util.ClusterGVR).Get(context.TODO(), o.ClusterName, metav1.GetOptions{})
148+
_, err := o.DynamicClient.Resource(util.ClusterGVR).Get(context.TODO(), o.Name, metav1.GetOptions{})
148149
if err != nil {
149150
if apierrors.IsAlreadyExists(err) {
150151
return fmt.Errorf("kosmosctl join validate error, clsuter already exists: %s", err)
151152
}
152153
}
153154
case "knode":
154-
_, err := o.DynamicClient.Resource(util.KnodeGVR).Get(context.TODO(), o.KnodeName, metav1.GetOptions{})
155+
_, err := o.DynamicClient.Resource(util.KnodeGVR).Get(context.TODO(), o.Name, metav1.GetOptions{})
155156
if err != nil && apierrors.IsAlreadyExists(err) {
156157
if apierrors.IsAlreadyExists(err) {
157158
return fmt.Errorf("kosmosctl join validate error, knode already exists: %s", err)
@@ -183,7 +184,7 @@ func (o *CommandJoinOptions) runCluster() error {
183184
klog.Info("Start registering cluster to kosmos control plane...")
184185
// 1. create cluster in master
185186
clusterByte, err := util.GenerateCustomResource(manifest.ClusterCR, manifest.ClusterReplace{
186-
ClusterName: o.ClusterName,
187+
ClusterName: o.Name,
187188
CNI: o.CNI,
188189
DefaultNICName: o.DefaultNICName,
189190
ImageRepository: o.ImageRegistry,
@@ -200,15 +201,16 @@ func (o *CommandJoinOptions) runCluster() error {
200201
}
201202
_, err = o.DynamicClient.Resource(util.ClusterGVR).Namespace("").Create(context.TODO(), obj, metav1.CreateOptions{})
202203
if err != nil {
203-
return fmt.Errorf("(cluster) kosmosctl join run error, create cluster failed: %s", err)
204+
return fmt.Errorf("kosmosctl join run error, create cluster failed: %s", err)
204205
}
206+
klog.Info("Cluster: " + o.Name + " has been created.")
205207

206208
// 2. create namespace in member
207209
namespace := &corev1.Namespace{}
208210
namespace.Name = utils.DefaultNamespace
209211
_, err = o.Client.CoreV1().Namespaces().Create(context.TODO(), namespace, metav1.CreateOptions{})
210212
if err != nil && !apierrors.IsAlreadyExists(err) {
211-
return fmt.Errorf("(cluster namespace) kosmosctl join run error, create namespace failed: %s", err)
213+
return fmt.Errorf("kosmosctl join run error, create namespace failed: %s", err)
212214
}
213215

214216
// 3. create secret in member
@@ -224,59 +226,66 @@ func (o *CommandJoinOptions) runCluster() error {
224226
}
225227
_, err = o.Client.CoreV1().Secrets(secret.Namespace).Create(context.TODO(), secret, metav1.CreateOptions{})
226228
if err != nil && !apierrors.IsAlreadyExists(err) {
227-
return fmt.Errorf("(cluster secret) kosmosctl join run error, create secret failed: %s", err)
229+
return fmt.Errorf("kosmosctl join run error, create secret failed: %s", err)
228230
}
231+
klog.Info("Secret: " + secret.Name + " has been created.")
229232

230233
// 4. create rbac in member
231234
clusterRole, err := util.GenerateClusterRole(manifest.ClusterlinkClusterRole, nil)
232235
if err != nil {
233-
return fmt.Errorf("(cluster rbac) kosmosctl join run error, generate clusterrole failed: %s", err)
236+
return fmt.Errorf("kosmosctl join run error, generate clusterrole failed: %s", err)
234237
}
235238
_, err = o.Client.RbacV1().ClusterRoles().Create(context.TODO(), clusterRole, metav1.CreateOptions{})
236239
if err != nil && !apierrors.IsAlreadyExists(err) {
237-
return fmt.Errorf("(cluster rbac) kosmosctl join run error, create clusterrole failed: %s", err)
240+
return fmt.Errorf("kosmosctl join run error, create clusterrole failed: %s", err)
238241
}
242+
klog.Info("ClusterRole: " + clusterRole.Name + " has been created.")
243+
239244
clusterRoleBinding, err := util.GenerateClusterRoleBinding(manifest.ClusterlinkClusterRoleBinding, manifest.ClusterRoleBindingReplace{
240245
Namespace: utils.DefaultNamespace,
241246
})
242247
if err != nil {
243-
return fmt.Errorf("(cluster rbac) kosmosctl join run error, generate clusterrolebinding failed: %s", err)
248+
return fmt.Errorf("kosmosctl join run error, generate clusterrolebinding failed: %s", err)
244249
}
245250
_, err = o.Client.RbacV1().ClusterRoleBindings().Create(context.TODO(), clusterRoleBinding, metav1.CreateOptions{})
246251
if err != nil && !apierrors.IsAlreadyExists(err) {
247-
return fmt.Errorf("(cluster rbac) kosmosctl join run error, create clusterrolebinding failed: %s", err)
252+
return fmt.Errorf("kosmosctl join run error, create clusterrolebinding failed: %s", err)
248253
}
254+
klog.Info("ClusterRoleBinding: " + clusterRoleBinding.Name + " has been created.")
249255

250256
// 5. create operator in member
251257
serviceAccount, err := util.GenerateServiceAccount(manifest.ClusterlinkOperatorServiceAccount, manifest.ServiceAccountReplace{
252258
Namespace: utils.DefaultNamespace,
253259
})
254260
if err != nil {
255-
return fmt.Errorf("(cluster operator) kosmosctl join run error, generate serviceaccount failed: %s", err)
261+
return fmt.Errorf("kosmosctl join run error, generate serviceaccount failed: %s", err)
256262
}
257263
_, err = o.Client.CoreV1().ServiceAccounts(serviceAccount.Namespace).Create(context.TODO(), serviceAccount, metav1.CreateOptions{})
258264
if err != nil && !apierrors.IsAlreadyExists(err) {
259-
return fmt.Errorf("(cluster operator) kosmosctl join run error, create serviceaccount failed: %s", err)
265+
return fmt.Errorf("kosmosctl join run error, create serviceaccount failed: %s", err)
260266
}
267+
klog.Info("ServiceAccount: " + serviceAccount.Name + " has been created.")
261268

262269
deployment, err := util.GenerateDeployment(manifest.ClusterlinkOperatorDeployment, manifest.ClusterlinkDeploymentReplace{
263270
Namespace: utils.DefaultNamespace,
264271
Version: version.GetReleaseVersion().PatchRelease(),
265-
ClusterName: o.ClusterName,
272+
ClusterName: o.Name,
266273
UseProxy: o.UseProxy,
267274
ImageRepository: o.ImageRegistry,
268275
})
269276
if err != nil {
270-
return fmt.Errorf("(cluster operator) kosmosctl join run error, generate deployment failed: %s", err)
277+
return fmt.Errorf("kosmosctl join run error, generate deployment failed: %s", err)
271278
}
272279
_, err = o.Client.AppsV1().Deployments(deployment.Namespace).Create(context.TODO(), deployment, metav1.CreateOptions{})
273280
if err != nil && !apierrors.IsAlreadyExists(err) {
274-
return fmt.Errorf("(cluster operator) kosmosctl join run error, create deployment failed: %s", err)
281+
return fmt.Errorf("kosmosctl join run error, create deployment failed: %s", err)
275282
}
276-
if err = util.WaitDeploymentReady(o.Client, deployment, o.WaitTime); err != nil {
277-
return fmt.Errorf("(cluster operator) kosmosctl join run error, create deployment failed: %s", err)
283+
label := map[string]string{"app": deployment.Labels["app"]}
284+
if err = util.WaitPodReady(o.Client, deployment.Namespace, util.MapToString(label), o.WaitTime); err != nil {
285+
return fmt.Errorf("kosmosctl join run error, create deployment failed: %s", err)
278286
} else {
279-
klog.Info("Cluster registration successful.")
287+
klog.Info("Deployment: " + deployment.Name + " has been created.")
288+
klog.Info("Cluster [" + o.Name + "] registration successful.")
280289
}
281290

282291
return nil
@@ -286,11 +295,11 @@ func (o *CommandJoinOptions) runKnode() error {
286295
klog.Info("Start registering knode to kosmos control plane...")
287296
clusterKubeConfigByte, err := os.ReadFile(o.ClusterKubeConfig)
288297
if err != nil {
289-
return fmt.Errorf("(knode) kosmosctl join run error, decode knode cr failed: %s", err)
298+
return fmt.Errorf("kosmosctl join run error, decode knode cr failed: %s", err)
290299
}
291300
base64ClusterKubeConfig := base64.StdEncoding.EncodeToString(clusterKubeConfigByte)
292301
knodeByte, err := util.GenerateCustomResource(manifest.KnodeCR, manifest.KnodeReplace{
293-
KnodeName: o.KnodeName,
302+
KnodeName: o.Name,
294303
KnodeKubeConfig: base64ClusterKubeConfig,
295304
})
296305
if err != nil {
@@ -300,13 +309,14 @@ func (o *CommandJoinOptions) runKnode() error {
300309
obj := &unstructured.Unstructured{}
301310
_, _, err = decoder.Decode(knodeByte, nil, obj)
302311
if err != nil {
303-
return fmt.Errorf("(knode) kosmosctl join run error, decode knode cr failed: %s", err)
312+
return fmt.Errorf("kosmosctl join run error, decode knode cr failed: %s", err)
304313
}
305314
_, err = o.DynamicClient.Resource(util.KnodeGVR).Namespace("").Create(context.TODO(), obj, metav1.CreateOptions{})
306315
if err != nil && !apierrors.IsAlreadyExists(err) {
307-
return fmt.Errorf("(knode) kosmosctl join run error, create knode failed: %s", err)
316+
return fmt.Errorf("kosmosctl join run error, create knode failed: %s", err)
308317
}
309-
klog.Info("Knode registration successful.")
318+
klog.Info("Knode: " + obj.GetName() + " has been created.")
319+
klog.Info("Knode [" + obj.GetName() + "] registration successful.")
310320

311321
return nil
312322
}

pkg/kosmosctl/uninstall/uninstall.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ func (o *CommandUninstallOptions) runClusterlink() error {
148148
clusters, err = o.DynamicClient.Resource(util.ClusterGVR).List(context.TODO(), metav1.ListOptions{})
149149
if err != nil && !apierrors.IsNotFound(err) {
150150
return fmt.Errorf("kosmosctl uninstall clusterlink run error, list cluster failed: %v", err)
151-
} else if len(clusters.Items) > 0 {
151+
} else if clusters != nil && len(clusters.Items) > 0 {
152152
klog.Info("kosmosctl uninstall warning, skip removing cluster crd because cr instance exists")
153153
} else {
154154
clusterCRD, _ := util.GenerateCustomResourceDefinition(manifest.ClusterlinkCluster, nil)
@@ -165,7 +165,7 @@ func (o *CommandUninstallOptions) runClusterlink() error {
165165
clusternodes, err = o.DynamicClient.Resource(util.ClusterNodeGVR).List(context.TODO(), metav1.ListOptions{})
166166
if err != nil && !apierrors.IsNotFound(err) {
167167
return fmt.Errorf("kosmosctl uninstall clusterlink run error, list clusternode failed: %v", err)
168-
} else if len(clusternodes.Items) > 0 {
168+
} else if clusternodes != nil && len(clusternodes.Items) > 0 {
169169
klog.Info("kosmosctl uninstall warning, skip removing clusternode crd because cr instance exists")
170170
} else {
171171
clusternodeCRD, _ := util.GenerateCustomResourceDefinition(manifest.ClusterlinkClusterNode, nil)
@@ -182,7 +182,7 @@ func (o *CommandUninstallOptions) runClusterlink() error {
182182
nodeconfigs, err = o.DynamicClient.Resource(util.NodeConfigGVR).List(context.TODO(), metav1.ListOptions{})
183183
if err != nil && !apierrors.IsNotFound(err) {
184184
return fmt.Errorf("kosmosctl uninstall clusterlink run error, list nodeconfig failed: %v", err)
185-
} else if len(nodeconfigs.Items) > 0 {
185+
} else if nodeconfigs != nil && len(nodeconfigs.Items) > 0 {
186186
klog.Info("kosmosctl uninstall warning, skip removing nodeconfig crd because cr instance exists")
187187
} else {
188188
nodeConfigCRD, _ := util.GenerateCustomResourceDefinition(manifest.ClusterlinkNodeConfig, nil)
@@ -246,7 +246,7 @@ func (o *CommandUninstallOptions) runClustertree() error {
246246
knodes, err = o.DynamicClient.Resource(util.KnodeGVR).List(context.TODO(), metav1.ListOptions{})
247247
if err != nil && !apierrors.IsNotFound(err) {
248248
return fmt.Errorf("kosmosctl uninstall clustertree run error, list knode failed: %v", err)
249-
} else if len(knodes.Items) > 0 {
249+
} else if knodes != nil && len(knodes.Items) > 0 {
250250
klog.Info("kosmosctl uninstall warning, skip removing knode crd because cr instance exists")
251251
} else {
252252
knodeCRD, _ := util.GenerateCustomResourceDefinition(manifest.ClusterTreeKnode, nil)

0 commit comments

Comments
 (0)