mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 09:22:44 +00:00
Add option to disable federation ingress controller
This commit is contained in:
parent
f16320ea3c
commit
007d7a802f
@ -33,9 +33,13 @@ go_library(
|
|||||||
"//federation/pkg/federation-controller/secret:go_default_library",
|
"//federation/pkg/federation-controller/secret:go_default_library",
|
||||||
"//federation/pkg/federation-controller/service:go_default_library",
|
"//federation/pkg/federation-controller/service:go_default_library",
|
||||||
"//federation/pkg/federation-controller/util:go_default_library",
|
"//federation/pkg/federation-controller/util:go_default_library",
|
||||||
|
"//pkg/apis/meta/v1:go_default_library",
|
||||||
"//pkg/client/restclient:go_default_library",
|
"//pkg/client/restclient:go_default_library",
|
||||||
|
"//pkg/client/typed/discovery:go_default_library",
|
||||||
"//pkg/client/unversioned/clientcmd:go_default_library",
|
"//pkg/client/unversioned/clientcmd:go_default_library",
|
||||||
"//pkg/healthz:go_default_library",
|
"//pkg/healthz:go_default_library",
|
||||||
|
"//pkg/runtime/schema:go_default_library",
|
||||||
|
"//pkg/util/config:go_default_library",
|
||||||
"//pkg/util/configz:go_default_library",
|
"//pkg/util/configz:go_default_library",
|
||||||
"//pkg/util/wait:go_default_library",
|
"//pkg/util/wait:go_default_library",
|
||||||
"//pkg/version:go_default_library",
|
"//pkg/version:go_default_library",
|
||||||
@ -45,3 +49,16 @@ go_library(
|
|||||||
"//vendor:github.com/spf13/pflag",
|
"//vendor:github.com/spf13/pflag",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
go_test(
|
||||||
|
name = "go_default_test",
|
||||||
|
srcs = ["controllermanager_test.go"],
|
||||||
|
library = "go_default_library",
|
||||||
|
tags = ["automanaged"],
|
||||||
|
deps = [
|
||||||
|
"//federation/pkg/federation-controller/ingress:go_default_library",
|
||||||
|
"//pkg/apis/meta/v1:go_default_library",
|
||||||
|
"//pkg/runtime/schema:go_default_library",
|
||||||
|
"//pkg/util/config:go_default_library",
|
||||||
|
],
|
||||||
|
)
|
||||||
|
@ -39,6 +39,7 @@ import (
|
|||||||
secretcontroller "k8s.io/kubernetes/federation/pkg/federation-controller/secret"
|
secretcontroller "k8s.io/kubernetes/federation/pkg/federation-controller/secret"
|
||||||
servicecontroller "k8s.io/kubernetes/federation/pkg/federation-controller/service"
|
servicecontroller "k8s.io/kubernetes/federation/pkg/federation-controller/service"
|
||||||
"k8s.io/kubernetes/federation/pkg/federation-controller/util"
|
"k8s.io/kubernetes/federation/pkg/federation-controller/util"
|
||||||
|
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
|
||||||
"k8s.io/kubernetes/pkg/client/restclient"
|
"k8s.io/kubernetes/pkg/client/restclient"
|
||||||
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
"k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
|
||||||
"k8s.io/kubernetes/pkg/healthz"
|
"k8s.io/kubernetes/pkg/healthz"
|
||||||
@ -50,6 +51,9 @@ import (
|
|||||||
"github.com/prometheus/client_golang/prometheus"
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
"k8s.io/kubernetes/pkg/client/typed/discovery"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime/schema"
|
||||||
|
"k8s.io/kubernetes/pkg/util/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -155,6 +159,12 @@ func StartControllers(s *options.CMServer, restClientCfg *restclient.Config) err
|
|||||||
glog.Fatalf("Cloud provider could not be initialized: %v", err)
|
glog.Fatalf("Cloud provider could not be initialized: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
discoveryClient := discovery.NewDiscoveryClientForConfigOrDie(restClientCfg)
|
||||||
|
serverResources, err := discoveryClient.ServerResources()
|
||||||
|
if err != nil {
|
||||||
|
glog.Fatalf("Could not find resources from API Server: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
glog.Infof("Loading client config for namespace controller %q", "namespace-controller")
|
glog.Infof("Loading client config for namespace controller %q", "namespace-controller")
|
||||||
nsClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "namespace-controller"))
|
nsClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "namespace-controller"))
|
||||||
namespaceController := namespacecontroller.NewNamespaceController(nsClientset)
|
namespaceController := namespacecontroller.NewNamespaceController(nsClientset)
|
||||||
@ -182,11 +192,13 @@ func StartControllers(s *options.CMServer, restClientCfg *restclient.Config) err
|
|||||||
// TODO: rename s.ConcurentReplicaSetSyncs
|
// TODO: rename s.ConcurentReplicaSetSyncs
|
||||||
go deploymentController.Run(s.ConcurrentReplicaSetSyncs, wait.NeverStop)
|
go deploymentController.Run(s.ConcurrentReplicaSetSyncs, wait.NeverStop)
|
||||||
|
|
||||||
glog.Infof("Loading client config for ingress controller %q", "ingress-controller")
|
if controllerEnabled(s.Controllers, serverResources, ingresscontroller.ControllerName, ingresscontroller.RequiredResources, true) {
|
||||||
ingClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "ingress-controller"))
|
glog.Infof("Loading client config for ingress controller %q", "ingress-controller")
|
||||||
ingressController := ingresscontroller.NewIngressController(ingClientset)
|
ingClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, "ingress-controller"))
|
||||||
glog.Infof("Running ingress controller")
|
ingressController := ingresscontroller.NewIngressController(ingClientset)
|
||||||
ingressController.Run(wait.NeverStop)
|
glog.Infof("Running ingress controller")
|
||||||
|
ingressController.Run(wait.NeverStop)
|
||||||
|
}
|
||||||
|
|
||||||
glog.Infof("Loading client config for service controller %q", servicecontroller.UserAgentName)
|
glog.Infof("Loading client config for service controller %q", servicecontroller.UserAgentName)
|
||||||
scClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, servicecontroller.UserAgentName))
|
scClientset := federationclientset.NewForConfigOrDie(restclient.AddUserAgent(restClientCfg, servicecontroller.UserAgentName))
|
||||||
@ -209,3 +221,46 @@ func restClientConfigFromSecret(master string) (*restclient.Config, error) {
|
|||||||
}
|
}
|
||||||
return restClientCfg, nil
|
return restClientCfg, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func controllerEnabled(controllers config.ConfigurationMap, serverResources []*metav1.APIResourceList, controller string, requiredResources []schema.GroupVersionResource, defaultValue bool) bool {
|
||||||
|
controllerConfig, ok := controllers[controller]
|
||||||
|
if ok {
|
||||||
|
if controllerConfig == "false" {
|
||||||
|
glog.Infof("%s controller disabled by config", controller)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
if controllerConfig == "true" {
|
||||||
|
if !hasRequiredResources(serverResources, requiredResources) {
|
||||||
|
glog.Fatalf("%s controller enabled explicitly but API Server does not have required resources", controller)
|
||||||
|
panic("unreachable")
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
} else if defaultValue {
|
||||||
|
if !hasRequiredResources(serverResources, requiredResources) {
|
||||||
|
glog.Warningf("%s controller disabled because API Server does not have required resources", controller)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return defaultValue
|
||||||
|
}
|
||||||
|
|
||||||
|
func hasRequiredResources(serverResources []*metav1.APIResourceList, requiredResources []schema.GroupVersionResource) bool {
|
||||||
|
for _, resource := range requiredResources {
|
||||||
|
found := false
|
||||||
|
for _, serverResource := range serverResources {
|
||||||
|
if serverResource.GroupVersion == resource.GroupVersion().String() {
|
||||||
|
for _, apiResource := range serverResource.APIResources {
|
||||||
|
if apiResource.Name == resource.Resource {
|
||||||
|
found = true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if !found {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
@ -0,0 +1,88 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2016 The Kubernetes Authors.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
ingresscontroller "k8s.io/kubernetes/federation/pkg/federation-controller/ingress"
|
||||||
|
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime/schema"
|
||||||
|
"k8s.io/kubernetes/pkg/util/config"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestControllerEnabled(t *testing.T) {
|
||||||
|
|
||||||
|
testCases := []struct {
|
||||||
|
controllersConfig config.ConfigurationMap
|
||||||
|
serverResources []*metav1.APIResourceList
|
||||||
|
controller string
|
||||||
|
requiredResources []schema.GroupVersionResource
|
||||||
|
defaultValue bool
|
||||||
|
expectedResult bool
|
||||||
|
}{
|
||||||
|
// no override, API server has Ingress enabled
|
||||||
|
{
|
||||||
|
controllersConfig: config.ConfigurationMap{},
|
||||||
|
serverResources: []*metav1.APIResourceList{
|
||||||
|
{
|
||||||
|
GroupVersion: "extensions/v1beta1",
|
||||||
|
APIResources: []metav1.APIResource{
|
||||||
|
{Name: "ingresses", Namespaced: true, Kind: "Ingress"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
controller: ingresscontroller.ControllerName,
|
||||||
|
requiredResources: ingresscontroller.RequiredResources,
|
||||||
|
defaultValue: true,
|
||||||
|
expectedResult: true,
|
||||||
|
},
|
||||||
|
// no override, API server has Ingress disabled
|
||||||
|
{
|
||||||
|
controllersConfig: config.ConfigurationMap{},
|
||||||
|
serverResources: []*metav1.APIResourceList{},
|
||||||
|
controller: ingresscontroller.ControllerName,
|
||||||
|
requiredResources: ingresscontroller.RequiredResources,
|
||||||
|
defaultValue: true,
|
||||||
|
expectedResult: false,
|
||||||
|
},
|
||||||
|
// API server has Ingress enabled, override config to disable Ingress controller
|
||||||
|
{
|
||||||
|
controllersConfig: config.ConfigurationMap{
|
||||||
|
ingresscontroller.ControllerName: "false",
|
||||||
|
},
|
||||||
|
serverResources: []*metav1.APIResourceList{
|
||||||
|
{
|
||||||
|
GroupVersion: "extensions/v1beta1",
|
||||||
|
APIResources: []metav1.APIResource{
|
||||||
|
{Name: "ingresses", Namespaced: true, Kind: "Ingress"},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
controller: ingresscontroller.ControllerName,
|
||||||
|
requiredResources: ingresscontroller.RequiredResources,
|
||||||
|
defaultValue: true,
|
||||||
|
expectedResult: false,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range testCases {
|
||||||
|
actualEnabled := controllerEnabled(test.controllersConfig, test.serverResources, test.controller, test.requiredResources, test.defaultValue)
|
||||||
|
if actualEnabled != test.expectedResult {
|
||||||
|
t.Errorf("%s controller: expected %v, got %v", test.controller, test.expectedResult, actualEnabled)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -19,6 +19,7 @@ go_library(
|
|||||||
"//pkg/apis/componentconfig:go_default_library",
|
"//pkg/apis/componentconfig:go_default_library",
|
||||||
"//pkg/apis/meta/v1:go_default_library",
|
"//pkg/apis/meta/v1:go_default_library",
|
||||||
"//pkg/client/leaderelection:go_default_library",
|
"//pkg/client/leaderelection:go_default_library",
|
||||||
|
"//pkg/util/config:go_default_library",
|
||||||
"//vendor:github.com/spf13/pflag",
|
"//vendor:github.com/spf13/pflag",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
@ -28,6 +28,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/apis/componentconfig"
|
"k8s.io/kubernetes/pkg/apis/componentconfig"
|
||||||
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
|
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1"
|
||||||
"k8s.io/kubernetes/pkg/client/leaderelection"
|
"k8s.io/kubernetes/pkg/client/leaderelection"
|
||||||
|
"k8s.io/kubernetes/pkg/util/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ControllerManagerConfiguration struct {
|
type ControllerManagerConfiguration struct {
|
||||||
@ -67,6 +68,8 @@ type ControllerManagerConfiguration struct {
|
|||||||
LeaderElection componentconfig.LeaderElectionConfiguration `json:"leaderElection"`
|
LeaderElection componentconfig.LeaderElectionConfiguration `json:"leaderElection"`
|
||||||
// contentType is contentType of requests sent to apiserver.
|
// contentType is contentType of requests sent to apiserver.
|
||||||
ContentType string `json:"contentType"`
|
ContentType string `json:"contentType"`
|
||||||
|
// ConfigurationMap determining which controllers should be enabled or disabled
|
||||||
|
Controllers config.ConfigurationMap `json:"controllers"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// CMServer is the main context object for the controller manager.
|
// CMServer is the main context object for the controller manager.
|
||||||
@ -94,6 +97,7 @@ func NewCMServer() *CMServer {
|
|||||||
APIServerQPS: 20.0,
|
APIServerQPS: 20.0,
|
||||||
APIServerBurst: 30,
|
APIServerBurst: 30,
|
||||||
LeaderElection: leaderelection.DefaultLeaderElectionConfiguration(),
|
LeaderElection: leaderelection.DefaultLeaderElectionConfiguration(),
|
||||||
|
Controllers: make(config.ConfigurationMap),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
return &s
|
return &s
|
||||||
@ -118,5 +122,9 @@ func (s *CMServer) AddFlags(fs *pflag.FlagSet) {
|
|||||||
fs.IntVar(&s.APIServerBurst, "federated-api-burst", s.APIServerBurst, "Burst to use while talking with federation apiserver")
|
fs.IntVar(&s.APIServerBurst, "federated-api-burst", s.APIServerBurst, "Burst to use while talking with federation apiserver")
|
||||||
fs.StringVar(&s.DnsProvider, "dns-provider", s.DnsProvider, "DNS provider. Valid values are: "+fmt.Sprintf("%q", dnsprovider.RegisteredDnsProviders()))
|
fs.StringVar(&s.DnsProvider, "dns-provider", s.DnsProvider, "DNS provider. Valid values are: "+fmt.Sprintf("%q", dnsprovider.RegisteredDnsProviders()))
|
||||||
fs.StringVar(&s.DnsConfigFile, "dns-provider-config", s.DnsConfigFile, "Path to config file for configuring DNS provider.")
|
fs.StringVar(&s.DnsConfigFile, "dns-provider-config", s.DnsConfigFile, "Path to config file for configuring DNS provider.")
|
||||||
|
fs.Var(&s.Controllers, "controllers", ""+
|
||||||
|
"A set of key=value pairs that describe controller configuration that may be passed "+
|
||||||
|
"to controller manager to enable/disable specific controllers. Valid options are: \n"+
|
||||||
|
"ingress=true|false (default=true)")
|
||||||
leaderelection.BindFlags(&s.LeaderElection, fs)
|
leaderelection.BindFlags(&s.LeaderElection, fs)
|
||||||
}
|
}
|
||||||
|
@ -30,6 +30,7 @@ go_library(
|
|||||||
"//pkg/controller:go_default_library",
|
"//pkg/controller:go_default_library",
|
||||||
"//pkg/conversion:go_default_library",
|
"//pkg/conversion:go_default_library",
|
||||||
"//pkg/runtime:go_default_library",
|
"//pkg/runtime:go_default_library",
|
||||||
|
"//pkg/runtime/schema:go_default_library",
|
||||||
"//pkg/types:go_default_library",
|
"//pkg/types:go_default_library",
|
||||||
"//pkg/util/flowcontrol:go_default_library",
|
"//pkg/util/flowcontrol:go_default_library",
|
||||||
"//pkg/watch:go_default_library",
|
"//pkg/watch:go_default_library",
|
||||||
|
@ -36,6 +36,7 @@ import (
|
|||||||
"k8s.io/kubernetes/pkg/controller"
|
"k8s.io/kubernetes/pkg/controller"
|
||||||
"k8s.io/kubernetes/pkg/conversion"
|
"k8s.io/kubernetes/pkg/conversion"
|
||||||
pkgruntime "k8s.io/kubernetes/pkg/runtime"
|
pkgruntime "k8s.io/kubernetes/pkg/runtime"
|
||||||
|
"k8s.io/kubernetes/pkg/runtime/schema"
|
||||||
"k8s.io/kubernetes/pkg/types"
|
"k8s.io/kubernetes/pkg/types"
|
||||||
"k8s.io/kubernetes/pkg/util/flowcontrol"
|
"k8s.io/kubernetes/pkg/util/flowcontrol"
|
||||||
"k8s.io/kubernetes/pkg/watch"
|
"k8s.io/kubernetes/pkg/watch"
|
||||||
@ -58,6 +59,11 @@ const (
|
|||||||
// We wait for ingress to be created in this cluster before creating it any
|
// We wait for ingress to be created in this cluster before creating it any
|
||||||
// other cluster.
|
// other cluster.
|
||||||
firstClusterAnnotation = "ingress.federation.kubernetes.io/first-cluster"
|
firstClusterAnnotation = "ingress.federation.kubernetes.io/first-cluster"
|
||||||
|
ControllerName = "ingress"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
RequiredResources = []schema.GroupVersionResource{extensionsv1beta1.SchemeGroupVersion.WithResource("ingresses")}
|
||||||
)
|
)
|
||||||
|
|
||||||
type IngressController struct {
|
type IngressController struct {
|
||||||
@ -494,6 +500,12 @@ func (ic *IngressController) reconcileConfigMapForCluster(clusterName string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ingressList := ic.ingressInformerStore.List()
|
||||||
|
if len(ingressList) <= 0 {
|
||||||
|
glog.V(4).Infof("No federated ingresses, ignore reconcile config map.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if clusterName == allClustersKey {
|
if clusterName == allClustersKey {
|
||||||
clusters, err := ic.configMapFederatedInformer.GetReadyClusters()
|
clusters, err := ic.configMapFederatedInformer.GetReadyClusters()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -129,15 +129,15 @@ func TestIngressController(t *testing.T) {
|
|||||||
t.Log("Adding Ingress UID ConfigMap to cluster 1")
|
t.Log("Adding Ingress UID ConfigMap to cluster 1")
|
||||||
cluster1ConfigMapWatch.Add(cfg1)
|
cluster1ConfigMapWatch.Add(cfg1)
|
||||||
|
|
||||||
t.Log("Checking that UID annotation on Cluster 1 annotation was correctly updated")
|
|
||||||
cluster := GetClusterFromChan(fedClusterUpdateChan)
|
|
||||||
assert.NotNil(t, cluster)
|
|
||||||
assert.Equal(t, cluster.ObjectMeta.Annotations[uidAnnotationKey], cfg1.Data[uidKey])
|
|
||||||
|
|
||||||
// Test add federated ingress.
|
// Test add federated ingress.
|
||||||
t.Log("Adding Federated Ingress")
|
t.Log("Adding Federated Ingress")
|
||||||
fedIngressWatch.Add(&fedIngress)
|
fedIngressWatch.Add(&fedIngress)
|
||||||
|
|
||||||
|
t.Log("Checking that UID annotation on Cluster 1 annotation was correctly updated after adding Federated Ingress")
|
||||||
|
cluster := GetClusterFromChan(fedClusterUpdateChan)
|
||||||
|
assert.NotNil(t, cluster)
|
||||||
|
assert.Equal(t, cluster.ObjectMeta.Annotations[uidAnnotationKey], cfg1.Data[uidKey])
|
||||||
|
|
||||||
t.Logf("Checking that approproate finalizers are added")
|
t.Logf("Checking that approproate finalizers are added")
|
||||||
// There should be 2 updates to add both the finalizers.
|
// There should be 2 updates to add both the finalizers.
|
||||||
updatedIngress := GetIngressFromChan(t, fedIngressUpdateChan)
|
updatedIngress := GetIngressFromChan(t, fedIngressUpdateChan)
|
||||||
|
@ -519,6 +519,7 @@ k8s.io/kubernetes/cmd/mungedocs,mwielgus,1
|
|||||||
k8s.io/kubernetes/examples,Random-Liu,0
|
k8s.io/kubernetes/examples,Random-Liu,0
|
||||||
k8s.io/kubernetes/federation/apis/federation/install,nikhiljindal,0
|
k8s.io/kubernetes/federation/apis/federation/install,nikhiljindal,0
|
||||||
k8s.io/kubernetes/federation/apis/federation/validation,nikhiljindal,0
|
k8s.io/kubernetes/federation/apis/federation/validation,nikhiljindal,0
|
||||||
|
k8s.io/kubernetes/federation/cmd/federation-controller-manager/app,kzwang,0
|
||||||
k8s.io/kubernetes/federation/pkg/dnsprovider,sttts,1
|
k8s.io/kubernetes/federation/pkg/dnsprovider,sttts,1
|
||||||
k8s.io/kubernetes/federation/pkg/dnsprovider/providers/aws/route53,cjcullen,1
|
k8s.io/kubernetes/federation/pkg/dnsprovider/providers/aws/route53,cjcullen,1
|
||||||
k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns,jsafrane,1
|
k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns,jsafrane,1
|
||||||
|
|
Loading…
Reference in New Issue
Block a user