Skip to content
This repository has been archived by the owner on Mar 26, 2021. It is now read-only.

Commit

Permalink
Merge pull request #35116 from shashidharatd/fed-coredns-provider
Browse files Browse the repository at this point in the history
Automatic merge from submit-queue

Add CoreDNS as Federation DNS provider

This PR contains following
1. DNS provider implementation for CoreDNS with etcd as backend
2. Script for optionally deploying CoreDNS in federation control plane

Still to do:
1. HA for CoreDNS service need to be handled, would be taken up in subsequent PR
2. Need to configure CoreDNS as fallback DNS to in-cluster KubeDNS(Manual Step). Need to consider automation.

Request for review: @quinton-hoole @madhusudancs @nikhiljindal @kshafiee @deepak-vij
cc @kubernetes/sig-cluster-federation
  • Loading branch information
Kubernetes Submit Queue committed Dec 9, 2016
2 parents 1b5a6e4 + f2dc881 commit e152c0e
Show file tree
Hide file tree
Showing 18 changed files with 987 additions and 40 deletions.
1 change: 1 addition & 0 deletions cmd/federation-controller-manager/app/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ go_library(
"//federation/cmd/federation-controller-manager/app/options:go_default_library",
"//federation/pkg/dnsprovider:go_default_library",
"//federation/pkg/dnsprovider/providers/aws/route53:go_default_library",
"//federation/pkg/dnsprovider/providers/coredns:go_default_library",
"//federation/pkg/dnsprovider/providers/google/clouddns:go_default_library",
"//federation/pkg/federation-controller/cluster:go_default_library",
"//federation/pkg/federation-controller/configmap:go_default_library",
Expand Down
1 change: 1 addition & 0 deletions cmd/federation-controller-manager/app/plugins.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,5 +22,6 @@ package app
import (
// DNS providers
_ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/aws/route53"
_ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/coredns"
_ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns"
)
2 changes: 2 additions & 0 deletions pkg/dnsprovider/dns.go
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,8 @@ type Zone interface {
type ResourceRecordSets interface {
// List returns the ResourceRecordSets of the Zone, or an error if the list operation failed.
List() ([]ResourceRecordSet, error)
// Get returns the ResourceRecordSet with the name in the Zone. if the named resource record set does not exist, but no error occurred, the returned set, and error, are both nil.
Get(name string) (ResourceRecordSet, error)
// New allocates a new ResourceRecordSet, which can then be passed to ResourceRecordChangeset Add() or Remove()
// Arguments are as per the ResourceRecordSet interface below.
New(name string, rrdatas []string, ttl int64, rrstype rrstype.RrsType) ResourceRecordSet
Expand Down
15 changes: 15 additions & 0 deletions pkg/dnsprovider/providers/aws/route53/rrsets.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,21 @@ func (rrsets ResourceRecordSets) List() ([]dnsprovider.ResourceRecordSet, error)
return list, nil
}

func (rrsets ResourceRecordSets) Get(name string) (dnsprovider.ResourceRecordSet, error) {
var newRrset dnsprovider.ResourceRecordSet
rrsetList, err := rrsets.List()
if err != nil {
return nil, err
}
for _, rrset := range rrsetList {
if rrset.Name() == name {
newRrset = rrset
break
}
}
return newRrset, nil
}

func (r ResourceRecordSets) StartChangeset() dnsprovider.ResourceRecordChangeset {
return &ResourceRecordChangeset{
zone: r.zone,
Expand Down
48 changes: 48 additions & 0 deletions pkg/dnsprovider/providers/coredns/BUILD
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package(default_visibility = ["//visibility:public"])

licenses(["notice"])

load(
"@io_bazel_rules_go//go:def.bzl",
"go_binary",
"go_library",
"go_test",
"cgo_library",
)

go_library(
name = "go_default_library",
srcs = [
"coredns.go",
"interface.go",
"rrchangeset.go",
"rrset.go",
"rrsets.go",
"zone.go",
"zones.go",
],
tags = ["automanaged"],
deps = [
"//federation/pkg/dnsprovider:go_default_library",
"//federation/pkg/dnsprovider/providers/coredns/stubs:go_default_library",
"//federation/pkg/dnsprovider/rrstype:go_default_library",
"//vendor:github.com/coreos/etcd/client",
"//vendor:github.com/golang/glog",
"//vendor:github.com/miekg/coredns/middleware/etcd/msg",
"//vendor:golang.org/x/net/context",
"//vendor:gopkg.in/gcfg.v1",
],
)

go_test(
name = "go_default_test",
srcs = ["coredns_test.go"],
library = "go_default_library",
tags = ["automanaged"],
deps = [
"//federation/pkg/dnsprovider:go_default_library",
"//federation/pkg/dnsprovider/providers/coredns/stubs:go_default_library",
"//federation/pkg/dnsprovider/rrstype:go_default_library",
"//federation/pkg/dnsprovider/tests:go_default_library",
],
)
94 changes: 94 additions & 0 deletions pkg/dnsprovider/providers/coredns/coredns.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
/*
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 coredns is the implementation of pkg/dnsprovider interface for CoreDNS
package coredns

import (
"fmt"
etcdc "github.com/coreos/etcd/client"
"github.com/golang/glog"
"gopkg.in/gcfg.v1"
"io"
"k8s.io/kubernetes/federation/pkg/dnsprovider"
"strconv"
"strings"
)

// "coredns" should be used to use this DNS provider
const (
ProviderName = "coredns"
)

// Config to override defaults
type Config struct {
Global struct {
EtcdEndpoints string `gcfg:"etcd-endpoints"`
DNSZones string `gcfg:"zones"`
}
}

func init() {
dnsprovider.RegisterDnsProvider(ProviderName, func(config io.Reader) (dnsprovider.Interface, error) {
return newCoreDNSProviderInterface(config)
})
}

// newCoreDnsProviderInterface creates a new instance of an CoreDNS DNS Interface.
func newCoreDNSProviderInterface(config io.Reader) (*Interface, error) {
etcdEndpoints := "http://federation-dns-server-etcd:2379"
etcdPathPrefix := "skydns"
dnsZones := ""

// Possibly override defaults with config below
if config != nil {
var cfg Config
if err := gcfg.ReadInto(&cfg, config); err != nil {
glog.Errorf("Couldn't read config: %v", err)
return nil, err
}
etcdEndpoints = cfg.Global.EtcdEndpoints
dnsZones = cfg.Global.DNSZones
}
glog.Infof("Using CoreDNS DNS provider")

if dnsZones == "" {
return nil, fmt.Errorf("Need to provide at least one DNS Zone")
}

etcdCfg := etcdc.Config{
Endpoints: strings.Split(etcdEndpoints, ","),
Transport: etcdc.DefaultTransport,
}

c, err := etcdc.New(etcdCfg)
if err != nil {
return nil, fmt.Errorf("Create etcd client from the config failed")
}
etcdKeysAPI := etcdc.NewKeysAPI(c)

intf := newInterfaceWithStub(etcdKeysAPI)
intf.etcdPathPrefix = etcdPathPrefix
zoneList := strings.Split(dnsZones, ",")

intf.zones = Zones{intf: intf}
for index, zoneName := range zoneList {
zone := Zone{domain: zoneName, id: strconv.Itoa(index), zones: &intf.zones}
intf.zones.zoneList = append(intf.zones.zoneList, zone)
}

return intf, nil
}
Loading

0 comments on commit e152c0e

Please sign in to comment.