diff --git a/dns-controller/cmd/dns-controller/main.go b/dns-controller/cmd/dns-controller/main.go index ee2939346d..174f89cfd2 100644 --- a/dns-controller/cmd/dns-controller/main.go +++ b/dns-controller/cmd/dns-controller/main.go @@ -17,9 +17,12 @@ limitations under the License. package main import ( + "bytes" "flag" "fmt" + "io" "os" + "strings" "github.com/golang/glog" "github.com/spf13/pflag" @@ -30,7 +33,7 @@ import ( "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" _ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/aws/route53" - _ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/coredns" + k8scoredns "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/coredns" _ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns" ) @@ -56,6 +59,9 @@ func main() { watchIngress := true flags.BoolVar(&watchIngress, "watch-ingress", watchIngress, "Configure hostnames found in ingress resources") + dnsServer := "" + flag.StringVar(&dnsServer, "dns-server", dnsServer, "DNS Server") + // Trick to avoid 'logging before flag.Parse' warning flag.CommandLine.Parse([]string{}) @@ -87,7 +93,15 @@ func main() { // glog.Fatalf("error building extensions REST client: %v", err) //} - dnsProvider, err := dnsprovider.GetDnsProvider(dnsProviderId, nil) + var file io.Reader + if dnsProviderId == k8scoredns.ProviderName { + var lines []string + lines = append(lines, "etcd-endpoints = "+dnsServer) + lines = append(lines, "zones = "+zones[0]) + config := "[global]\n" + strings.Join(lines, "\n") + "\n" + file = bytes.NewReader([]byte(config)) + } + dnsProvider, err := dnsprovider.GetDnsProvider(dnsProviderId, file) if err != nil { glog.Errorf("Error initializing DNS provider %q: %v", dnsProviderId, err) os.Exit(1) diff --git a/docs/development/vsphere-dev.md b/docs/development/vsphere-dev.md index 82df07fe80..f066144d7c 100644 --- a/docs/development/vsphere-dev.md +++ b/docs/development/vsphere-dev.md @@ -10,7 +10,7 @@ Here is a [list of requirements and tasks](https://docs.google.com/document/d/10 ## Setting up DNS Since vSphere doesn't have built-in DNS service, we use CoreDNS to support the DNS requirement in vSphere provider. This requires the users to setup a CoreDNS server before creating a kubernetes cluster. Please follow the following instructions to setup. -Before the support of CoreDNS becomes stable, use env parameter "VSPHERE_DNS=coredns" to enable using CoreDNS. Or else AWS Route53 will be the default DNS service. To use Route53, follow instructions on: https://github.com/vmware/kops/blob/vsphere-develop/docs/aws.md +**Before the support of CoreDNS becomes stable, use env parameter "VSPHERE_DNS=coredns"** to enable using CoreDNS. Or else AWS Route53 will be the default DNS service. To use Route53, follow instructions on: https://github.com/vmware/kops/blob/vsphere-develop/docs/aws.md For now we hardcoded DNS zone to skydns.local. So your cluster name should have suffix skydns.local, for example: "mycluster.skydns.local" @@ -56,6 +56,17 @@ ns1.ns.dns.skydns.local. 160 IN A 192.168.0.1 ### Add DNS server information when create cluster Add ```--dns=private --vsphere-coredns-server=http://[DNS server's IP]:2379``` into the ```kops create cluster``` command line. +### Use CoreDNS supported DNS Controller +Information about DNS Controller can be found [here](https://github.com/kubernetes/kops/blob/master/dns-controller/README.md) +Currently the DNS Controller is an add-on container and the image is from kope/dns-controller. +Before the vSphere support is officially merged into upstream, we need to set up CoreDNS supported DNS controller manually. +```bash +DOCKER_REGISTRY=[your docker hub repo] make dns-controller-push +export VSPHERE_DNSCONTROLLER_IMAGE=[your docker hub repo] +make +kops create cluster ... +``` + ## Hacks ### Nodeup and protokube testing diff --git a/upup/models/cloudup/resources/addons/dns-controller.addons.k8s.io/pre-k8s-1.6.yaml.template b/upup/models/cloudup/resources/addons/dns-controller.addons.k8s.io/pre-k8s-1.6.yaml.template index ea48c16ef5..afbb3ec7e0 100644 --- a/upup/models/cloudup/resources/addons/dns-controller.addons.k8s.io/pre-k8s-1.6.yaml.template +++ b/upup/models/cloudup/resources/addons/dns-controller.addons.k8s.io/pre-k8s-1.6.yaml.template @@ -28,7 +28,7 @@ spec: hostNetwork: true containers: - name: dns-controller - image: kope/dns-controller:1.6.0 + image: {{ DnsControllerImage }}:1.6.0 command: {{ range $arg := DnsControllerArgv }} - "{{ $arg }}" diff --git a/upup/pkg/fi/cloudup/template_functions.go b/upup/pkg/fi/cloudup/template_functions.go index 3a083e98dd..05362fc4bf 100644 --- a/upup/pkg/fi/cloudup/template_functions.go +++ b/upup/pkg/fi/cloudup/template_functions.go @@ -36,6 +36,7 @@ import ( "k8s.io/kops/pkg/model/components" "k8s.io/kops/upup/pkg/fi" "k8s.io/kops/upup/pkg/fi/cloudup/gce" + "os" "strings" "text/template" ) @@ -95,6 +96,7 @@ func (tf *TemplateFunctions) AddTo(dest template.FuncMap) { // TODO: Only for GCE? dest["EncodeGCELabel"] = gce.EncodeGCELabel + dest["DnsControllerImage"] = tf.DnsControllerImage } // SharedVPC is a simple helper function which makes the templates for a shared VPC clearer @@ -137,6 +139,7 @@ func (tf *TemplateFunctions) DnsControllerArgv() ([]string, error) { argv = append(argv, "--dns=google-clouddns") case fi.CloudProviderVSphere: argv = append(argv, "--dns=coredns") + argv = append(argv, "--dns-server="+*tf.cluster.Spec.CloudConfig.VSphereCoreDNSServer) default: return nil, fmt.Errorf("unhandled cloudprovider %q", tf.cluster.Spec.CloudProvider) @@ -160,3 +163,17 @@ func (tf *TemplateFunctions) DnsControllerArgv() ([]string, error) { return argv, nil } + +// TODO: this is a work-around before vSphere support is getting merged into upstream kops. +// To use CoreDNS supported DNS Controller: +// 1. DOCKER_REGISTRY=[your docker hub repo] make dns-controller-push +// 2. export VSPHERE_DNSCONTROLLER_IMAGE=[your docker hub repo] +// 3. make kops and create/apply cluster +func (tf *TemplateFunctions) DnsControllerImage() (string, error) { + image := os.Getenv("VSPHERE_DNSCONTROLLER_IMAGE") + if fi.CloudProviderID(tf.cluster.Spec.CloudProvider) != fi.CloudProviderVSphere || image == "" { + return "kope/dns-controller", nil + } else { + return image, nil + } +}