talos/internal/pkg/etcd/endpoints.go
Andrey Smirnov 96e604874b
fix: add hostname to endpoints
Populate endpoint coming from the Kubernetes controlplane endpoint with
the hostname (if the endpoint is a hostname).

This should improve cases when hostname is used for the endpoint in
terms of SNI, proper resolving of DNS if it's dynamic.

See https://github.com/siderolabs/talos/pull/12556#issuecomment-3755862314

Signed-off-by: Andrey Smirnov <andrey.smirnov@siderolabs.com>
2026-01-15 22:56:46 +04:00

49 lines
1.4 KiB
Go

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
package etcd
import (
"context"
"errors"
"fmt"
"github.com/cosi-project/runtime/pkg/safe"
"github.com/cosi-project/runtime/pkg/state"
"github.com/siderolabs/talos/pkg/machinery/constants"
"github.com/siderolabs/talos/pkg/machinery/nethelpers"
"github.com/siderolabs/talos/pkg/machinery/resources/k8s"
)
// GetEndpoints returns expected endpoints of etcd cluster members.
//
// It is not guaranteed that etcd is running on each listed endpoint.
func GetEndpoints(ctx context.Context, resources state.State) ([]string, error) {
endpointResources, err := safe.StateListAll[*k8s.Endpoint](ctx, resources)
if err != nil {
return nil, fmt.Errorf("error getting endpoints resources: %w", err)
}
var endpointAddrs k8s.EndpointList
// merge all endpoints into a single list
for res := range endpointResources.All() {
endpointAddrs = endpointAddrs.Merge(res)
}
if endpointAddrs.IsEmpty() {
return nil, errors.New("no controlplane endpoints discovered yet")
}
endpoints := endpointAddrs.Strings()
// Etcd expects host:port format.
for i := range endpoints {
endpoints[i] = nethelpers.JoinHostPort(endpoints[i], constants.EtcdClientPort)
}
return endpoints, nil
}