Merge pull request #39118 from bowei/cleanup-dns

Automatic merge from submit-queue (batch tested with PRs 39006, 39078, 37188, 39118)

Cleanup dns

* Remove hostname endpoints annotation (was beta feature)
* Remove references to non-client-go API
* Replaces references to internal kubernetes API with client-go.
This commit is contained in:
Kubernetes Submit Queue 2016-12-22 17:47:31 -08:00 committed by GitHub
commit ae4db79d1c
9 changed files with 81 additions and 121 deletions

View File

@ -13,15 +13,14 @@ go_library(
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//cmd/kube-dns/app/options:go_default_library", "//cmd/kube-dns/app/options:go_default_library",
"//pkg/client/clientset_generated/clientset:go_default_library",
"//pkg/client/restclient:go_default_library",
"//pkg/client/unversioned/clientcmd:go_default_library",
"//pkg/dns:go_default_library", "//pkg/dns:go_default_library",
"//pkg/dns/config:go_default_library", "//pkg/dns/config:go_default_library",
"//pkg/runtime/schema:go_default_library",
"//vendor:github.com/golang/glog", "//vendor:github.com/golang/glog",
"//vendor:github.com/skynetservices/skydns/metrics", "//vendor:github.com/skynetservices/skydns/metrics",
"//vendor:github.com/skynetservices/skydns/server", "//vendor:github.com/skynetservices/skydns/server",
"//vendor:github.com/spf13/pflag", "//vendor:github.com/spf13/pflag",
"//vendor:k8s.io/client-go/kubernetes",
"//vendor:k8s.io/client-go/rest",
"//vendor:k8s.io/client-go/tools/clientcmd",
], ],
) )

View File

@ -29,12 +29,12 @@ import (
"github.com/spf13/pflag" "github.com/spf13/pflag"
"k8s.io/kubernetes/cmd/kube-dns/app/options" "k8s.io/kubernetes/cmd/kube-dns/app/options"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" "k8s.io/kubernetes/pkg/dns"
"k8s.io/kubernetes/pkg/client/restclient"
kclientcmd "k8s.io/kubernetes/pkg/client/unversioned/clientcmd"
kdns "k8s.io/kubernetes/pkg/dns"
dnsconfig "k8s.io/kubernetes/pkg/dns/config" dnsconfig "k8s.io/kubernetes/pkg/dns/config"
"k8s.io/kubernetes/pkg/runtime/schema"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
) )
type KubeDNSServer struct { type KubeDNSServer struct {
@ -43,7 +43,7 @@ type KubeDNSServer struct {
healthzPort int healthzPort int
dnsBindAddress string dnsBindAddress string
dnsPort int dnsPort int
kd *kdns.KubeDNS kd *dns.KubeDNS
} }
func NewKubeDNSServerDefault(config *options.KubeDNSConfig) *KubeDNSServer { func NewKubeDNSServerDefault(config *options.KubeDNSConfig) *KubeDNSServer {
@ -69,41 +69,28 @@ func NewKubeDNSServerDefault(config *options.KubeDNSConfig) *KubeDNSServer {
healthzPort: config.HealthzPort, healthzPort: config.HealthzPort,
dnsBindAddress: config.DNSBindAddress, dnsBindAddress: config.DNSBindAddress,
dnsPort: config.DNSPort, dnsPort: config.DNSPort,
kd: kdns.NewKubeDNS(kubeClient, config.ClusterDomain, config.InitialSyncTimeout, configSync), kd: dns.NewKubeDNS(kubeClient, config.ClusterDomain, config.InitialSyncTimeout, configSync),
} }
} }
// TODO: evaluate using pkg/client/clientcmd func newKubeClient(dnsConfig *options.KubeDNSConfig) (kubernetes.Interface, error) {
func newKubeClient(dnsConfig *options.KubeDNSConfig) (clientset.Interface, error) { var config *rest.Config
var ( var err error
config *restclient.Config
err error
)
if dnsConfig.KubeMasterURL != "" && dnsConfig.KubeConfigFile == "" { if dnsConfig.KubeConfigFile == "" {
// Only --kube-master-url was provided. config, err = rest.InClusterConfig()
config = &restclient.Config{ if err != nil {
Host: dnsConfig.KubeMasterURL, return nil, err
ContentConfig: restclient.ContentConfig{GroupVersion: &schema.GroupVersion{Version: "v1"}},
} }
} else { } else {
// We either have: config, err = clientcmd.BuildConfigFromFlags(
// 1) --kube-master-url and --kubecfg-file dnsConfig.KubeMasterURL, dnsConfig.KubeConfigFile)
// 2) just --kubecfg-file if err != nil {
// 3) neither flag
// In any case, the logic is the same. If (3), this will automatically
// fall back on the service account token.
overrides := &kclientcmd.ConfigOverrides{}
overrides.ClusterInfo.Server = dnsConfig.KubeMasterURL // might be "", but that is OK
rules := &kclientcmd.ClientConfigLoadingRules{ExplicitPath: dnsConfig.KubeConfigFile} // might be "", but that is OK
if config, err = kclientcmd.NewNonInteractiveDeferredLoadingClientConfig(rules, overrides).ClientConfig(); err != nil {
return nil, err return nil, err
} }
} }
glog.V(0).Infof("Using %v for kubernetes master, kubernetes API: %v", return kubernetes.NewForConfig(config)
config.Host, config.GroupVersion)
return clientset.NewForConfig(config)
} }
func (server *KubeDNSServer) Run() { func (server *KubeDNSServer) Run() {

View File

@ -19,14 +19,16 @@ package main
import ( import (
"github.com/golang/glog" "github.com/golang/glog"
"github.com/spf13/pflag" "github.com/spf13/pflag"
"k8s.io/kubernetes/cmd/kube-dns/app" "k8s.io/kubernetes/cmd/kube-dns/app"
"k8s.io/kubernetes/cmd/kube-dns/app/options" "k8s.io/kubernetes/cmd/kube-dns/app/options"
_ "k8s.io/kubernetes/pkg/client/metrics/prometheus" // for client metric registration
"k8s.io/kubernetes/pkg/util/flag" "k8s.io/kubernetes/pkg/util/flag"
"k8s.io/kubernetes/pkg/util/logs" "k8s.io/kubernetes/pkg/util/logs"
"k8s.io/kubernetes/pkg/version" "k8s.io/kubernetes/pkg/version"
_ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration
"k8s.io/kubernetes/pkg/version/verflag" "k8s.io/kubernetes/pkg/version/verflag"
_ "k8s.io/kubernetes/pkg/client/metrics/prometheus" // for client metric registration
_ "k8s.io/kubernetes/pkg/version/prometheus" // for version metric registration
) )
func main() { func main() {

View File

@ -16,22 +16,21 @@ go_library(
], ],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api/v1:go_default_library",
"//pkg/api/v1/endpoints:go_default_library",
"//pkg/apis/meta/v1:go_default_library",
"//pkg/client/cache:go_default_library",
"//pkg/client/clientset_generated/clientset:go_default_library",
"//pkg/dns/config:go_default_library", "//pkg/dns/config:go_default_library",
"//pkg/dns/treecache:go_default_library", "//pkg/dns/treecache:go_default_library",
"//pkg/dns/util:go_default_library", "//pkg/dns/util:go_default_library",
"//pkg/runtime:go_default_library",
"//pkg/util/validation:go_default_library", "//pkg/util/validation:go_default_library",
"//pkg/util/wait:go_default_library", "//pkg/util/wait:go_default_library",
"//pkg/watch:go_default_library",
"//vendor:github.com/coreos/etcd/client", "//vendor:github.com/coreos/etcd/client",
"//vendor:github.com/golang/glog", "//vendor:github.com/golang/glog",
"//vendor:github.com/miekg/dns", "//vendor:github.com/miekg/dns",
"//vendor:github.com/skynetservices/skydns/msg", "//vendor:github.com/skynetservices/skydns/msg",
"//vendor:k8s.io/client-go/kubernetes",
"//vendor:k8s.io/client-go/pkg/api/v1",
"//vendor:k8s.io/client-go/pkg/apis/meta/v1",
"//vendor:k8s.io/client-go/pkg/runtime",
"//vendor:k8s.io/client-go/pkg/watch",
"//vendor:k8s.io/client-go/tools/cache",
], ],
) )
@ -41,11 +40,6 @@ go_test(
library = "go_default_library", library = "go_default_library",
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api/v1:go_default_library",
"//pkg/api/v1/endpoints:go_default_library",
"//pkg/apis/meta/v1:go_default_library",
"//pkg/client/cache:go_default_library",
"//pkg/client/clientset_generated/clientset/fake:go_default_library",
"//pkg/dns/config:go_default_library", "//pkg/dns/config:go_default_library",
"//pkg/dns/treecache:go_default_library", "//pkg/dns/treecache:go_default_library",
"//pkg/dns/util:go_default_library", "//pkg/dns/util:go_default_library",
@ -56,5 +50,9 @@ go_test(
"//vendor:github.com/skynetservices/skydns/server", "//vendor:github.com/skynetservices/skydns/server",
"//vendor:github.com/stretchr/testify/assert", "//vendor:github.com/stretchr/testify/assert",
"//vendor:github.com/stretchr/testify/require", "//vendor:github.com/stretchr/testify/require",
"//vendor:k8s.io/client-go/kubernetes/fake",
"//vendor:k8s.io/client-go/pkg/api/v1",
"//vendor:k8s.io/client-go/pkg/apis/meta/v1",
"//vendor:k8s.io/client-go/tools/cache",
], ],
) )

View File

@ -18,16 +18,16 @@ go_library(
], ],
tags = ["automanaged"], tags = ["automanaged"],
deps = [ deps = [
"//pkg/api/v1:go_default_library",
"//pkg/apis/meta/v1:go_default_library",
"//pkg/client/cache:go_default_library",
"//pkg/client/clientset_generated/clientset:go_default_library",
"//pkg/dns/federation:go_default_library", "//pkg/dns/federation:go_default_library",
"//pkg/fields:go_default_library",
"//pkg/runtime:go_default_library",
"//pkg/watch:go_default_library",
"//vendor:github.com/golang/glog", "//vendor:github.com/golang/glog",
"//vendor:k8s.io/client-go/kubernetes",
"//vendor:k8s.io/client-go/pkg/api/v1",
"//vendor:k8s.io/client-go/pkg/apis/meta/v1",
"//vendor:k8s.io/client-go/pkg/fields",
"//vendor:k8s.io/client-go/pkg/runtime",
"//vendor:k8s.io/client-go/pkg/util/wait", "//vendor:k8s.io/client-go/pkg/util/wait",
"//vendor:k8s.io/client-go/pkg/watch",
"//vendor:k8s.io/client-go/tools/cache",
], ],
) )

View File

@ -17,7 +17,7 @@ limitations under the License.
package config package config
import ( import (
types "k8s.io/kubernetes/pkg/apis/meta/v1" types "k8s.io/client-go/pkg/apis/meta/v1"
fed "k8s.io/kubernetes/pkg/dns/federation" fed "k8s.io/kubernetes/pkg/dns/federation"
) )

View File

@ -17,15 +17,16 @@ limitations under the License.
package config package config
import ( import (
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/pkg/api/v1"
metav1 "k8s.io/client-go/pkg/apis/meta/v1"
"k8s.io/client-go/pkg/fields"
"k8s.io/client-go/pkg/runtime"
"k8s.io/client-go/pkg/util/wait" "k8s.io/client-go/pkg/util/wait"
"k8s.io/kubernetes/pkg/api/v1" "k8s.io/client-go/pkg/watch"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" "k8s.io/client-go/tools/cache"
"k8s.io/kubernetes/pkg/client/cache"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset"
fed "k8s.io/kubernetes/pkg/dns/federation" fed "k8s.io/kubernetes/pkg/dns/federation"
"k8s.io/kubernetes/pkg/fields"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/watch"
"time" "time"
@ -47,7 +48,7 @@ type Sync interface {
} }
// NewSync for ConfigMap from namespace `ns` and `name`. // NewSync for ConfigMap from namespace `ns` and `name`.
func NewSync(client clientset.Interface, ns string, name string) Sync { func NewSync(client kubernetes.Interface, ns string, name string) Sync {
sync := &kubeSync{ sync := &kubeSync{
ns: ns, ns: ns,
name: name, name: name,
@ -87,7 +88,7 @@ type kubeSync struct {
ns string ns string
name string name string
client clientset.Interface client kubernetes.Interface
store cache.Store store cache.Store
controller *cache.Controller controller *cache.Controller

View File

@ -17,25 +17,24 @@ limitations under the License.
package dns package dns
import ( import (
"encoding/json"
"fmt" "fmt"
"net" "net"
"strings" "strings"
"sync" "sync"
"time" "time"
"k8s.io/kubernetes/pkg/api/v1" clientset "k8s.io/client-go/kubernetes"
"k8s.io/kubernetes/pkg/api/v1/endpoints" "k8s.io/client-go/pkg/api/v1"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" metav1 "k8s.io/client-go/pkg/apis/meta/v1"
kcache "k8s.io/kubernetes/pkg/client/cache" "k8s.io/client-go/pkg/runtime"
clientset "k8s.io/kubernetes/pkg/client/clientset_generated/clientset" "k8s.io/client-go/pkg/watch"
kcache "k8s.io/client-go/tools/cache"
"k8s.io/kubernetes/pkg/dns/config" "k8s.io/kubernetes/pkg/dns/config"
"k8s.io/kubernetes/pkg/dns/treecache" "k8s.io/kubernetes/pkg/dns/treecache"
"k8s.io/kubernetes/pkg/dns/util" "k8s.io/kubernetes/pkg/dns/util"
"k8s.io/kubernetes/pkg/runtime"
"k8s.io/kubernetes/pkg/util/validation" "k8s.io/kubernetes/pkg/util/validation"
"k8s.io/kubernetes/pkg/util/wait" "k8s.io/kubernetes/pkg/util/wait"
"k8s.io/kubernetes/pkg/watch"
etcd "github.com/coreos/etcd/client" etcd "github.com/coreos/etcd/client"
"github.com/golang/glog" "github.com/golang/glog"
@ -392,11 +391,6 @@ func (kd *KubeDNS) newPortalService(service *v1.Service) {
} }
func (kd *KubeDNS) generateRecordsForHeadlessService(e *v1.Endpoints, svc *v1.Service) error { func (kd *KubeDNS) generateRecordsForHeadlessService(e *v1.Endpoints, svc *v1.Service) error {
// TODO: remove this after v1.4 is released and the old annotations are EOL
podHostnames, err := getPodHostnamesFromAnnotation(e.Annotations)
if err != nil {
return err
}
subCache := treecache.NewTreeCache() subCache := treecache.NewTreeCache()
glog.V(4).Infof("Endpoints Annotations: %v", e.Annotations) glog.V(4).Infof("Endpoints Annotations: %v", e.Annotations)
for idx := range e.Subsets { for idx := range e.Subsets {
@ -404,7 +398,7 @@ func (kd *KubeDNS) generateRecordsForHeadlessService(e *v1.Endpoints, svc *v1.Se
address := &e.Subsets[idx].Addresses[subIdx] address := &e.Subsets[idx].Addresses[subIdx]
endpointIP := address.IP endpointIP := address.IP
recordValue, endpointName := util.GetSkyMsg(endpointIP, 0) recordValue, endpointName := util.GetSkyMsg(endpointIP, 0)
if hostLabel, exists := getHostname(address, podHostnames); exists { if hostLabel, exists := getHostname(address); exists {
endpointName = hostLabel endpointName = hostLabel
} }
subCache.SetEntry(endpointName, recordValue, kd.fqdn(svc, endpointName)) subCache.SetEntry(endpointName, recordValue, kd.fqdn(svc, endpointName))
@ -427,30 +421,13 @@ func (kd *KubeDNS) generateRecordsForHeadlessService(e *v1.Endpoints, svc *v1.Se
return nil return nil
} }
func getHostname(address *v1.EndpointAddress, podHostnames map[string]endpoints.HostRecord) (string, bool) { func getHostname(address *v1.EndpointAddress) (string, bool) {
if len(address.Hostname) > 0 { if len(address.Hostname) > 0 {
return address.Hostname, true return address.Hostname, true
} }
if hostRecord, exists := podHostnames[address.IP]; exists && len(validation.IsDNS1123Label(hostRecord.HostName)) == 0 {
return hostRecord.HostName, true
}
return "", false return "", false
} }
func getPodHostnamesFromAnnotation(annotations map[string]string) (map[string]endpoints.HostRecord, error) {
hostnames := map[string]endpoints.HostRecord{}
if annotations != nil {
if serializedHostnames, exists := annotations[endpoints.PodHostnamesAnnotation]; exists && len(serializedHostnames) > 0 {
err := json.Unmarshal([]byte(serializedHostnames), &hostnames)
if err != nil {
return nil, err
}
}
}
return hostnames, nil
}
func (kd *KubeDNS) generateSRVRecordValue(svc *v1.Service, portNumber int, labels ...string) *skymsg.Service { func (kd *KubeDNS) generateSRVRecordValue(svc *v1.Service, portNumber int, labels ...string) *skymsg.Service {
host := strings.Join([]string{svc.Name, svc.Namespace, serviceSubdomain, kd.domain}, ".") host := strings.Join([]string{svc.Name, svc.Namespace, serviceSubdomain, kd.domain}, ".")
for _, cNameLabel := range labels { for _, cNameLabel := range labels {

View File

@ -17,7 +17,6 @@ limitations under the License.
package dns package dns
import ( import (
"encoding/json"
"fmt" "fmt"
"net" "net"
"reflect" "reflect"
@ -32,11 +31,12 @@ import (
skyserver "github.com/skynetservices/skydns/server" skyserver "github.com/skynetservices/skydns/server"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
"k8s.io/kubernetes/pkg/api/v1"
endpointsapi "k8s.io/kubernetes/pkg/api/v1/endpoints" "k8s.io/client-go/kubernetes/fake"
metav1 "k8s.io/kubernetes/pkg/apis/meta/v1" "k8s.io/client-go/pkg/api/v1"
"k8s.io/kubernetes/pkg/client/cache" metav1 "k8s.io/client-go/pkg/apis/meta/v1"
fake "k8s.io/kubernetes/pkg/client/clientset_generated/clientset/fake" "k8s.io/client-go/tools/cache"
"k8s.io/kubernetes/pkg/dns/config" "k8s.io/kubernetes/pkg/dns/config"
"k8s.io/kubernetes/pkg/dns/treecache" "k8s.io/kubernetes/pkg/dns/treecache"
"k8s.io/kubernetes/pkg/dns/util" "k8s.io/kubernetes/pkg/dns/util"
@ -207,21 +207,9 @@ func TestSkyPodHostnameSRVLookup(t *testing.T) {
service := newHeadlessService() service := newHeadlessService()
endpointIPs := []string{"10.0.0.1", "10.0.0.2"} endpointIPs := []string{"10.0.0.1", "10.0.0.2"}
endpoints := newEndpoints(service, newSubsetWithOnePort("", 80, endpointIPs...)) endpoints := newEndpoints(
service,
// The format of thes annotations is: newSubsetWithOnePortWithHostname("", 80, true, endpointIPs...))
// endpoints.beta.kubernetes.io/hostnames-map: '{"ep-ip":{"HostName":"pod request hostname"}}'
epRecords := map[string]endpointsapi.HostRecord{}
for i, ep := range endpointIPs {
epRecords[ep] = endpointsapi.HostRecord{HostName: fmt.Sprintf("ep-%d", i)}
}
b, err := json.Marshal(epRecords)
if err != nil {
t.Fatalf("%v", err)
}
endpoints.Annotations = map[string]string{
endpointsapi.PodHostnamesAnnotation: string(b),
}
assert.NoError(t, kd.endpointsStore.Add(endpoints)) assert.NoError(t, kd.endpointsStore.Add(endpoints))
kd.newService(service) kd.newService(service)
name := strings.Join([]string{testService, testNamespace, "svc", testDomain}, ".") name := strings.Join([]string{testService, testNamespace, "svc", testDomain}, ".")
@ -676,10 +664,18 @@ func newEndpoints(service *v1.Service, subsets ...v1.EndpointSubset) *v1.Endpoin
} }
func newSubsetWithOnePort(portName string, port int32, ips ...string) v1.EndpointSubset { func newSubsetWithOnePort(portName string, port int32, ips ...string) v1.EndpointSubset {
return newSubsetWithOnePortWithHostname(portName, port, false, ips...)
}
func newSubsetWithOnePortWithHostname(portName string, port int32, addHostname bool, ips ...string) v1.EndpointSubset {
subset := newSubset() subset := newSubset()
subset.Ports = append(subset.Ports, v1.EndpointPort{Port: port, Name: portName, Protocol: "TCP"}) subset.Ports = append(subset.Ports, v1.EndpointPort{Port: port, Name: portName, Protocol: "TCP"})
for _, ip := range ips { for i, ip := range ips {
subset.Addresses = append(subset.Addresses, v1.EndpointAddress{IP: ip}) var hostname string
if addHostname {
hostname = fmt.Sprintf("ep-%d", i)
}
subset.Addresses = append(subset.Addresses, v1.EndpointAddress{IP: ip, Hostname: hostname})
} }
return subset return subset
} }