mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-08-03 17:30:00 +00:00
Merge pull request #42895 from shashidharatd/coredns-2
Automatic merge from submit-queue (batch tested with PRs 42895, 45940) [Federation] Automate configuring nameserver in cluster-dns for CoreDNS provider Addresses issue #42894 #42822 **Release note**: ``` [Federation] CoreDNS server will be automatically added to nameserver resolv.conf chain When using CoreDNS as dns provider for federation during federation join. ``` cc @madhusudancs @kubernetes/sig-federation-bugs
This commit is contained in:
commit
a45a1ef28f
@ -36,8 +36,9 @@ const (
|
|||||||
// Config to override defaults
|
// Config to override defaults
|
||||||
type Config struct {
|
type Config struct {
|
||||||
Global struct {
|
Global struct {
|
||||||
EtcdEndpoints string `gcfg:"etcd-endpoints"`
|
EtcdEndpoints string `gcfg:"etcd-endpoints"`
|
||||||
DNSZones string `gcfg:"zones"`
|
DNSZones string `gcfg:"zones"`
|
||||||
|
CoreDNSEndpoints string `gcfg:"coredns-endpoints"`
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ go_library(
|
|||||||
deps = [
|
deps = [
|
||||||
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
|
"//cmd/kubeadm/app/util/kubeconfig:go_default_library",
|
||||||
"//federation/apis/federation:go_default_library",
|
"//federation/apis/federation:go_default_library",
|
||||||
|
"//federation/pkg/dnsprovider/providers/coredns:go_default_library",
|
||||||
"//federation/pkg/kubefed/util:go_default_library",
|
"//federation/pkg/kubefed/util:go_default_library",
|
||||||
"//pkg/api:go_default_library",
|
"//pkg/api:go_default_library",
|
||||||
"//pkg/api/v1:go_default_library",
|
"//pkg/api/v1:go_default_library",
|
||||||
@ -27,6 +28,7 @@ go_library(
|
|||||||
"//vendor/github.com/golang/glog:go_default_library",
|
"//vendor/github.com/golang/glog:go_default_library",
|
||||||
"//vendor/github.com/spf13/cobra:go_default_library",
|
"//vendor/github.com/spf13/cobra:go_default_library",
|
||||||
"//vendor/github.com/spf13/pflag:go_default_library",
|
"//vendor/github.com/spf13/pflag:go_default_library",
|
||||||
|
"//vendor/gopkg.in/gcfg.v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/util/intstr:go_default_library",
|
||||||
@ -46,6 +48,7 @@ go_test(
|
|||||||
tags = ["automanaged"],
|
tags = ["automanaged"],
|
||||||
deps = [
|
deps = [
|
||||||
"//federation/apis/federation:go_default_library",
|
"//federation/apis/federation:go_default_library",
|
||||||
|
"//federation/pkg/dnsprovider/providers/coredns:go_default_library",
|
||||||
"//federation/pkg/kubefed/testing:go_default_library",
|
"//federation/pkg/kubefed/testing:go_default_library",
|
||||||
"//federation/pkg/kubefed/util:go_default_library",
|
"//federation/pkg/kubefed/util:go_default_library",
|
||||||
"//pkg/api:go_default_library",
|
"//pkg/api:go_default_library",
|
||||||
@ -57,6 +60,7 @@ go_test(
|
|||||||
"//pkg/apis/rbac/v1beta1:go_default_library",
|
"//pkg/apis/rbac/v1beta1:go_default_library",
|
||||||
"//pkg/kubectl/cmd/testing:go_default_library",
|
"//pkg/kubectl/cmd/testing:go_default_library",
|
||||||
"//pkg/kubectl/cmd/util:go_default_library",
|
"//pkg/kubectl/cmd/util:go_default_library",
|
||||||
|
"//vendor/gopkg.in/gcfg.v1:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/equality:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library",
|
||||||
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
"//vendor/k8s.io/apimachinery/pkg/api/resource:go_default_library",
|
||||||
|
@ -42,6 +42,7 @@ import (
|
|||||||
triple "k8s.io/client-go/util/cert/triple"
|
triple "k8s.io/client-go/util/cert/triple"
|
||||||
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
kubeconfigutil "k8s.io/kubernetes/cmd/kubeadm/app/util/kubeconfig"
|
||||||
"k8s.io/kubernetes/federation/apis/federation"
|
"k8s.io/kubernetes/federation/apis/federation"
|
||||||
|
"k8s.io/kubernetes/federation/pkg/dnsprovider/providers/coredns"
|
||||||
"k8s.io/kubernetes/federation/pkg/kubefed/util"
|
"k8s.io/kubernetes/federation/pkg/kubefed/util"
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
"k8s.io/kubernetes/pkg/api/v1"
|
"k8s.io/kubernetes/pkg/api/v1"
|
||||||
@ -55,6 +56,7 @@ import (
|
|||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
"gopkg.in/gcfg.v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -379,7 +381,7 @@ func (i *initFederation) Run(cmdOut io.Writer, config util.AdminConfig) error {
|
|||||||
|
|
||||||
glog.V(4).Info("Creating federation controller manager deployment")
|
glog.V(4).Info("Creating federation controller manager deployment")
|
||||||
|
|
||||||
_, err = createControllerManager(hostClientset, i.commonOptions.FederationSystemNamespace, i.commonOptions.Name, svc.Name, cmName, i.options.image, cmKubeconfigName, i.options.dnsZoneName, i.options.dnsProvider, sa.Name, dnsProviderSecret, i.options.controllerManagerOverrides, i.options.dryRun)
|
_, err = createControllerManager(hostClientset, i.commonOptions.FederationSystemNamespace, i.commonOptions.Name, svc.Name, cmName, i.options.image, cmKubeconfigName, i.options.dnsZoneName, i.options.dnsProvider, i.options.dnsProviderConfig, sa.Name, dnsProviderSecret, i.options.controllerManagerOverrides, i.options.dryRun)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -847,7 +849,7 @@ func createRoleBindings(clientset client.Interface, namespace, saName, federatio
|
|||||||
return newRole, newRolebinding, err
|
return newRole, newRolebinding, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func createControllerManager(clientset client.Interface, namespace, name, svcName, cmName, image, kubeconfigName, dnsZoneName, dnsProvider, saName string, dnsProviderSecret *api.Secret, argOverrides map[string]string, dryRun bool) (*extensions.Deployment, error) {
|
func createControllerManager(clientset client.Interface, namespace, name, svcName, cmName, image, kubeconfigName, dnsZoneName, dnsProvider, dnsProviderConfig, saName string, dnsProviderSecret *api.Secret, argOverrides map[string]string, dryRun bool) (*extensions.Deployment, error) {
|
||||||
command := []string{
|
command := []string{
|
||||||
"/hyperkube",
|
"/hyperkube",
|
||||||
"federation-controller-manager",
|
"federation-controller-manager",
|
||||||
@ -935,12 +937,19 @@ func createControllerManager(clientset client.Interface, namespace, name, svcNam
|
|||||||
dep.Spec.Template.Spec.ServiceAccountName = saName
|
dep.Spec.Template.Spec.ServiceAccountName = saName
|
||||||
}
|
}
|
||||||
|
|
||||||
if dryRun {
|
|
||||||
return dep, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
if dnsProviderSecret != nil {
|
if dnsProviderSecret != nil {
|
||||||
dep = addDNSProviderConfig(dep, dnsProviderSecret.Name)
|
dep = addDNSProviderConfig(dep, dnsProviderSecret.Name)
|
||||||
|
if dnsProvider == util.FedDNSProviderCoreDNS {
|
||||||
|
var err error
|
||||||
|
dep, err = addCoreDNSServerAnnotation(dep, dnsZoneName, dnsProviderConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if dryRun {
|
||||||
|
return dep, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
return clientset.Extensions().Deployments(namespace).Create(dep)
|
return clientset.Extensions().Deployments(namespace).Create(dep)
|
||||||
@ -1154,3 +1163,15 @@ func addDNSProviderConfig(dep *extensions.Deployment, secretName string) *extens
|
|||||||
func authFileContents(username, authSecret string) []byte {
|
func authFileContents(username, authSecret string) []byte {
|
||||||
return []byte(fmt.Sprintf("%s,%s,%s\n", authSecret, username, uuid.NewUUID()))
|
return []byte(fmt.Sprintf("%s,%s,%s\n", authSecret, username, uuid.NewUUID()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func addCoreDNSServerAnnotation(deployment *extensions.Deployment, dnsZoneName, dnsProviderConfig string) (*extensions.Deployment, error) {
|
||||||
|
var cfg coredns.Config
|
||||||
|
if err := gcfg.ReadFileInto(&cfg, dnsProviderConfig); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
deployment.Annotations[util.FedDNSZoneName] = dnsZoneName
|
||||||
|
deployment.Annotations[util.FedNameServer] = cfg.Global.CoreDNSEndpoints
|
||||||
|
deployment.Annotations[util.FedDNSProvider] = util.FedDNSProviderCoreDNS
|
||||||
|
return deployment, nil
|
||||||
|
}
|
||||||
|
@ -44,6 +44,7 @@ import (
|
|||||||
"k8s.io/client-go/rest/fake"
|
"k8s.io/client-go/rest/fake"
|
||||||
"k8s.io/client-go/tools/clientcmd"
|
"k8s.io/client-go/tools/clientcmd"
|
||||||
"k8s.io/kubernetes/federation/apis/federation"
|
"k8s.io/kubernetes/federation/apis/federation"
|
||||||
|
"k8s.io/kubernetes/federation/pkg/dnsprovider/providers/coredns"
|
||||||
kubefedtesting "k8s.io/kubernetes/federation/pkg/kubefed/testing"
|
kubefedtesting "k8s.io/kubernetes/federation/pkg/kubefed/testing"
|
||||||
"k8s.io/kubernetes/federation/pkg/kubefed/util"
|
"k8s.io/kubernetes/federation/pkg/kubefed/util"
|
||||||
"k8s.io/kubernetes/pkg/api"
|
"k8s.io/kubernetes/pkg/api"
|
||||||
@ -55,6 +56,8 @@ import (
|
|||||||
rbacv1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1"
|
rbacv1beta1 "k8s.io/kubernetes/pkg/apis/rbac/v1beta1"
|
||||||
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
|
cmdtesting "k8s.io/kubernetes/pkg/kubectl/cmd/testing"
|
||||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
|
|
||||||
|
"gopkg.in/gcfg.v1"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -74,7 +77,6 @@ const (
|
|||||||
|
|
||||||
func TestInitFederation(t *testing.T) {
|
func TestInitFederation(t *testing.T) {
|
||||||
cmdErrMsg := ""
|
cmdErrMsg := ""
|
||||||
dnsProvider := "google-clouddns"
|
|
||||||
cmdutil.BehaviorOnFatal(func(str string, code int) {
|
cmdutil.BehaviorOnFatal(func(str string, code int) {
|
||||||
cmdErrMsg = str
|
cmdErrMsg = str
|
||||||
})
|
})
|
||||||
@ -97,6 +99,7 @@ func TestInitFederation(t *testing.T) {
|
|||||||
etcdPVCapacity string
|
etcdPVCapacity string
|
||||||
etcdPersistence string
|
etcdPersistence string
|
||||||
expectedErr string
|
expectedErr string
|
||||||
|
dnsProvider string
|
||||||
dnsProviderConfig string
|
dnsProviderConfig string
|
||||||
dryRun string
|
dryRun string
|
||||||
apiserverArgOverrides string
|
apiserverArgOverrides string
|
||||||
@ -116,6 +119,7 @@ func TestInitFederation(t *testing.T) {
|
|||||||
etcdPVCapacity: "5Gi",
|
etcdPVCapacity: "5Gi",
|
||||||
etcdPersistence: "true",
|
etcdPersistence: "true",
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
|
dnsProvider: util.FedDNSProviderCoreDNS,
|
||||||
dnsProviderConfig: "dns-provider.conf",
|
dnsProviderConfig: "dns-provider.conf",
|
||||||
dryRun: "",
|
dryRun: "",
|
||||||
apiserverArgOverrides: "--client-ca-file=override,--log-dir=override",
|
apiserverArgOverrides: "--client-ca-file=override,--log-dir=override",
|
||||||
@ -210,6 +214,9 @@ func TestInitFederation(t *testing.T) {
|
|||||||
tmpDirPath := ""
|
tmpDirPath := ""
|
||||||
buf := bytes.NewBuffer([]byte{})
|
buf := bytes.NewBuffer([]byte{})
|
||||||
|
|
||||||
|
if tc.dnsProvider == "" {
|
||||||
|
tc.dnsProvider = "google-clouddns"
|
||||||
|
}
|
||||||
if tc.dnsProviderConfig != "" {
|
if tc.dnsProviderConfig != "" {
|
||||||
tmpfile, err := ioutil.TempFile("", tc.dnsProviderConfig)
|
tmpfile, err := ioutil.TempFile("", tc.dnsProviderConfig)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -227,7 +234,7 @@ func TestInitFederation(t *testing.T) {
|
|||||||
}
|
}
|
||||||
defer os.Remove(tmpDirPath)
|
defer os.Remove(tmpDirPath)
|
||||||
|
|
||||||
hostFactory, err := fakeInitHostFactory(tc.apiserverServiceType, tc.federation, util.DefaultFederationSystemNamespace, tc.advertiseAddress, tc.lbIP, tc.dnsZoneName, tc.image, dnsProvider, tc.dnsProviderConfig, tc.etcdPersistence, tc.etcdPVCapacity, tc.apiserverArgOverrides, tc.cmArgOverrides, tmpDirPath, tc.apiserverEnableHTTPBasicAuth, tc.apiserverEnableTokenAuth, tc.isRBACAPIAvailable)
|
hostFactory, err := fakeInitHostFactory(tc.apiserverServiceType, tc.federation, util.DefaultFederationSystemNamespace, tc.advertiseAddress, tc.lbIP, tc.dnsZoneName, tc.image, tc.dnsProvider, tc.dnsProviderConfig, tc.etcdPersistence, tc.etcdPVCapacity, tc.apiserverArgOverrides, tc.cmArgOverrides, tmpDirPath, tc.apiserverEnableHTTPBasicAuth, tc.apiserverEnableTokenAuth, tc.isRBACAPIAvailable)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("[%d] unexpected error: %v", i, err)
|
t.Fatalf("[%d] unexpected error: %v", i, err)
|
||||||
}
|
}
|
||||||
@ -243,7 +250,7 @@ func TestInitFederation(t *testing.T) {
|
|||||||
cmd.Flags().Set("host-cluster-context", "substrate")
|
cmd.Flags().Set("host-cluster-context", "substrate")
|
||||||
cmd.Flags().Set("dns-zone-name", tc.dnsZoneName)
|
cmd.Flags().Set("dns-zone-name", tc.dnsZoneName)
|
||||||
cmd.Flags().Set("image", tc.image)
|
cmd.Flags().Set("image", tc.image)
|
||||||
cmd.Flags().Set("dns-provider", dnsProvider)
|
cmd.Flags().Set("dns-provider", tc.dnsProvider)
|
||||||
cmd.Flags().Set("apiserver-arg-overrides", tc.apiserverArgOverrides)
|
cmd.Flags().Set("apiserver-arg-overrides", tc.apiserverArgOverrides)
|
||||||
cmd.Flags().Set("controllermanager-arg-overrides", tc.cmArgOverrides)
|
cmd.Flags().Set("controllermanager-arg-overrides", tc.cmArgOverrides)
|
||||||
|
|
||||||
@ -1043,6 +1050,12 @@ func fakeInitHostFactory(apiserverServiceType v1.ServiceType, federationName, na
|
|||||||
}
|
}
|
||||||
if dnsProviderConfig != "" {
|
if dnsProviderConfig != "" {
|
||||||
cm = addDNSProviderConfigTest(cm, cmDNSProviderSecret.Name)
|
cm = addDNSProviderConfigTest(cm, cmDNSProviderSecret.Name)
|
||||||
|
if dnsProvider == util.FedDNSProviderCoreDNS {
|
||||||
|
cm, err = addCoreDNSServerAnnotationTest(cm, dnsZoneName, dnsProviderConfig)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
podList := v1.PodList{}
|
podList := v1.PodList{}
|
||||||
@ -1540,3 +1553,16 @@ func addDNSProviderConfigTest(dep *v1beta1.Deployment, secretName string) *v1bet
|
|||||||
|
|
||||||
return dep
|
return dep
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Reuse the function addCoreDNSServerAnnotation once that function is converted to use versioned objects.
|
||||||
|
func addCoreDNSServerAnnotationTest(deployment *v1beta1.Deployment, dnsZoneName, dnsProviderConfig string) (*v1beta1.Deployment, error) {
|
||||||
|
var cfg coredns.Config
|
||||||
|
if err := gcfg.ReadFileInto(&cfg, dnsProviderConfig); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
deployment.Annotations[util.FedDNSZoneName] = dnsZoneName
|
||||||
|
deployment.Annotations[util.FedNameServer] = cfg.Global.CoreDNSEndpoints
|
||||||
|
deployment.Annotations[util.FedDNSProvider] = util.FedDNSProviderCoreDNS
|
||||||
|
return deployment, nil
|
||||||
|
}
|
||||||
|
@ -278,6 +278,7 @@ func createConfigMap(hostClientSet internalclientset.Interface, config util.Admi
|
|||||||
util.FedDomainMapKey: domainMap,
|
util.FedDomainMapKey: domainMap,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
newConfigMap = populateStubDomainsIfRequired(newConfigMap, cmDep.Annotations)
|
||||||
|
|
||||||
if dryRun {
|
if dryRun {
|
||||||
return newConfigMap, nil
|
return newConfigMap, nil
|
||||||
@ -397,3 +398,15 @@ func getFederationName(hostClientSet internalclientset.Interface, fedNamespace s
|
|||||||
|
|
||||||
return name, nil
|
return name, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func populateStubDomainsIfRequired(configMap *api.ConfigMap, annotations map[string]string) *api.ConfigMap {
|
||||||
|
dnsProvider := annotations[util.FedDNSProvider]
|
||||||
|
dnsZoneName := annotations[util.FedDNSZoneName]
|
||||||
|
nameServer := annotations[util.FedNameServer]
|
||||||
|
|
||||||
|
if dnsProvider != util.FedDNSProviderCoreDNS || dnsZoneName == "" || nameServer == "" {
|
||||||
|
return configMap
|
||||||
|
}
|
||||||
|
configMap.Data[util.KubeDnsStubDomains] = fmt.Sprintf(`{"%s":["%s"]}`, dnsZoneName, nameServer)
|
||||||
|
return configMap
|
||||||
|
}
|
||||||
|
@ -42,10 +42,15 @@ import (
|
|||||||
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
cmdutil "k8s.io/kubernetes/pkg/kubectl/cmd/util"
|
||||||
)
|
)
|
||||||
|
|
||||||
// testFederationName is a name to use for the federation in tests. Since the federation
|
const (
|
||||||
// name is recovered from the federation itself, this constant is an appropriate
|
// testFederationName is a name to use for the federation in tests. Since the federation
|
||||||
// functional replica.
|
// name is recovered from the federation itself, this constant is an appropriate
|
||||||
const testFederationName = "test-federation"
|
// functional replica.
|
||||||
|
testFederationName = "test-federation"
|
||||||
|
|
||||||
|
zoneName = "test-dns-zone"
|
||||||
|
coreDNSServer = "11.22.33.44:53"
|
||||||
|
)
|
||||||
|
|
||||||
func TestJoinFederation(t *testing.T) {
|
func TestJoinFederation(t *testing.T) {
|
||||||
cmdErrMsg := ""
|
cmdErrMsg := ""
|
||||||
@ -69,6 +74,7 @@ func TestJoinFederation(t *testing.T) {
|
|||||||
kubeconfigExplicit string
|
kubeconfigExplicit string
|
||||||
expectedServer string
|
expectedServer string
|
||||||
expectedErr string
|
expectedErr string
|
||||||
|
dnsProvider string
|
||||||
}{
|
}{
|
||||||
{
|
{
|
||||||
cluster: "syndicate",
|
cluster: "syndicate",
|
||||||
@ -79,6 +85,7 @@ func TestJoinFederation(t *testing.T) {
|
|||||||
kubeconfigExplicit: "",
|
kubeconfigExplicit: "",
|
||||||
expectedServer: "https://10.20.30.40",
|
expectedServer: "https://10.20.30.40",
|
||||||
expectedErr: "",
|
expectedErr: "",
|
||||||
|
dnsProvider: util.FedDNSProviderCoreDNS,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
cluster: "ally",
|
cluster: "ally",
|
||||||
@ -138,12 +145,12 @@ func TestJoinFederation(t *testing.T) {
|
|||||||
f := testJoinFederationFactory(tc.cluster, tc.secret, tc.expectedServer)
|
f := testJoinFederationFactory(tc.cluster, tc.secret, tc.expectedServer)
|
||||||
buf := bytes.NewBuffer([]byte{})
|
buf := bytes.NewBuffer([]byte{})
|
||||||
|
|
||||||
hostFactory, err := fakeJoinHostFactory(tc.cluster, tc.clusterCtx, tc.secret, tc.server, tc.token)
|
hostFactory, err := fakeJoinHostFactory(tc.cluster, tc.clusterCtx, tc.secret, tc.server, tc.token, tc.dnsProvider)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("[%d] unexpected error: %v", i, err)
|
t.Fatalf("[%d] unexpected error: %v", i, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
targetClusterFactory, err := fakeJoinTargetClusterFactory(tc.cluster, tc.clusterCtx)
|
targetClusterFactory, err := fakeJoinTargetClusterFactory(tc.cluster, tc.clusterCtx, tc.dnsProvider)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("[%d] unexpected error: %v", i, err)
|
t.Fatalf("[%d] unexpected error: %v", i, err)
|
||||||
}
|
}
|
||||||
@ -229,7 +236,7 @@ func testJoinFederationFactory(clusterName, secretName, server string) cmdutil.F
|
|||||||
return f
|
return f
|
||||||
}
|
}
|
||||||
|
|
||||||
func fakeJoinHostFactory(clusterName, clusterCtx, secretName, server, token string) (cmdutil.Factory, error) {
|
func fakeJoinHostFactory(clusterName, clusterCtx, secretName, server, token, dnsProvider string) (cmdutil.Factory, error) {
|
||||||
if clusterCtx == "" {
|
if clusterCtx == "" {
|
||||||
clusterCtx = clusterName
|
clusterCtx = clusterName
|
||||||
}
|
}
|
||||||
@ -281,28 +288,26 @@ func fakeJoinHostFactory(clusterName, clusterCtx, secretName, server, token stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
cmName := "controller-manager"
|
cmName := "controller-manager"
|
||||||
deploymentList := v1beta1.DeploymentList{
|
deployment := v1beta1.Deployment{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
Kind: "DeploymentList",
|
Kind: "Deployment",
|
||||||
APIVersion: testapi.Extensions.GroupVersion().String(),
|
APIVersion: testapi.Extensions.GroupVersion().String(),
|
||||||
},
|
},
|
||||||
Items: []v1beta1.Deployment{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
{
|
Name: cmName,
|
||||||
TypeMeta: metav1.TypeMeta{
|
Namespace: util.DefaultFederationSystemNamespace,
|
||||||
Kind: "Deployment",
|
Annotations: map[string]string{
|
||||||
APIVersion: testapi.Extensions.GroupVersion().String(),
|
util.FedDomainMapKey: fmt.Sprintf("%s=%s", clusterCtx, zoneName),
|
||||||
},
|
federation.FederationNameAnnotation: testFederationName,
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
|
||||||
Name: cmName,
|
|
||||||
Namespace: util.DefaultFederationSystemNamespace,
|
|
||||||
Annotations: map[string]string{
|
|
||||||
util.FedDomainMapKey: fmt.Sprintf("%s=%s", clusterCtx, "test-dns-zone"),
|
|
||||||
federation.FederationNameAnnotation: testFederationName,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
if dnsProvider == util.FedDNSProviderCoreDNS {
|
||||||
|
deployment.Annotations[util.FedDNSZoneName] = zoneName
|
||||||
|
deployment.Annotations[util.FedNameServer] = coreDNSServer
|
||||||
|
deployment.Annotations[util.FedDNSProvider] = util.FedDNSProviderCoreDNS
|
||||||
|
}
|
||||||
|
deploymentList := v1beta1.DeploymentList{Items: []v1beta1.Deployment{deployment}}
|
||||||
|
|
||||||
f, tf, codec, _ := cmdtesting.NewAPIFactory()
|
f, tf, codec, _ := cmdtesting.NewAPIFactory()
|
||||||
extensionCodec := testapi.Extensions.Codec()
|
extensionCodec := testapi.Extensions.Codec()
|
||||||
@ -346,12 +351,12 @@ func fakeJoinHostFactory(clusterName, clusterCtx, secretName, server, token stri
|
|||||||
return f, nil
|
return f, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func fakeJoinTargetClusterFactory(clusterName, clusterCtx string) (cmdutil.Factory, error) {
|
func fakeJoinTargetClusterFactory(clusterName, clusterCtx, dnsProvider string) (cmdutil.Factory, error) {
|
||||||
if clusterCtx == "" {
|
if clusterCtx == "" {
|
||||||
clusterCtx = clusterName
|
clusterCtx = clusterName
|
||||||
}
|
}
|
||||||
|
|
||||||
configmapObject := v1.ConfigMap{
|
configmapObject := &v1.ConfigMap{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Name: util.KubeDnsConfigmapName,
|
Name: util.KubeDnsConfigmapName,
|
||||||
Namespace: metav1.NamespaceSystem,
|
Namespace: metav1.NamespaceSystem,
|
||||||
@ -361,9 +366,17 @@ func fakeJoinTargetClusterFactory(clusterName, clusterCtx string) (cmdutil.Facto
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
Data: map[string]string{
|
Data: map[string]string{
|
||||||
util.FedDomainMapKey: fmt.Sprintf("%s=%s", clusterCtx, "test-dns-zone"),
|
util.FedDomainMapKey: fmt.Sprintf("%s=%s", clusterCtx, zoneName),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
if dnsProvider == util.FedDNSProviderCoreDNS {
|
||||||
|
annotations := map[string]string{
|
||||||
|
util.FedDNSProvider: util.FedDNSProviderCoreDNS,
|
||||||
|
util.FedDNSZoneName: zoneName,
|
||||||
|
util.FedNameServer: coreDNSServer,
|
||||||
|
}
|
||||||
|
configmapObject = populateStubDomainsIfRequiredTest(configmapObject, annotations)
|
||||||
|
}
|
||||||
|
|
||||||
f, tf, codec, _ := cmdtesting.NewAPIFactory()
|
f, tf, codec, _ := cmdtesting.NewAPIFactory()
|
||||||
ns := dynamic.ContentConfig().NegotiatedSerializer
|
ns := dynamic.ContentConfig().NegotiatedSerializer
|
||||||
@ -383,10 +396,10 @@ func fakeJoinTargetClusterFactory(clusterName, clusterCtx string) (cmdutil.Facto
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if !apiequality.Semantic.DeepEqual(got, configmapObject) {
|
if !apiequality.Semantic.DeepEqual(&got, configmapObject) {
|
||||||
return nil, fmt.Errorf("Unexpected configmap object\n\tDiff: %s", diff.ObjectGoPrintDiff(got, configmapObject))
|
return nil, fmt.Errorf("Unexpected configmap object\n\tDiff: %s", diff.ObjectGoPrintDiff(&got, configmapObject))
|
||||||
}
|
}
|
||||||
return &http.Response{StatusCode: http.StatusCreated, Header: kubefedtesting.DefaultHeader(), Body: kubefedtesting.ObjBody(codec, &configmapObject)}, nil
|
return &http.Response{StatusCode: http.StatusCreated, Header: kubefedtesting.DefaultHeader(), Body: kubefedtesting.ObjBody(codec, configmapObject)}, nil
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unexpected request: %#v\n%#v", req.URL, req)
|
return nil, fmt.Errorf("unexpected request: %#v\n%#v", req.URL, req)
|
||||||
}
|
}
|
||||||
@ -413,3 +426,16 @@ func fakeCluster(clusterName, secretName, server string) federationapi.Cluster {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Reuse the function populateStubDomainsIfRequired once that function is converted to use versioned objects.
|
||||||
|
func populateStubDomainsIfRequiredTest(configMap *v1.ConfigMap, annotations map[string]string) *v1.ConfigMap {
|
||||||
|
dnsProvider := annotations[util.FedDNSProvider]
|
||||||
|
dnsZoneName := annotations[util.FedDNSZoneName]
|
||||||
|
nameServer := annotations[util.FedNameServer]
|
||||||
|
|
||||||
|
if dnsProvider != util.FedDNSProviderCoreDNS || dnsZoneName == "" || nameServer == "" {
|
||||||
|
return configMap
|
||||||
|
}
|
||||||
|
configMap.Data[util.KubeDnsStubDomains] = fmt.Sprintf(`{"%s":["%s"]}`, dnsZoneName, nameServer)
|
||||||
|
return configMap
|
||||||
|
}
|
||||||
|
@ -111,10 +111,10 @@ func (u *unjoinFederation) Run(f cmdutil.Factory, cmdOut, cmdErr io.Writer, conf
|
|||||||
// We anyways continue to try and delete the config map but with above warning
|
// We anyways continue to try and delete the config map but with above warning
|
||||||
}
|
}
|
||||||
|
|
||||||
// We need to ensure deleting the config map created in the deregistered cluster
|
// We need to ensure updating the config map created in the deregistered cluster
|
||||||
// This configmap was created when the cluster joined this federation to aid
|
// This configmap was created/updated when the cluster joined this federation to aid
|
||||||
// the kube-dns of that cluster to aid service discovery.
|
// the kube-dns of that cluster to aid service discovery.
|
||||||
err = deleteConfigMapFromCluster(hostClientset, secret, cluster, u.commonOptions.FederationSystemNamespace)
|
err = updateConfigMapFromCluster(hostClientset, secret, cluster, u.commonOptions.FederationSystemNamespace)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Fprintf(cmdErr, "WARNING: Encountered error in deleting kube-dns configmap, %v", err)
|
fmt.Fprintf(cmdErr, "WARNING: Encountered error in deleting kube-dns configmap, %v", err)
|
||||||
// We anyways continue to print success message but with above warning
|
// We anyways continue to print success message but with above warning
|
||||||
@ -162,7 +162,7 @@ func popCluster(f cmdutil.Factory, name string) (*federationapi.Cluster, error)
|
|||||||
return cluster, rh.Delete("", name)
|
return cluster, rh.Delete("", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteConfigMapFromCluster(hostClientset internalclientset.Interface, secret *api.Secret, cluster *federationapi.Cluster, fedSystemNamespace string) error {
|
func updateConfigMapFromCluster(hostClientset internalclientset.Interface, secret *api.Secret, cluster *federationapi.Cluster, fedSystemNamespace string) error {
|
||||||
clientset, err := getClientsetFromCluster(secret, cluster)
|
clientset, err := getClientsetFromCluster(secret, cluster)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@ -182,12 +182,20 @@ func deleteConfigMapFromCluster(hostClientset internalclientset.Interface, secre
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := configMap.Data[util.FedDomainMapKey]; !ok {
|
needUpdate := false
|
||||||
return nil
|
if _, ok := configMap.Data[util.FedDomainMapKey]; ok {
|
||||||
|
configMap.Data[util.FedDomainMapKey] = removeConfigMapString(configMap.Data[util.FedDomainMapKey], domainMap)
|
||||||
|
needUpdate = true
|
||||||
}
|
}
|
||||||
configMap.Data[util.FedDomainMapKey] = removeConfigMapString(configMap.Data[util.FedDomainMapKey], domainMap)
|
|
||||||
|
|
||||||
_, err = clientset.Core().ConfigMaps(metav1.NamespaceSystem).Update(configMap)
|
if _, ok := configMap.Data[util.KubeDnsStubDomains]; ok {
|
||||||
|
delete(configMap.Data, util.KubeDnsStubDomains)
|
||||||
|
needUpdate = true
|
||||||
|
}
|
||||||
|
|
||||||
|
if needUpdate {
|
||||||
|
_, err = clientset.Core().ConfigMaps(metav1.NamespaceSystem).Update(configMap)
|
||||||
|
}
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,8 +44,13 @@ const (
|
|||||||
KubeconfigSecretDataKey = "kubeconfig"
|
KubeconfigSecretDataKey = "kubeconfig"
|
||||||
|
|
||||||
// Used in and to create the kube-dns configmap storing the zone info
|
// Used in and to create the kube-dns configmap storing the zone info
|
||||||
FedDomainMapKey = "federations"
|
FedDomainMapKey = "federations"
|
||||||
KubeDnsConfigmapName = "kube-dns"
|
KubeDnsConfigmapName = "kube-dns"
|
||||||
|
FedDNSZoneName = "dns-zone-name"
|
||||||
|
FedNameServer = "nameserver"
|
||||||
|
FedDNSProvider = "dns-provider"
|
||||||
|
FedDNSProviderCoreDNS = "coredns"
|
||||||
|
KubeDnsStubDomains = "stubDomains"
|
||||||
|
|
||||||
// DefaultFederationSystemNamespace is the namespace in which
|
// DefaultFederationSystemNamespace is the namespace in which
|
||||||
// federation system components are hosted.
|
// federation system components are hosted.
|
||||||
|
Loading…
Reference in New Issue
Block a user