diff options
author | 2021-05-27 21:48:52 +0900 | |
---|---|---|
committer | 2021-05-27 08:48:52 -0400 | |
commit | 4c0fdc390950694b40c75686bc7549e48f430ff2 (patch) | |
tree | d7c9c4700f367d2ad6837e59350efb114c5f24f4 | |
parent | d8a0d97df27244c8f958dea4cb8bbb89121e355d (diff) | |
download | coredns-4c0fdc390950694b40c75686bc7549e48f430ff2.tar.gz coredns-4c0fdc390950694b40c75686bc7549e48f430ff2.tar.zst coredns-4c0fdc390950694b40c75686bc7549e48f430ff2.zip |
plugin/kubernetes: consistently choose EndpointSlices or Endpoints for unstable API (#4647)
* confirm endpointslices is served or not
Signed-off-by: uesyn <suemura@zlab.co.jp>
* Apply suggestions
Signed-off-by: uesyn <suemura@zlab.co.jp>
-rw-r--r-- | plugin/kubernetes/kubernetes.go | 36 |
1 files changed, 23 insertions, 13 deletions
diff --git a/plugin/kubernetes/kubernetes.go b/plugin/kubernetes/kubernetes.go index ea99a81ce..1c0c4a55d 100644 --- a/plugin/kubernetes/kubernetes.go +++ b/plugin/kubernetes/kubernetes.go @@ -22,6 +22,7 @@ import ( api "k8s.io/api/core/v1" discovery "k8s.io/api/discovery/v1" discoveryV1beta1 "k8s.io/api/discovery/v1beta1" + kerrors "k8s.io/apimachinery/pkg/api/errors" meta "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/apimachinery/pkg/labels" "k8s.io/client-go/kubernetes" @@ -301,8 +302,6 @@ func (k *Kubernetes) InitKubeCache(ctx context.Context) (onStart func() error, o // v1 is not supported. // This function should be removed, when all supported versions of k8s support v1. func (k *Kubernetes) endpointSliceSupported(kubeClient *kubernetes.Clientset) (bool, string) { - var sliceVer string - useEndpointSlices := false ticker := time.NewTicker(100 * time.Millisecond) defer ticker.Stop() for { @@ -312,25 +311,36 @@ func (k *Kubernetes) endpointSliceSupported(kubeClient *kubernetes.Clientset) (b if err != nil { continue } - // Enable use of endpoint slices if the API supports the discovery api - if _, err := kubeClient.Discovery().ServerResourcesForGroupVersion(discovery.SchemeGroupVersion.String()); err == nil { - useEndpointSlices = true - sliceVer = discovery.SchemeGroupVersion.String() - } else if _, err := kubeClient.Discovery().ServerResourcesForGroupVersion(discoveryV1beta1.SchemeGroupVersion.String()); err == nil { - useEndpointSlices = true - sliceVer = discoveryV1beta1.SchemeGroupVersion.String() - } + // Disable use of endpoint slices for k8s versions 1.18 and earlier. The Endpointslices API was enabled // by default in 1.17 but Service -> Pod proxy continued to use Endpoints by default until 1.19. // DNS results should be built from the same source data that the proxy uses. This decision assumes // k8s EndpointSliceProxying featuregate is at the default (i.e. only enabled for k8s >= 1.19). major, _ := strconv.Atoi(sv.Major) minor, _ := strconv.Atoi(strings.TrimRight(sv.Minor, "+")) - if useEndpointSlices && major <= 1 && minor <= 18 { + if major <= 1 && minor <= 18 { log.Info("Watching Endpoints instead of EndpointSlices in k8s versions < 1.19") - useEndpointSlices = false + return false, "" } - return useEndpointSlices, sliceVer + + // Enable use of endpoint slices if the API supports the discovery api + _, err = kubeClient.Discovery().ServerResourcesForGroupVersion(discovery.SchemeGroupVersion.String()) + if err == nil { + return true, discovery.SchemeGroupVersion.String() + } else if !kerrors.IsNotFound(err) { + continue + } + + _, err = kubeClient.Discovery().ServerResourcesForGroupVersion(discoveryV1beta1.SchemeGroupVersion.String()) + if err == nil { + return true, discoveryV1beta1.SchemeGroupVersion.String() + } else if !kerrors.IsNotFound(err) { + continue + } + + // Disable use of endpoint slices in case that it is disabled in k8s versions 1.19 and newer. + log.Info("Endpointslices API disabled. Watching Endpoints instead.") + return false, "" } } } |