Add CoreDNS support into DNS controller addon image.

This commit is contained in:
Miao Luo 2017-03-24 10:26:50 -07:00
parent 4ace0f9ca5
commit c5519c0009
4 changed files with 46 additions and 4 deletions

View File

@ -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)

View File

@ -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

View File

@ -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 }}"

View File

@ -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
}
}