func CreateDiscoveryDeploymentAndSecret(cfg *kubeadmapi.MasterConfiguration, client *clientset.Clientset, caCert *x509.Certificate) error { kd := newKubeDiscovery(cfg, caCert) if _, err := client.Extensions().Deployments(api.NamespaceSystem).Create(kd.Deployment); err != nil { return fmt.Errorf("failed to create %q deployment [%v]", kubeDiscoveryName, err) } if _, err := client.Secrets(api.NamespaceSystem).Create(kd.Secret); err != nil { return fmt.Errorf("failed to create %q secret [%v]", kubeDiscoverySecretName, err) } fmt.Println("[token-discovery] Created the kube-discovery deployment, waiting for it to become ready") start := time.Now() wait.PollInfinite(apiCallRetryInterval, func() (bool, error) { d, err := client.Extensions().Deployments(api.NamespaceSystem).Get(kubeDiscoveryName, metav1.GetOptions{}) if err != nil { return false, nil } if d.Status.AvailableReplicas < 1 { return false, nil } return true, nil }) fmt.Printf("[token-discovery] kube-discovery is ready after %f seconds\n", time.Since(start).Seconds()) return nil }
// UpdateOrCreateToken attempts to update a token with the given ID, or create if it does // not already exist. func UpdateOrCreateToken(client *clientset.Clientset, d *kubeadmapi.TokenDiscovery, tokenDuration time.Duration) error { // Let's make sure if valid, err := ValidateToken(d); !valid { return err } secretName := fmt.Sprintf("%s%s", BootstrapTokenSecretPrefix, d.ID) var lastErr error for i := 0; i < tokenCreateRetries; i++ { secret, err := client.Secrets(api.NamespaceSystem).Get(secretName, metav1.GetOptions{}) if err == nil { // Secret with this ID already exists, update it: secret.Data = encodeTokenSecretData(d, tokenDuration) if _, err := client.Secrets(api.NamespaceSystem).Update(secret); err == nil { return nil } else { lastErr = err } continue } // Secret does not already exist: if apierrors.IsNotFound(err) { secret = &v1.Secret{ ObjectMeta: metav1.ObjectMeta{ Name: secretName, }, Type: api.SecretTypeBootstrapToken, Data: encodeTokenSecretData(d, tokenDuration), } if _, err := client.Secrets(api.NamespaceSystem).Create(secret); err == nil { return nil } else { lastErr = err } continue } } return fmt.Errorf( "unable to create bootstrap token after %d attempts [%v]", tokenCreateRetries, lastErr, ) }