Merge pull request #26114 from ArtfulCoder/dnsport

Add dnsmasq as a DNS cache in kube-dns pod
This commit is contained in:
Abhi Shah 2016-05-26 08:13:58 -07:00
commit 965e8dce12
7 changed files with 41 additions and 22 deletions

View File

@ -22,7 +22,7 @@
# Default registry, arch and tag. This can be overwritten by arguments to make # Default registry, arch and tag. This can be overwritten by arguments to make
PLATFORM?=linux PLATFORM?=linux
ARCH?=amd64 ARCH?=amd64
TAG?=1.0 TAG?=1.1
REGISTRY?=gcr.io/google_containers REGISTRY?=gcr.io/google_containers
GOLANG_VERSION=1.6 GOLANG_VERSION=1.6

View File

@ -21,7 +21,7 @@ spec:
spec: spec:
containers: containers:
- name: kubedns - name: kubedns
image: gcr.io/google_containers/kubedns-amd64:1.0 image: gcr.io/google_containers/kubedns-amd64:1.1
resources: resources:
# TODO: Set memory limits when we've profiled the container for large # TODO: Set memory limits when we've profiled the container for large
# clusters, then set request = limit to keep this container in # clusters, then set request = limit to keep this container in
@ -54,6 +54,20 @@ spec:
args: args:
# command = "/kube-dns" # command = "/kube-dns"
- --domain={{ pillar['dns_domain'] }}. - --domain={{ pillar['dns_domain'] }}.
- --dns-port=10053
ports:
- containerPort: 10053
name: dns-local
protocol: UDP
- containerPort: 10053
name: dns-tcp-local
protocol: TCP
- name: dnsmasq
image: gcr.io/google_containers/dnsmasq:1.1
args:
- --cache-size=1000
- --no-resolv
- --server=127.0.0.1#10053
ports: ports:
- containerPort: 53 - containerPort: 53
name: dns name: dns

View File

@ -33,6 +33,7 @@ type KubeDNSConfig struct {
KubeConfigFile string KubeConfigFile string
KubeMasterURL string KubeMasterURL string
HealthzPort int HealthzPort int
DNSPort int
// Federations maps federation names to their registered domain names. // Federations maps federation names to their registered domain names.
Federations map[string]string Federations map[string]string
} }
@ -43,6 +44,7 @@ func NewKubeDNSConfig() *KubeDNSConfig {
KubeConfigFile: "", KubeConfigFile: "",
KubeMasterURL: "", KubeMasterURL: "",
HealthzPort: 8081, HealthzPort: 8081,
DNSPort: 53,
Federations: make(map[string]string), Federations: make(map[string]string),
} }
} }
@ -140,5 +142,6 @@ func (s *KubeDNSConfig) AddFlags(fs *pflag.FlagSet) {
fs.StringVar(&s.KubeConfigFile, "kubecfg-file", s.KubeConfigFile, "Location of kubecfg file for access to kubernetes master service; --kube-master-url overrides the URL part of this; if neither this nor --kube-master-url are provided, defaults to service account tokens") fs.StringVar(&s.KubeConfigFile, "kubecfg-file", s.KubeConfigFile, "Location of kubecfg file for access to kubernetes master service; --kube-master-url overrides the URL part of this; if neither this nor --kube-master-url are provided, defaults to service account tokens")
fs.Var(kubeMasterURLVar{&s.KubeMasterURL}, "kube-master-url", "URL to reach kubernetes master. Env variables in this flag will be expanded.") fs.Var(kubeMasterURLVar{&s.KubeMasterURL}, "kube-master-url", "URL to reach kubernetes master. Env variables in this flag will be expanded.")
fs.IntVar(&s.HealthzPort, "healthz-port", s.HealthzPort, "port on which to serve a kube-dns HTTP readiness probe.") fs.IntVar(&s.HealthzPort, "healthz-port", s.HealthzPort, "port on which to serve a kube-dns HTTP readiness probe.")
fs.IntVar(&s.DNSPort, "dns-port", s.DNSPort, "port on which to serve DNS requests.")
fs.Var(federationsVar{s.Federations}, "federations", "a comma separated list of the federation names and their corresponding domain names to which this cluster belongs. Example: \"myfederation1=example.com,myfederation2=example2.com,myfederation3=example.com\"") fs.Var(federationsVar{s.Federations}, "federations", "a comma separated list of the federation names and their corresponding domain names to which this cluster belongs. Example: \"myfederation1=example.com,myfederation2=example2.com,myfederation3=example.com\"")
} }

View File

@ -28,7 +28,7 @@ import (
"github.com/skynetservices/skydns/server" "github.com/skynetservices/skydns/server"
"k8s.io/kubernetes/cmd/kube-dns/app/options" "k8s.io/kubernetes/cmd/kube-dns/app/options"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_3" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
"k8s.io/kubernetes/pkg/client/restclient" "k8s.io/kubernetes/pkg/client/restclient"
kclientcmd "k8s.io/kubernetes/pkg/client/unversioned/clientcmd" kclientcmd "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
kdns "k8s.io/kubernetes/pkg/dns" kdns "k8s.io/kubernetes/pkg/dns"
@ -38,6 +38,7 @@ type KubeDNSServer struct {
// DNS domain name. // DNS domain name.
domain string domain string
healthzPort int healthzPort int
dnsPort int
kd *kdns.KubeDNS kd *kdns.KubeDNS
} }
@ -51,6 +52,7 @@ func NewKubeDNSServerDefault(config *options.KubeDNSConfig) *KubeDNSServer {
glog.Fatalf("Failed to create a kubernetes client: %v", err) glog.Fatalf("Failed to create a kubernetes client: %v", err)
} }
ks.healthzPort = config.HealthzPort ks.healthzPort = config.HealthzPort
ks.dnsPort = config.DNSPort
ks.kd = kdns.NewKubeDNS(kubeClient, config.ClusterDomain, config.Federations) ks.kd = kdns.NewKubeDNS(kubeClient, config.ClusterDomain, config.Federations)
return &ks return &ks
} }
@ -124,7 +126,8 @@ func setupSignalHandlers() {
} }
func (d *KubeDNSServer) startSkyDNSServer() { func (d *KubeDNSServer) startSkyDNSServer() {
skydnsConfig := &server.Config{Domain: d.domain, DnsAddr: "0.0.0.0:53"} glog.Infof("Starting SkyDNS server. Listening on port:%d", d.dnsPort)
skydnsConfig := &server.Config{Domain: d.domain, DnsAddr: fmt.Sprintf("0.0.0.0:%d", d.dnsPort)}
server.SetDefaults(skydnsConfig) server.SetDefaults(skydnsConfig)
s := server.New(d.kd, skydnsConfig) s := server.New(d.kd, skydnsConfig)
if err := metrics.Metrics(); err != nil { if err := metrics.Metrics(); err != nil {

View File

@ -90,6 +90,7 @@ deployment-label-key
deserialization-cache-size deserialization-cache-size
dest-file dest-file
disable-filter disable-filter
dns-port
docker-email docker-email
docker-endpoint docker-endpoint
docker-exec-handler docker-exec-handler

View File

@ -31,9 +31,8 @@ import (
kapi "k8s.io/kubernetes/pkg/api" kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/endpoints" "k8s.io/kubernetes/pkg/api/endpoints"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
v1 "k8s.io/kubernetes/pkg/api/v1"
kcache "k8s.io/kubernetes/pkg/client/cache" kcache "k8s.io/kubernetes/pkg/client/cache"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_3" clientset "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset"
kframework "k8s.io/kubernetes/pkg/controller/framework" kframework "k8s.io/kubernetes/pkg/controller/framework"
"k8s.io/kubernetes/pkg/runtime" "k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/validation" "k8s.io/kubernetes/pkg/util/validation"
@ -129,7 +128,7 @@ func (kd *KubeDNS) Start() {
kd.waitForKubernetesService() kd.waitForKubernetesService()
} }
func (kd *KubeDNS) waitForKubernetesService() (svc *v1.Service) { func (kd *KubeDNS) waitForKubernetesService() (svc *kapi.Service) {
name := fmt.Sprintf("%v/%v", kapi.NamespaceDefault, kubernetesSvcName) name := fmt.Sprintf("%v/%v", kapi.NamespaceDefault, kubernetesSvcName)
glog.Infof("Waiting for service: %v", name) glog.Infof("Waiting for service: %v", name)
var err error var err error
@ -158,13 +157,13 @@ func (kd *KubeDNS) setServicesStore() {
kd.servicesStore, kd.serviceController = kframework.NewInformer( kd.servicesStore, kd.serviceController = kframework.NewInformer(
&kcache.ListWatch{ &kcache.ListWatch{
ListFunc: func(options kapi.ListOptions) (runtime.Object, error) { ListFunc: func(options kapi.ListOptions) (runtime.Object, error) {
return kd.kubeClient.Core().Services(v1.NamespaceAll).List(options) return kd.kubeClient.Core().Services(kapi.NamespaceAll).List(options)
}, },
WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) { WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) {
return kd.kubeClient.Core().Services(v1.NamespaceAll).Watch(options) return kd.kubeClient.Core().Services(kapi.NamespaceAll).Watch(options)
}, },
}, },
&v1.Service{}, &kapi.Service{},
resyncPeriod, resyncPeriod,
kframework.ResourceEventHandlerFuncs{ kframework.ResourceEventHandlerFuncs{
AddFunc: kd.newService, AddFunc: kd.newService,
@ -179,13 +178,13 @@ func (kd *KubeDNS) setEndpointsStore() {
kd.endpointsStore, kd.endpointsController = kframework.NewInformer( kd.endpointsStore, kd.endpointsController = kframework.NewInformer(
&kcache.ListWatch{ &kcache.ListWatch{
ListFunc: func(options kapi.ListOptions) (runtime.Object, error) { ListFunc: func(options kapi.ListOptions) (runtime.Object, error) {
return kd.kubeClient.Core().Endpoints(v1.NamespaceAll).List(options) return kd.kubeClient.Core().Endpoints(kapi.NamespaceAll).List(options)
}, },
WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) { WatchFunc: func(options kapi.ListOptions) (watch.Interface, error) {
return kd.kubeClient.Core().Endpoints(v1.NamespaceAll).Watch(options) return kd.kubeClient.Core().Endpoints(kapi.NamespaceAll).Watch(options)
}, },
}, },
&v1.Endpoints{}, &kapi.Endpoints{},
resyncPeriod, resyncPeriod,
kframework.ResourceEventHandlerFuncs{ kframework.ResourceEventHandlerFuncs{
AddFunc: kd.handleEndpointAdd, AddFunc: kd.handleEndpointAdd,
@ -565,12 +564,12 @@ func (kd *KubeDNS) federationRecords(queryPath []string) ([]skymsg.Service, erro
// simpler approach here. // simpler approach here.
// Also note that zone here means the zone in cloud provider terminology, not the DNS zone. // Also note that zone here means the zone in cloud provider terminology, not the DNS zone.
func (kd *KubeDNS) getClusterZone() (string, error) { func (kd *KubeDNS) getClusterZone() (string, error) {
var node *v1.Node var node *kapi.Node
objs := kd.nodesStore.List() objs := kd.nodesStore.List()
if len(objs) > 0 { if len(objs) > 0 {
var ok bool var ok bool
if node, ok = objs[0].(*v1.Node); !ok { if node, ok = objs[0].(*kapi.Node); !ok {
return "", fmt.Errorf("expected node object, got: %T", objs[0]) return "", fmt.Errorf("expected node object, got: %T", objs[0])
} }
} else { } else {

View File

@ -29,9 +29,8 @@ import (
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
kapi "k8s.io/kubernetes/pkg/api" kapi "k8s.io/kubernetes/pkg/api"
"k8s.io/kubernetes/pkg/api/unversioned" "k8s.io/kubernetes/pkg/api/unversioned"
v1 "k8s.io/kubernetes/pkg/api/v1"
"k8s.io/kubernetes/pkg/client/cache" "k8s.io/kubernetes/pkg/client/cache"
fake "k8s.io/kubernetes/pkg/client/clientset_generated/release_1_3/fake" fake "k8s.io/kubernetes/pkg/client/clientset_generated/internalclientset/fake"
) )
const ( const (
@ -276,17 +275,17 @@ func testInvalidFederationQueries(t *testing.T, kd *KubeDNS) {
} }
} }
func newNodes() *v1.NodeList { func newNodes() *kapi.NodeList {
return &v1.NodeList{ return &kapi.NodeList{
Items: []v1.Node{ Items: []kapi.Node{
// Node without annotation. // Node without annotation.
{ {
ObjectMeta: v1.ObjectMeta{ ObjectMeta: kapi.ObjectMeta{
Name: "testnode-0", Name: "testnode-0",
}, },
}, },
{ {
ObjectMeta: v1.ObjectMeta{ ObjectMeta: kapi.ObjectMeta{
Name: "testnode-1", Name: "testnode-1",
Annotations: map[string]string{ Annotations: map[string]string{
// Note: The zone name here is an arbitrary string and doesn't exactly follow the // Note: The zone name here is an arbitrary string and doesn't exactly follow the