mirror of https://github.com/kubernetes/kops.git
Enable CoreDNS in nodeup/protokube (#6)
* Enable CoreDNS in nodeup/protokube. * Address comments.
This commit is contained in:
parent
22e0ce3775
commit
6b010c4c5e
|
|
@ -30,6 +30,7 @@ import (
|
||||||
"k8s.io/client-go/kubernetes"
|
"k8s.io/client-go/kubernetes"
|
||||||
"k8s.io/client-go/rest"
|
"k8s.io/client-go/rest"
|
||||||
_ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/aws/route53"
|
_ "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"
|
_ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -47,7 +48,7 @@ func main() {
|
||||||
glog.Flush()
|
glog.Flush()
|
||||||
|
|
||||||
dnsProviderId := "aws-route53"
|
dnsProviderId := "aws-route53"
|
||||||
flags.StringVar(&dnsProviderId, "dns", dnsProviderId, "DNS provider we should use (aws-route53, google-clouddns)")
|
flags.StringVar(&dnsProviderId, "dns", dnsProviderId, "DNS provider we should use (aws-route53, google-clouddns, coredns)")
|
||||||
|
|
||||||
var zones []string
|
var zones []string
|
||||||
flags.StringSliceVarP(&zones, "zone", "z", []string{}, "Configure permitted zones and their mappings")
|
flags.StringSliceVarP(&zones, "zone", "z", []string{}, "Configure permitted zones and their mappings")
|
||||||
|
|
@ -96,7 +97,7 @@ func main() {
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
|
|
||||||
dnsController, err := dns.NewDNSController(dnsProvider, zoneRules)
|
dnsController, err := dns.NewDNSController(dnsProvider, zoneRules, dnsProviderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Errorf("Error building DNS controller: %v", err)
|
glog.Errorf("Error building DNS controller: %v", err)
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
|
|
|
||||||
|
|
@ -29,6 +29,7 @@ import (
|
||||||
|
|
||||||
"k8s.io/kops/dns-controller/pkg/util"
|
"k8s.io/kops/dns-controller/pkg/util"
|
||||||
"k8s.io/kubernetes/federation/pkg/dnsprovider"
|
"k8s.io/kubernetes/federation/pkg/dnsprovider"
|
||||||
|
k8scoredns "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/coredns"
|
||||||
"k8s.io/kubernetes/federation/pkg/dnsprovider/rrstype"
|
"k8s.io/kubernetes/federation/pkg/dnsprovider/rrstype"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -54,6 +55,9 @@ type DNSController struct {
|
||||||
|
|
||||||
// changeCount is a change-counter, which helps us avoid computation when nothing has changed
|
// changeCount is a change-counter, which helps us avoid computation when nothing has changed
|
||||||
changeCount uint64
|
changeCount uint64
|
||||||
|
|
||||||
|
//DNS Provider ID, one of aws-route53, google-clouddns, and coredns
|
||||||
|
dnsProviderId string
|
||||||
}
|
}
|
||||||
|
|
||||||
// DNSController is a Context
|
// DNSController is a Context
|
||||||
|
|
@ -80,7 +84,7 @@ type DNSControllerScope struct {
|
||||||
var _ Scope = &DNSControllerScope{}
|
var _ Scope = &DNSControllerScope{}
|
||||||
|
|
||||||
// NewDnsController creates a DnsController
|
// NewDnsController creates a DnsController
|
||||||
func NewDNSController(dnsProvider dnsprovider.Interface, zoneRules *ZoneRules) (*DNSController, error) {
|
func NewDNSController(dnsProvider dnsprovider.Interface, zoneRules *ZoneRules, dnsProviderId string) (*DNSController, error) {
|
||||||
dnsCache, err := newDNSCache(dnsProvider)
|
dnsCache, err := newDNSCache(dnsProvider)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, fmt.Errorf("error initializing DNS cache: %v", err)
|
return nil, fmt.Errorf("error initializing DNS cache: %v", err)
|
||||||
|
|
@ -90,6 +94,7 @@ func NewDNSController(dnsProvider dnsprovider.Interface, zoneRules *ZoneRules) (
|
||||||
scopes: make(map[string]*DNSControllerScope),
|
scopes: make(map[string]*DNSControllerScope),
|
||||||
zoneRules: zoneRules,
|
zoneRules: zoneRules,
|
||||||
dnsCache: dnsCache,
|
dnsCache: dnsCache,
|
||||||
|
dnsProviderId: dnsProviderId,
|
||||||
}
|
}
|
||||||
|
|
||||||
return c, nil
|
return c, nil
|
||||||
|
|
@ -273,7 +278,7 @@ func (c *DNSController) runOnce() error {
|
||||||
dedup = append(dedup, s)
|
dedup = append(dedup, s)
|
||||||
}
|
}
|
||||||
|
|
||||||
err := op.updateRecords(k, dedup, int64(ttl.Seconds()))
|
err := op.updateRecords(k, newValues, int64(ttl.Seconds()), c.dnsProviderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Infof("error updating records for %s: %v", k, err)
|
glog.Infof("error updating records for %s: %v", k, err)
|
||||||
errors = append(errors, err)
|
errors = append(errors, err)
|
||||||
|
|
@ -288,7 +293,7 @@ func (c *DNSController) runOnce() error {
|
||||||
|
|
||||||
newValues := newValueMap[k]
|
newValues := newValueMap[k]
|
||||||
if newValues == nil {
|
if newValues == nil {
|
||||||
err := op.deleteRecords(k)
|
err := op.deleteRecords(k, c.dnsProviderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
glog.Infof("error deleting records for %s: %v", k, err)
|
glog.Infof("error deleting records for %s: %v", k, err)
|
||||||
errors = append(errors, err)
|
errors = append(errors, err)
|
||||||
|
|
@ -430,7 +435,7 @@ func (o *dnsOp) listRecords(zone dnsprovider.Zone) ([]dnsprovider.ResourceRecord
|
||||||
return rrs, nil
|
return rrs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *dnsOp) deleteRecords(k recordKey) error {
|
func (o *dnsOp) deleteRecords(k recordKey, dnsProviderId string) error {
|
||||||
glog.V(2).Infof("Deleting all records for %s", k)
|
glog.V(2).Infof("Deleting all records for %s", k)
|
||||||
|
|
||||||
fqdn := EnsureDotSuffix(k.FQDN)
|
fqdn := EnsureDotSuffix(k.FQDN)
|
||||||
|
|
@ -441,6 +446,31 @@ func (o *dnsOp) deleteRecords(k recordKey) error {
|
||||||
return fmt.Errorf("no suitable zone found for %q", fqdn)
|
return fmt.Errorf("no suitable zone found for %q", fqdn)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: work-around before ResourceRecordSets.List() is implemented for CoreDNS
|
||||||
|
if dnsProviderId == k8scoredns.ProviderName {
|
||||||
|
rrsProvider, ok := zone.ResourceRecordSets()
|
||||||
|
if !ok {
|
||||||
|
return fmt.Errorf("zone does not support resource records %q", zone.Name())
|
||||||
|
}
|
||||||
|
|
||||||
|
dnsRecord, err := rrsProvider.Get(fqdn)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Failed to get DNS record %s with error: %v", fqdn, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if dnsRecord != nil && string(dnsRecord.Type()) == string(k.RecordType) {
|
||||||
|
glog.V(8).Infof("Found matching record: %s %s", k.RecordType, fqdn)
|
||||||
|
cs, err := o.getChangeset(zone)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
cs.Remove(dnsRecord)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// when DNS provider is aws-route53 or google-clouddns
|
||||||
rrs, err := o.listRecords(zone)
|
rrs, err := o.listRecords(zone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error querying resource records for zone %q: %v", zone.Name(), err)
|
return fmt.Errorf("error querying resource records for zone %q: %v", zone.Name(), err)
|
||||||
|
|
@ -469,7 +499,7 @@ func (o *dnsOp) deleteRecords(k recordKey) error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (o *dnsOp) updateRecords(k recordKey, newRecords []string, ttl int64) error {
|
func (o *dnsOp) updateRecords(k recordKey, newRecords []string, ttl int64, dnsProviderId string) error {
|
||||||
fqdn := EnsureDotSuffix(k.FQDN)
|
fqdn := EnsureDotSuffix(k.FQDN)
|
||||||
|
|
||||||
zone := o.findZone(fqdn)
|
zone := o.findZone(fqdn)
|
||||||
|
|
@ -483,12 +513,24 @@ func (o *dnsOp) updateRecords(k recordKey, newRecords []string, ttl int64) error
|
||||||
return fmt.Errorf("zone does not support resource records %q", zone.Name())
|
return fmt.Errorf("zone does not support resource records %q", zone.Name())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var existing dnsprovider.ResourceRecordSet
|
||||||
|
// TODO: work-around before ResourceRecordSets.List() is implemented for CoreDNS
|
||||||
|
if dnsProviderId == k8scoredns.ProviderName {
|
||||||
|
dnsRecord, err := rrsProvider.Get(fqdn)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("Failed to get DNS record %s with error: %v", fqdn, err)
|
||||||
|
}
|
||||||
|
if dnsRecord != nil && string(dnsRecord.Type()) == string(k.RecordType) {
|
||||||
|
glog.V(8).Infof("Found matching record: %s %s", k.RecordType, fqdn)
|
||||||
|
existing = dnsRecord
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// when DNS provider is aws-route53 or google-clouddns
|
||||||
rrs, err := o.listRecords(zone)
|
rrs, err := o.listRecords(zone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("error querying resource records for zone %q: %v", zone.Name(), err)
|
return fmt.Errorf("error querying resource records for zone %q: %v", zone.Name(), err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var existing dnsprovider.ResourceRecordSet
|
|
||||||
for _, rr := range rrs {
|
for _, rr := range rrs {
|
||||||
rrName := EnsureDotSuffix(rr.Name())
|
rrName := EnsureDotSuffix(rr.Name())
|
||||||
if rrName != fqdn {
|
if rrName != fqdn {
|
||||||
|
|
@ -507,6 +549,7 @@ func (o *dnsOp) updateRecords(k recordKey, newRecords []string, ttl int64) error
|
||||||
}
|
}
|
||||||
existing = rr
|
existing = rr
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
cs, err := o.getChangeset(zone)
|
cs, err := o.getChangeset(zone)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -166,6 +166,7 @@ type ProtokubeFlags struct {
|
||||||
|
|
||||||
// ClusterId flag is required only for vSphere cloud type, to pass cluster id information to protokube. AWS and GCE workflows ignore this flag.
|
// ClusterId flag is required only for vSphere cloud type, to pass cluster id information to protokube. AWS and GCE workflows ignore this flag.
|
||||||
ClusterId *string `json:"cluster-id,omitempty" flag:"cluster-id"`
|
ClusterId *string `json:"cluster-id,omitempty" flag:"cluster-id"`
|
||||||
|
DNSServer *string `json:"dns-server,omitempty" flag:"dns-server"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ProtokubeFlags returns the flags object for protokube
|
// ProtokubeFlags returns the flags object for protokube
|
||||||
|
|
@ -212,8 +213,9 @@ func (t *ProtokubeBuilder) ProtokubeFlags(k8sVersion semver.Version) *ProtokubeF
|
||||||
case fi.CloudProviderGCE:
|
case fi.CloudProviderGCE:
|
||||||
f.DNSProvider = fi.String("google-clouddns")
|
f.DNSProvider = fi.String("google-clouddns")
|
||||||
case fi.CloudProviderVSphere:
|
case fi.CloudProviderVSphere:
|
||||||
f.DNSProvider = fi.String("aws-route53")
|
f.DNSProvider = fi.String("coredns")
|
||||||
f.ClusterId = fi.String(t.Cluster.ObjectMeta.Name)
|
f.ClusterId = fi.String(t.Cluster.ObjectMeta.Name)
|
||||||
|
f.DNSServer = fi.String(*t.Cluster.Spec.CloudConfig.VSphereCoreDNSServer)
|
||||||
default:
|
default:
|
||||||
glog.Warningf("Unknown cloudprovider %q; won't set DNS provider")
|
glog.Warningf("Unknown cloudprovider %q; won't set DNS provider")
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,12 @@ limitations under the License.
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/golang/glog"
|
"github.com/golang/glog"
|
||||||
"github.com/spf13/pflag"
|
"github.com/spf13/pflag"
|
||||||
|
"io"
|
||||||
"k8s.io/kops/dns-controller/pkg/dns"
|
"k8s.io/kops/dns-controller/pkg/dns"
|
||||||
"k8s.io/kops/protokube/pkg/protokube"
|
"k8s.io/kops/protokube/pkg/protokube"
|
||||||
"k8s.io/kubernetes/federation/pkg/dnsprovider"
|
"k8s.io/kubernetes/federation/pkg/dnsprovider"
|
||||||
|
|
@ -30,6 +32,7 @@ import (
|
||||||
|
|
||||||
// Load DNS plugins
|
// Load DNS plugins
|
||||||
_ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/aws/route53"
|
_ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/aws/route53"
|
||||||
|
k8scoredns "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/coredns"
|
||||||
_ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns"
|
_ "k8s.io/kubernetes/federation/pkg/dnsprovider/providers/google/clouddns"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -53,7 +56,7 @@ func main() {
|
||||||
|
|
||||||
func run() error {
|
func run() error {
|
||||||
dnsProviderId := "aws-route53"
|
dnsProviderId := "aws-route53"
|
||||||
flags.StringVar(&dnsProviderId, "dns", dnsProviderId, "DNS provider we should use (aws-route53, google-clouddns)")
|
flags.StringVar(&dnsProviderId, "dns", dnsProviderId, "DNS provider we should use (aws-route53, google-clouddns, coredns)")
|
||||||
|
|
||||||
var zones []string
|
var zones []string
|
||||||
flags.StringSliceVarP(&zones, "zone", "z", []string{}, "Configure permitted zones and their mappings")
|
flags.StringSliceVarP(&zones, "zone", "z", []string{}, "Configure permitted zones and their mappings")
|
||||||
|
|
@ -79,6 +82,9 @@ func run() error {
|
||||||
clusterID := ""
|
clusterID := ""
|
||||||
flag.StringVar(&clusterID, "cluster-id", clusterID, "Cluster ID")
|
flag.StringVar(&clusterID, "cluster-id", clusterID, "Cluster ID")
|
||||||
|
|
||||||
|
dnsServer := ""
|
||||||
|
flag.StringVar(&dnsServer, "dns-server", dnsServer, "DNS Server")
|
||||||
|
|
||||||
flagChannels := ""
|
flagChannels := ""
|
||||||
flag.StringVar(&flagChannels, "channels", flagChannels, "channels to install")
|
flag.StringVar(&flagChannels, "channels", flagChannels, "channels to install")
|
||||||
|
|
||||||
|
|
@ -178,7 +184,16 @@ func run() error {
|
||||||
var dnsScope dns.Scope
|
var dnsScope dns.Scope
|
||||||
var dnsController *dns.DNSController
|
var dnsController *dns.DNSController
|
||||||
{
|
{
|
||||||
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 {
|
if err != nil {
|
||||||
return fmt.Errorf("Error initializing DNS provider %q: %v", dnsProviderId, err)
|
return fmt.Errorf("Error initializing DNS provider %q: %v", dnsProviderId, err)
|
||||||
}
|
}
|
||||||
|
|
@ -191,7 +206,7 @@ func run() error {
|
||||||
return fmt.Errorf("unexpected zone flags: %q", err)
|
return fmt.Errorf("unexpected zone flags: %q", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
dnsController, err = dns.NewDNSController(dnsProvider, zoneRules)
|
dnsController, err = dns.NewDNSController(dnsProvider, zoneRules, dnsProviderId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -456,6 +456,8 @@ func (c *ApplyClusterCmd) Run() error {
|
||||||
//&model.SSHKeyModelBuilder{KopsModelContext: modelContext},
|
//&model.SSHKeyModelBuilder{KopsModelContext: modelContext},
|
||||||
)
|
)
|
||||||
case fi.CloudProviderVSphere:
|
case fi.CloudProviderVSphere:
|
||||||
|
l.Builders = append(l.Builders,
|
||||||
|
&model.PKIModelBuilder{KopsModelContext: modelContext})
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unknown cloudprovider %q", cluster.Spec.CloudProvider)
|
return fmt.Errorf("unknown cloudprovider %q", cluster.Spec.CloudProvider)
|
||||||
|
|
|
||||||
|
|
@ -136,7 +136,7 @@ func (tf *TemplateFunctions) DnsControllerArgv() ([]string, error) {
|
||||||
case fi.CloudProviderGCE:
|
case fi.CloudProviderGCE:
|
||||||
argv = append(argv, "--dns=google-clouddns")
|
argv = append(argv, "--dns=google-clouddns")
|
||||||
case fi.CloudProviderVSphere:
|
case fi.CloudProviderVSphere:
|
||||||
argv = append(argv, "--dns=aws-route53")
|
argv = append(argv, "--dns=coredns")
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return nil, fmt.Errorf("unhandled cloudprovider %q", tf.cluster.Spec.CloudProvider)
|
return nil, fmt.Errorf("unhandled cloudprovider %q", tf.cluster.Spec.CloudProvider)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue