blob: d937824e4dde5f68d584be12c41aa76acabdbb65 [file] [log] [blame]
package kubernetes
import (
"context"
"net"
"source.monogon.dev/go/net/tinylb"
"source.monogon.dev/metropolis/node"
ipb "source.monogon.dev/metropolis/node/core/curator/proto/api"
"source.monogon.dev/metropolis/node/core/curator/watcher"
"source.monogon.dev/metropolis/pkg/event/memory"
)
// updateLoadBalancerAPIServers provides a tinylb BackendSet memory value with
// the currently known nodes running a Kubernetes apiserver as retrieved from the
// given curator client.
func updateLoadbalancerAPIServers(ctx context.Context, val *memory.Value[tinylb.BackendSet], cur ipb.CuratorClient) error {
set := &tinylb.BackendSet{}
val.Set(set.Clone())
return watcher.WatchNodes(ctx, cur, watcher.SimpleFollower{
FilterFn: func(a *ipb.Node) bool {
if a.Status == nil {
return false
}
if a.Status.ExternalAddress == "" {
return false
}
if a.Roles.KubernetesController == nil {
return false
}
return true
},
EqualsFn: func(a *ipb.Node, b *ipb.Node) bool {
return a.Status.ExternalAddress == b.Status.ExternalAddress
},
OnNewUpdated: func(new *ipb.Node) error {
set.Insert(new.Id, &tinylb.SimpleTCPBackend{
Remote: net.JoinHostPort(new.Status.ExternalAddress, node.KubernetesAPIPort.PortString()),
})
val.Set(set.Clone())
return nil
},
OnDeleted: func(prev *ipb.Node) error {
set.Delete(prev.Id)
val.Set(set.Clone())
return nil
},
})
}