@@ -164,7 +164,7 @@ func (s *KubeAPIServer) configure(ctx context.Context, cfg *config.Config) error
164164 }
165165 }
166166
167- etcdServers , err := discoverEtcdServers (ctx , s .configuration .Node . HostnameOverride , s . configuration . BootstrapKubeConfigPath ())
167+ etcdServers , err := discoverEtcdServers (ctx , s .configuration .BootstrapKubeConfigPath ())
168168 if err != nil {
169169 return fmt .Errorf ("failed to discover etcd servers: %w" , err )
170170 }
@@ -412,7 +412,7 @@ func (s *KubeAPIServer) Run(ctx context.Context, ready chan<- struct{}, stopped
412412 }
413413}
414414
415- func discoverEtcdServers (ctx context.Context , hostname , kubeconfigPath string ) ([]string , error ) {
415+ func discoverEtcdServers (ctx context.Context , kubeconfigPath string ) ([]string , error ) {
416416 certsDir := cryptomaterial .CertsDirectory (config .DataDir )
417417 etcdPeerCertDir := cryptomaterial .EtcdPeerCertDir (certsDir )
418418
@@ -441,61 +441,61 @@ func discoverEtcdServers(ctx context.Context, hostname, kubeconfigPath string) (
441441 if err != nil {
442442 return nil , fmt .Errorf ("failed to get etcd status: %w" , err )
443443 }
444- if st .IsLearner {
445- //TODO if its a learner I need to take the server from the current non-learner members. Use the bootstrap for that.
446- kubeconfig , err := clientcmd .LoadFromFile (kubeconfigPath )
447- if err != nil {
448- return nil , fmt .Errorf ("failed to load bootstrap kubeconfig: %w" , err )
449- }
450444
451- if kubeconfig == nil || kubeconfig .Clusters == nil || len (kubeconfig .Clusters ) == 0 {
452- return nil , fmt .Errorf ("invalid bootstrap kubeconfig: no clusters found" )
453- }
445+ // If I am not a learner it means I am a voting member, so connecting to my own etcd instance
446+ // is fine because everything is synced.
447+ if ! st .IsLearner {
448+ return []string {"https://localhost:2379" }, nil
449+ }
454450
455- var etcdHost string
456- for _ , cluster := range kubeconfig .Clusters {
457- etcdHost = cluster .Server
458- break
459- }
451+ // If I am a learner I need to connect to a member, retrieve the list of voting
452+ // members and connect to all of them.
453+ kubeconfig , err := clientcmd .LoadFromFile (kubeconfigPath )
454+ if err != nil {
455+ return nil , fmt .Errorf ("failed to load bootstrap kubeconfig: %w" , err )
456+ }
460457
461- if etcdHost == "" {
462- return nil , fmt .Errorf ("failed to extract etcd hostname from bootstrap kubeconfig " )
463- }
458+ if kubeconfig == nil || kubeconfig . Clusters == nil || len ( kubeconfig . Clusters ) == 0 {
459+ return nil , fmt .Errorf ("invalid bootstrap kubeconfig: no clusters found " )
460+ }
464461
465- etcdHost = strings .TrimPrefix (etcdHost , "https://" )
466- etcdHost , _ , _ = net .SplitHostPort (etcdHost )
467- etcdHost = fmt .Sprintf ("https://%s" , net .JoinHostPort (etcdHost , "2379" ))
468- client , err = clientv3 .New (clientv3.Config {
469- DialTimeout : 5 * time .Second ,
470- Endpoints : []string {etcdHost },
471- TLS : tlsConfig ,
472- Context : ctx ,
473- })
474- if err != nil {
475- return nil , fmt .Errorf ("failed to create etcd client: %w" , err )
476- }
462+ if len (kubeconfig .Clusters ) > 1 {
463+ return nil , fmt .Errorf ("invalid bootstrap kubeconfig: multiple clusters found" )
464+ }
465+
466+ var etcdHost string
467+ for _ , cluster := range kubeconfig .Clusters {
468+ etcdHost = cluster .Server
469+ break
470+ }
471+
472+ if etcdHost == "" {
473+ return nil , fmt .Errorf ("failed to extract etcd hostname from bootstrap kubeconfig" )
474+ }
475+
476+ etcdHost = strings .TrimPrefix (etcdHost , "https://" )
477+ etcdHost , _ , _ = net .SplitHostPort (etcdHost )
478+ etcdHost = fmt .Sprintf ("https://%s" , net .JoinHostPort (etcdHost , "2379" ))
479+ client , err = clientv3 .New (clientv3.Config {
480+ DialTimeout : 5 * time .Second ,
481+ Endpoints : []string {etcdHost },
482+ TLS : tlsConfig ,
483+ Context : ctx ,
484+ })
485+ if err != nil {
486+ return nil , fmt .Errorf ("failed to create etcd client: %w" , err )
477487 }
478488
479489 resp , err := client .MemberList (ctx )
480490 if err != nil {
481491 return nil , fmt .Errorf ("failed to retrieve etcd member list: %w" , err )
482492 }
483493
484- //TODO I already know if I am a learner, I had to do this before.
485- iAmLearner := false
486494 var members []string
487495 for _ , member := range resp .Members {
488- if member .Name == hostname && member .IsLearner {
489- iAmLearner = true
490- continue
491- }
492496 if ! member .IsLearner {
493497 members = append (members , member .ClientURLs ... )
494498 }
495499 }
496- if iAmLearner {
497- return members , nil
498- }
499-
500- return []string {"https://localhost:2379" }, nil
500+ return members , nil
501501}
0 commit comments