From eb0c16a2793b59300084426375782162d367faad Mon Sep 17 00:00:00 2001 From: Shaun Crampton Date: Mon, 7 Dec 2020 16:30:24 +0000 Subject: [PATCH 1/2] Rev typha to pick up backport of discovery changes. --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 690718df20..71f87976b6 100644 --- a/go.mod +++ b/go.mod @@ -27,7 +27,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/projectcalico/libcalico-go v1.7.2-0.20201030225844-6b3cd568a038 github.com/projectcalico/pod2daemon v0.0.0-20200729161441-0e9320f4f3b4 - github.com/projectcalico/typha v0.7.3-0.20201104224511-fe7566e58e70 + github.com/projectcalico/typha v0.7.3-0.20201207153228-2da07bdb6be8 github.com/prometheus/client_golang v1.0.0 github.com/satori/go.uuid v1.2.0 github.com/sirupsen/logrus v1.4.2 diff --git a/go.sum b/go.sum index 63e02d5450..66eeae542d 100644 --- a/go.sum +++ b/go.sum @@ -555,8 +555,8 @@ github.com/projectcalico/logrus v0.0.0-20180701205716-fc9bbf2f5799 h1:9jp4YoHqZv github.com/projectcalico/logrus v0.0.0-20180701205716-fc9bbf2f5799/go.mod h1:DfgrchabbtEO9wjOz5lVae+XRvjFKKWEA9GTMme6A8g= github.com/projectcalico/pod2daemon v0.0.0-20200729161441-0e9320f4f3b4 h1:wVQ0qP1XyZzXLtm77qFecTZjTmjsmuao9YUAAleMwTU= github.com/projectcalico/pod2daemon v0.0.0-20200729161441-0e9320f4f3b4/go.mod h1:bmtxGPEug34TbG/rPrGdPGt/ewR2OBksgA7P9TPKHIk= -github.com/projectcalico/typha v0.7.3-0.20201104224511-fe7566e58e70 h1:EdGFmIq+i1XzzovGf9uLFEaJS7xJCNuFTWbPDQJcd2A= -github.com/projectcalico/typha v0.7.3-0.20201104224511-fe7566e58e70/go.mod h1:4S3QG/nzlY/p46OaZP3z5n2YloHJ6RpF22To4etgFAU= +github.com/projectcalico/typha v0.7.3-0.20201207153228-2da07bdb6be8 h1:nnn30F4d+YYQvYcAz0GlIDc1rLdiWN/aK1ZA1nFhFos= +github.com/projectcalico/typha v0.7.3-0.20201207153228-2da07bdb6be8/go.mod h1:ruoVUdkSr+T17sMjBxBTniCs0xdKSXgu7KXVg8wvBXI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM= From 55a557ac9487ad6eec2b0515e53d6eed9f379240 Mon Sep 17 00:00:00 2001 From: Shaun Crampton Date: Fri, 4 Dec 2020 11:12:33 +0000 Subject: [PATCH 2/2] Use Typha's discovery library. (cherry picked from commit 82d17c81362aa1b76ca694d35ecfabda4cdf893e) --- config/config_params.go | 8 ++++ daemon/daemon.go | 91 ++++++++--------------------------------- 2 files changed, 24 insertions(+), 75 deletions(-) diff --git a/config/config_params.go b/config/config_params.go index f4ed0e8cc0..fb49cef74e 100644 --- a/config/config_params.go +++ b/config/config_params.go @@ -32,6 +32,7 @@ import ( "github.com/projectcalico/libcalico-go/lib/numorstring" "github.com/projectcalico/felix/idalloc" + "github.com/projectcalico/typha/pkg/discovery" ) var ( @@ -759,6 +760,13 @@ func (config *Config) OverrideParam(name, value string) (bool, error) { return config.UpdateFrom(config.internalOverrides, InternalOverride) } +func (config *Config) TyphaDiscoveryOpts() []discovery.Option { + return []discovery.Option{ + discovery.WithAddrOverride(config.TyphaAddr), + discovery.WithKubeService(config.TyphaK8sNamespace, config.TyphaK8sServiceName), + } +} + func New() *Config { if knownParams == nil { loadParams() diff --git a/daemon/daemon.go b/daemon/daemon.go index 1ff0592833..59f8725d59 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -34,21 +34,9 @@ import ( "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" log "github.com/sirupsen/logrus" - metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" - "github.com/projectcalico/felix/buildinfo" - "github.com/projectcalico/felix/calc" - "github.com/projectcalico/felix/config" - _ "github.com/projectcalico/felix/config" - dp "github.com/projectcalico/felix/dataplane" - "github.com/projectcalico/felix/jitter" - "github.com/projectcalico/felix/logutils" - "github.com/projectcalico/felix/policysync" - "github.com/projectcalico/felix/proto" - "github.com/projectcalico/felix/statusrep" - "github.com/projectcalico/felix/usagerep" "github.com/projectcalico/libcalico-go/lib/apiconfig" apiv3 "github.com/projectcalico/libcalico-go/lib/apis/v3" "github.com/projectcalico/libcalico-go/lib/backend" @@ -65,7 +53,20 @@ import ( "github.com/projectcalico/libcalico-go/lib/options" "github.com/projectcalico/libcalico-go/lib/set" "github.com/projectcalico/pod2daemon/binder" + "github.com/projectcalico/typha/pkg/discovery" "github.com/projectcalico/typha/pkg/syncclient" + + "github.com/projectcalico/felix/buildinfo" + "github.com/projectcalico/felix/calc" + "github.com/projectcalico/felix/config" + _ "github.com/projectcalico/felix/config" + dp "github.com/projectcalico/felix/dataplane" + "github.com/projectcalico/felix/jitter" + "github.com/projectcalico/felix/logutils" + "github.com/projectcalico/felix/policysync" + "github.com/projectcalico/felix/proto" + "github.com/projectcalico/felix/statusrep" + "github.com/projectcalico/felix/usagerep" ) const ( @@ -1206,68 +1207,8 @@ func (fc *DataplaneConnector) Start() { go fc.handleWireguardStatUpdateFromDataplane() } -var ErrServiceNotReady = errors.New("Kubernetes service missing IP or port.") - func discoverTyphaAddr(configParams *config.Config, k8sClientSet kubernetes.Interface) (string, error) { - if configParams.TyphaAddr != "" { - // Explicit address; trumps other sources of config. - return configParams.TyphaAddr, nil - } - - if configParams.TyphaK8sServiceName == "" { - // No explicit address, and no service name, not using Typha. - return "", nil - } - - if k8sClientSet == nil { - return "", errors.New("failed to look up Typha, no Kubernetes client available") - } - - // If we get here, we need to look up the Typha service endpoints using the k8s API. - epClient := k8sClientSet.CoreV1().Endpoints(configParams.TyphaK8sNamespace) - eps, err := epClient.Get(configParams.TyphaK8sServiceName, metav1.GetOptions{}) - if err != nil { - log.WithError(err).Error("Unable to get Typha service endpoints from Kubernetes.") - return "", err - } - - candidates := set.New() - - for _, subset := range eps.Subsets { - var portForOurVersion int32 - for _, port := range subset.Ports { - if port.Name == "calico-typha" { - portForOurVersion = port.Port - break - } - } - - if portForOurVersion == 0 { - continue - } - - // If we get here, this endpoint supports the typha port we're looking for. - for _, h := range subset.Addresses { - typhaAddr := net.JoinHostPort(h.IP, fmt.Sprint(portForOurVersion)) - candidates.Add(typhaAddr) - } - } - - if candidates.Len() == 0 { - log.Error("Didn't find any ready Typha instances.") - return "", ErrServiceNotReady - } - - var addrs []string - candidates.Iter(func(item interface{}) error { - typhaAddr := item.(string) - addrs = append(addrs, typhaAddr) - return nil - }) - log.WithField("addrs", addrs).Info("Found ready Typha addresses.") - n := rand.Intn(len(addrs)) - chosenAddr := addrs[n] - log.WithField("choice", chosenAddr).Info("Chose Typha to connect to.") - - return chosenAddr, nil + typhaDiscoveryOpts := configParams.TyphaDiscoveryOpts() + typhaDiscoveryOpts = append(typhaDiscoveryOpts, discovery.WithKubeClient(k8sClientSet)) + return discovery.DiscoverTyphaAddr(typhaDiscoveryOpts...) }