diff --git a/osbase/net/dns/kubernetes/object/BUILD.bazel b/osbase/net/dns/kubernetes/object/BUILD.bazel
new file mode 100644
index 0000000..d851b57
--- /dev/null
+++ b/osbase/net/dns/kubernetes/object/BUILD.bazel
@@ -0,0 +1,36 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library", "go_test")
+
+go_library(
+    name = "object",
+    srcs = [
+        "endpoint.go",
+        "informer.go",
+        "namespace.go",
+        "object.go",
+        "service.go",
+    ],
+    importpath = "source.monogon.dev/osbase/net/dns/kubernetes/object",
+    visibility = ["//osbase/net/dns/kubernetes:__subpackages__"],
+    deps = [
+        "@com_github_miekg_dns//:dns",
+        "@io_k8s_api//core/v1:core",
+        "@io_k8s_api//discovery/v1:discovery",
+        "@io_k8s_apimachinery//pkg/api/meta",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
+        "@io_k8s_apimachinery//pkg/runtime",
+        "@io_k8s_apimachinery//pkg/runtime/schema",
+        "@io_k8s_apimachinery//pkg/types",
+        "@io_k8s_client_go//tools/cache",
+    ],
+)
+
+go_test(
+    name = "object_test",
+    srcs = ["informer_test.go"],
+    embed = [":object"],
+    deps = [
+        "@io_k8s_api//core/v1:core",
+        "@io_k8s_apimachinery//pkg/apis/meta/v1:meta",
+        "@io_k8s_client_go//tools/cache",
+    ],
+)
diff --git a/osbase/net/dns/kubernetes/object/endpoint.go b/osbase/net/dns/kubernetes/object/endpoint.go
new file mode 100644
index 0000000..a675ad2
--- /dev/null
+++ b/osbase/net/dns/kubernetes/object/endpoint.go
@@ -0,0 +1,174 @@
+package object
+
+// Taken and modified from the Kubernetes plugin of CoreDNS, under Apache 2.0.
+
+import (
+	"fmt"
+	"net/netip"
+	"regexp"
+	"slices"
+	"strings"
+	"time"
+
+	api "k8s.io/api/core/v1"
+	discovery "k8s.io/api/discovery/v1"
+	meta "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// Endpoints is a stripped down discovery.EndpointSlice
+// with only the items we need.
+type Endpoints struct {
+	Version               string
+	Name                  string
+	Namespace             string
+	LastChangeTriggerTime time.Time
+	Index                 string
+	Addresses             []EndpointAddress
+	Ports                 []Port
+
+	*Empty
+}
+
+// EndpointAddress is a tuple that describes single IP address.
+type EndpointAddress struct {
+	// IP contains the IP address in binary format.
+	IP       string
+	Hostname string
+}
+
+// Port is a tuple that describes a single port.
+type Port struct {
+	Port     uint16
+	Name     string
+	Protocol string
+}
+
+// EndpointsKey returns a string using for the index.
+func EndpointsKey(name, namespace string) string { return name + "." + namespace }
+
+var hostnameRegexp = regexp.MustCompile(`^[-a-z0-9]{1,63}$`)
+
+// EndpointSliceToEndpoints converts a *discovery.EndpointSlice to a *Endpoints.
+func EndpointSliceToEndpoints(obj meta.Object) (meta.Object, error) {
+	ends, ok := obj.(*discovery.EndpointSlice)
+	if !ok {
+		return nil, fmt.Errorf("unexpected object %v", obj)
+	}
+	e := &Endpoints{
+		Version:   ends.GetResourceVersion(),
+		Name:      ends.GetName(),
+		Namespace: ends.GetNamespace(),
+		Index:     EndpointsKey(ends.Labels[discovery.LabelServiceName], ends.GetNamespace()),
+	}
+
+	// In case of parse error, the value is time.Zero.
+	e.LastChangeTriggerTime, _ = time.Parse(time.RFC3339Nano, ends.Annotations[api.EndpointsLastChangeTriggerTime])
+
+	e.Ports = make([]Port, 0, len(ends.Ports))
+	for _, p := range ends.Ports {
+		if p.Port != nil && *p.Port >= 1 && *p.Port <= 0xffff &&
+			p.Name != nil && *p.Name != "" && p.Protocol != nil {
+			ep := Port{
+				Port:     uint16(*p.Port),
+				Name:     strings.ToLower(*p.Name),
+				Protocol: strings.ToLower(string(*p.Protocol)),
+			}
+			e.Ports = append(e.Ports, ep)
+		}
+	}
+
+	for _, end := range ends.Endpoints {
+		if !endpointsliceReady(end.Conditions.Ready) {
+			continue
+		}
+
+		var endHostname string
+		if end.Hostname != nil {
+			endHostname = *end.Hostname
+		}
+		if endHostname != "" && !hostnameRegexp.MatchString(endHostname) {
+			endHostname = ""
+		}
+
+		for _, rawIP := range end.Addresses {
+			parsedIP, err := netip.ParseAddr(rawIP)
+			if err != nil || parsedIP.Zone() != "" {
+				continue
+			}
+			parsedIP = parsedIP.Unmap()
+			// The IP address is converted to a binary string, not human readable.
+			// That way we don't need to parse it again later.
+			ea := EndpointAddress{IP: string(parsedIP.AsSlice())}
+			if endHostname != "" {
+				ea.Hostname = endHostname
+			} else {
+				ea.Hostname = strings.ReplaceAll(strings.ReplaceAll(parsedIP.String(), ".", "-"), ":", "-")
+			}
+			e.Addresses = append(e.Addresses, ea)
+		}
+	}
+
+	*ends = discovery.EndpointSlice{}
+
+	return e, nil
+}
+
+func endpointsliceReady(ready *bool) bool {
+	// Per API docs: a nil value indicates an unknown state. In most cases
+	// consumers should interpret this unknown state as ready.
+	if ready == nil {
+		return true
+	}
+	return *ready
+}
+
+var _ runtime.Object = &Endpoints{}
+
+// DeepCopyObject implements the ObjectKind interface.
+func (e *Endpoints) DeepCopyObject() runtime.Object {
+	e1 := &Endpoints{
+		Version:   e.Version,
+		Name:      e.Name,
+		Namespace: e.Namespace,
+		Index:     e.Index,
+		Addresses: make([]EndpointAddress, len(e.Addresses)),
+		Ports:     make([]Port, len(e.Ports)),
+	}
+	copy(e1.Addresses, e.Addresses)
+	copy(e1.Ports, e.Ports)
+	return e1
+}
+
+// GetNamespace implements the metav1.Object interface.
+func (e *Endpoints) GetNamespace() string { return e.Namespace }
+
+// SetNamespace implements the metav1.Object interface.
+func (e *Endpoints) SetNamespace(namespace string) {}
+
+// GetName implements the metav1.Object interface.
+func (e *Endpoints) GetName() string { return e.Name }
+
+// SetName implements the metav1.Object interface.
+func (e *Endpoints) SetName(name string) {}
+
+// GetResourceVersion implements the metav1.Object interface.
+func (e *Endpoints) GetResourceVersion() string { return e.Version }
+
+// SetResourceVersion implements the metav1.Object interface.
+func (e *Endpoints) SetResourceVersion(version string) {}
+
+// EndpointsModified checks if the update to an endpoint is something
+// that matters to us or if they are effectively equivalent.
+func EndpointsModified(a, b *Endpoints) bool {
+	if a.Index != b.Index {
+		return true
+	}
+	if !slices.Equal(a.Addresses, b.Addresses) {
+		return true
+	}
+	if !slices.Equal(a.Ports, b.Ports) {
+		return true
+	}
+	return false
+}
diff --git a/osbase/net/dns/kubernetes/object/informer.go b/osbase/net/dns/kubernetes/object/informer.go
new file mode 100644
index 0000000..8ec1f21
--- /dev/null
+++ b/osbase/net/dns/kubernetes/object/informer.go
@@ -0,0 +1,96 @@
+package object
+
+// Taken and modified from the Kubernetes plugin of CoreDNS, under Apache 2.0.
+
+import (
+	"fmt"
+
+	"k8s.io/apimachinery/pkg/api/meta"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+	"k8s.io/client-go/tools/cache"
+)
+
+// KeyFunc works like cache.DeletionHandlingMetaNamespaceKeyFunc
+// but uses format "<name>.<namespace>" instead of "<namespace>/<name>".
+// This makes lookup for a service slightly more efficient, because we can
+// just use a slice of the query name instead of constructing a new string.
+func KeyFunc(obj interface{}) (string, error) {
+	if d, ok := obj.(cache.DeletedFinalStateUnknown); ok {
+		return d.Key, nil
+	}
+	objMeta, err := meta.Accessor(obj)
+	if err != nil {
+		return "", fmt.Errorf("object has no meta: %v", err)
+	}
+	if len(objMeta.GetNamespace()) == 0 {
+		return objMeta.GetName(), nil
+	}
+	return objMeta.GetName() + "." + objMeta.GetNamespace(), nil
+}
+
+// NewIndexerInformer is a copy of the cache.NewIndexerInformer function,
+// but allows custom process function.
+func NewIndexerInformer(lw cache.ListerWatcher, objType runtime.Object, h cache.ResourceEventHandler, indexers cache.Indexers, builder ProcessorBuilder) (cache.Indexer, cache.Controller) {
+	clientState := cache.NewIndexer(KeyFunc, indexers)
+
+	cfg := &cache.Config{
+		Queue:            cache.NewDeltaFIFOWithOptions(cache.DeltaFIFOOptions{KeyFunction: KeyFunc, KnownObjects: clientState}),
+		ListerWatcher:    lw,
+		ObjectType:       objType,
+		FullResyncPeriod: 0,
+		RetryOnError:     false,
+		Process:          builder(clientState, h),
+	}
+	return clientState, cache.New(cfg)
+}
+
+// DefaultProcessor is based on the Process function from
+// cache.NewIndexerInformer except it does a conversion.
+func DefaultProcessor(convert ToFunc) ProcessorBuilder {
+	return func(clientState cache.Indexer, h cache.ResourceEventHandler) cache.ProcessFunc {
+		return func(obj interface{}, isInitialList bool) error {
+			for _, d := range obj.(cache.Deltas) {
+				switch d.Type {
+				case cache.Sync, cache.Added, cache.Updated:
+					metaObj := d.Object.(metav1.Object)
+					obj, err := convert(metaObj)
+					if err != nil {
+						return err
+					}
+					if old, exists, err := clientState.Get(obj); err == nil && exists {
+						if err := clientState.Update(obj); err != nil {
+							return err
+						}
+						h.OnUpdate(old, obj)
+					} else {
+						if err := clientState.Add(obj); err != nil {
+							return err
+						}
+						h.OnAdd(obj, isInitialList)
+					}
+				case cache.Deleted:
+					var obj interface{}
+					obj, ok := d.Object.(cache.DeletedFinalStateUnknown)
+					if !ok {
+						var err error
+						metaObj, ok := d.Object.(metav1.Object)
+						if !ok {
+							return fmt.Errorf("unexpected object %v", d.Object)
+						}
+						obj, err = convert(metaObj)
+						if err != nil {
+							return err
+						}
+					}
+
+					if err := clientState.Delete(obj); err != nil {
+						return err
+					}
+					h.OnDelete(obj)
+				}
+			}
+			return nil
+		}
+	}
+}
diff --git a/osbase/net/dns/kubernetes/object/informer_test.go b/osbase/net/dns/kubernetes/object/informer_test.go
new file mode 100644
index 0000000..68face5
--- /dev/null
+++ b/osbase/net/dns/kubernetes/object/informer_test.go
@@ -0,0 +1,119 @@
+package object
+
+// Taken and modified from the Kubernetes plugin of CoreDNS, under Apache 2.0.
+
+import (
+	"testing"
+
+	api "k8s.io/api/core/v1"
+	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/client-go/tools/cache"
+)
+
+func TestDefaultProcessor(t *testing.T) {
+	pbuild := DefaultProcessor(ToService)
+	reh := cache.ResourceEventHandlerFuncs{}
+	idx := cache.NewIndexer(cache.DeletionHandlingMetaNamespaceKeyFunc, cache.Indexers{})
+	processor := pbuild(idx, reh)
+	testProcessor(t, processor, idx)
+}
+
+func testProcessor(t *testing.T, processor cache.ProcessFunc, idx cache.Indexer) {
+	obj := &api.Service{
+		ObjectMeta: metav1.ObjectMeta{Name: "service1", Namespace: "test1"},
+		Spec: api.ServiceSpec{
+			Type:         api.ServiceTypeExternalName,
+			ExternalName: "example.com.",
+			Ports:        []api.ServicePort{{Port: 80}},
+		},
+	}
+	obj2 := &api.Service{
+		ObjectMeta: metav1.ObjectMeta{Name: "service2", Namespace: "test1"},
+		Spec: api.ServiceSpec{
+			ClusterIP:  "5.6.7.8",
+			ClusterIPs: []string{"5.6.7.8"},
+			Ports:      []api.ServicePort{{Port: 80}},
+		},
+	}
+
+	// Add the objects
+	err := processor(cache.Deltas{
+		{Type: cache.Added, Object: obj.DeepCopy()},
+		{Type: cache.Added, Object: obj2.DeepCopy()},
+	}, false)
+	if err != nil {
+		t.Fatalf("add failed: %v", err)
+	}
+	got, exists, err := idx.Get(obj)
+	if err != nil {
+		t.Fatalf("get added object failed: %v", err)
+	}
+	if !exists {
+		t.Fatal("added object not found in index")
+	}
+	svc, ok := got.(*Service)
+	if !ok {
+		t.Fatal("object in index was incorrect type")
+	}
+	if svc.ExternalName != obj.Spec.ExternalName {
+		t.Fatalf("expected '%v', got '%v'", obj.Spec.ExternalName, svc.ExternalName)
+	}
+
+	// Update an object
+	obj.Spec.ExternalName = "2.example.com."
+	err = processor(cache.Deltas{{
+		Type:   cache.Updated,
+		Object: obj.DeepCopy(),
+	}}, false)
+	if err != nil {
+		t.Fatalf("update failed: %v", err)
+	}
+	got, exists, err = idx.Get(obj)
+	if err != nil {
+		t.Fatalf("get updated object failed: %v", err)
+	}
+	if !exists {
+		t.Fatal("updated object not found in index")
+	}
+	svc, ok = got.(*Service)
+	if !ok {
+		t.Fatal("object in index was incorrect type")
+	}
+	if svc.ExternalName != obj.Spec.ExternalName {
+		t.Fatalf("expected '%v', got '%v'", obj.Spec.ExternalName, svc.ExternalName)
+	}
+
+	// Delete an object
+	err = processor(cache.Deltas{{
+		Type:   cache.Deleted,
+		Object: obj2.DeepCopy(),
+	}}, false)
+	if err != nil {
+		t.Fatalf("delete test failed: %v", err)
+	}
+	_, exists, err = idx.Get(obj2)
+	if err != nil {
+		t.Fatalf("get deleted object failed: %v", err)
+	}
+	if exists {
+		t.Fatal("deleted object found in index")
+	}
+
+	// Delete an object via tombstone
+	key, _ := cache.MetaNamespaceKeyFunc(obj)
+	tombstone := cache.DeletedFinalStateUnknown{Key: key, Obj: svc}
+	err = processor(cache.Deltas{{
+		Type:   cache.Deleted,
+		Object: tombstone,
+	}}, false)
+	if err != nil {
+		t.Fatalf("tombstone delete test failed: %v", err)
+	}
+	_, exists, err = idx.Get(svc)
+	if err != nil {
+		t.Fatalf("get tombstone deleted object failed: %v", err)
+	}
+	if exists {
+		t.Fatal("tombstone deleted object found in index")
+	}
+}
diff --git a/osbase/net/dns/kubernetes/object/namespace.go b/osbase/net/dns/kubernetes/object/namespace.go
new file mode 100644
index 0000000..f7e7e56
--- /dev/null
+++ b/osbase/net/dns/kubernetes/object/namespace.go
@@ -0,0 +1,62 @@
+package object
+
+// Taken and modified from the Kubernetes plugin of CoreDNS, under Apache 2.0.
+
+import (
+	"fmt"
+
+	api "k8s.io/api/core/v1"
+	meta "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// Namespace is a stripped down api.Namespace with only the items we need.
+type Namespace struct {
+	Version string
+	Name    string
+
+	*Empty
+}
+
+// ToNamespace returns a function that converts an api.Namespace to a *Namespace.
+func ToNamespace(obj meta.Object) (meta.Object, error) {
+	ns, ok := obj.(*api.Namespace)
+	if !ok {
+		return nil, fmt.Errorf("unexpected object %v", obj)
+	}
+	n := &Namespace{
+		Version: ns.GetResourceVersion(),
+		Name:    ns.GetName(),
+	}
+	*ns = api.Namespace{}
+	return n, nil
+}
+
+var _ runtime.Object = &Namespace{}
+
+// DeepCopyObject implements the ObjectKind interface.
+func (n *Namespace) DeepCopyObject() runtime.Object {
+	n1 := &Namespace{
+		Version: n.Version,
+		Name:    n.Name,
+	}
+	return n1
+}
+
+// GetNamespace implements the metav1.Object interface.
+func (n *Namespace) GetNamespace() string { return "" }
+
+// SetNamespace implements the metav1.Object interface.
+func (n *Namespace) SetNamespace(namespace string) {}
+
+// GetName implements the metav1.Object interface.
+func (n *Namespace) GetName() string { return n.Name }
+
+// SetName implements the metav1.Object interface.
+func (n *Namespace) SetName(name string) {}
+
+// GetResourceVersion implements the metav1.Object interface.
+func (n *Namespace) GetResourceVersion() string { return n.Version }
+
+// SetResourceVersion implements the metav1.Object interface.
+func (n *Namespace) SetResourceVersion(version string) {}
diff --git a/osbase/net/dns/kubernetes/object/object.go b/osbase/net/dns/kubernetes/object/object.go
new file mode 100644
index 0000000..05724fc
--- /dev/null
+++ b/osbase/net/dns/kubernetes/object/object.go
@@ -0,0 +1,106 @@
+// Package object holds functions that convert the objects from the k8s API in
+// to a more memory efficient structures.
+//
+// Adding new fields to any of the structures defined in pod.go, endpoint.go
+// and service.go should not be done lightly as this increases the memory use
+// and will leads to OOMs in the k8s scale test.
+package object
+
+// Taken and modified from the Kubernetes plugin of CoreDNS, under Apache 2.0.
+
+import (
+	v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/apimachinery/pkg/types"
+	"k8s.io/client-go/tools/cache"
+)
+
+// ToFunc converts one v1.Object to another v1.Object.
+type ToFunc func(v1.Object) (v1.Object, error)
+
+// ProcessorBuilder returns function to process cache events.
+type ProcessorBuilder func(cache.Indexer, cache.ResourceEventHandler) cache.ProcessFunc
+
+// Empty is an empty struct.
+type Empty struct{}
+
+// GetObjectKind implements the ObjectKind interface as a noop.
+func (e *Empty) GetObjectKind() schema.ObjectKind { return schema.EmptyObjectKind }
+
+// GetGenerateName implements the metav1.Object interface.
+func (e *Empty) GetGenerateName() string { return "" }
+
+// SetGenerateName implements the metav1.Object interface.
+func (e *Empty) SetGenerateName(name string) {}
+
+// GetUID implements the metav1.Object interface.
+func (e *Empty) GetUID() types.UID { return "" }
+
+// SetUID implements the metav1.Object interface.
+func (e *Empty) SetUID(uid types.UID) {}
+
+// GetGeneration implements the metav1.Object interface.
+func (e *Empty) GetGeneration() int64 { return 0 }
+
+// SetGeneration implements the metav1.Object interface.
+func (e *Empty) SetGeneration(generation int64) {}
+
+// GetSelfLink implements the metav1.Object interface.
+func (e *Empty) GetSelfLink() string { return "" }
+
+// SetSelfLink implements the metav1.Object interface.
+func (e *Empty) SetSelfLink(selfLink string) {}
+
+// GetCreationTimestamp implements the metav1.Object interface.
+func (e *Empty) GetCreationTimestamp() v1.Time { return v1.Time{} }
+
+// SetCreationTimestamp implements the metav1.Object interface.
+func (e *Empty) SetCreationTimestamp(timestamp v1.Time) {}
+
+// GetDeletionTimestamp implements the metav1.Object interface.
+func (e *Empty) GetDeletionTimestamp() *v1.Time { return &v1.Time{} }
+
+// SetDeletionTimestamp implements the metav1.Object interface.
+func (e *Empty) SetDeletionTimestamp(timestamp *v1.Time) {}
+
+// GetDeletionGracePeriodSeconds implements the metav1.Object interface.
+func (e *Empty) GetDeletionGracePeriodSeconds() *int64 { return nil }
+
+// SetDeletionGracePeriodSeconds implements the metav1.Object interface.
+func (e *Empty) SetDeletionGracePeriodSeconds(*int64) {}
+
+// GetLabels implements the metav1.Object interface.
+func (e *Empty) GetLabels() map[string]string { return nil }
+
+// SetLabels implements the metav1.Object interface.
+func (e *Empty) SetLabels(labels map[string]string) {}
+
+// GetAnnotations implements the metav1.Object interface.
+func (e *Empty) GetAnnotations() map[string]string { return nil }
+
+// SetAnnotations implements the metav1.Object interface.
+func (e *Empty) SetAnnotations(annotations map[string]string) {}
+
+// GetFinalizers implements the metav1.Object interface.
+func (e *Empty) GetFinalizers() []string { return nil }
+
+// SetFinalizers implements the metav1.Object interface.
+func (e *Empty) SetFinalizers(finalizers []string) {}
+
+// GetOwnerReferences implements the metav1.Object interface.
+func (e *Empty) GetOwnerReferences() []v1.OwnerReference { return nil }
+
+// SetOwnerReferences implements the metav1.Object interface.
+func (e *Empty) SetOwnerReferences([]v1.OwnerReference) {}
+
+// GetZZZ_DeprecatedClusterName implements the metav1.Object interface.
+func (e *Empty) GetZZZ_DeprecatedClusterName() string { return "" }
+
+// SetZZZ_DeprecatedClusterName implements the metav1.Object interface.
+func (e *Empty) SetZZZ_DeprecatedClusterName(clusterName string) {}
+
+// GetManagedFields implements the metav1.Object interface.
+func (e *Empty) GetManagedFields() []v1.ManagedFieldsEntry { return nil }
+
+// SetManagedFields implements the metav1.Object interface.
+func (e *Empty) SetManagedFields(managedFields []v1.ManagedFieldsEntry) {}
diff --git a/osbase/net/dns/kubernetes/object/service.go b/osbase/net/dns/kubernetes/object/service.go
new file mode 100644
index 0000000..5a6ca77
--- /dev/null
+++ b/osbase/net/dns/kubernetes/object/service.go
@@ -0,0 +1,144 @@
+package object
+
+// Taken and modified from the Kubernetes plugin of CoreDNS, under Apache 2.0.
+
+import (
+	"fmt"
+	"net/netip"
+	"regexp"
+	"slices"
+	"strings"
+
+	"github.com/miekg/dns"
+	api "k8s.io/api/core/v1"
+	meta "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime"
+)
+
+// Service is a stripped down api.Service with only the items we need.
+type Service struct {
+	Version   string
+	Name      string
+	Namespace string
+	// ClusterIPs contains IP addresses in binary format.
+	ClusterIPs   []string
+	ExternalName string
+	Ports        []Port
+	Headless     bool
+
+	*Empty
+}
+
+var domainNameRegexp = regexp.MustCompile(`^([-a-z0-9]{1,63}\.)+$`)
+
+const ExternalNameInvalid = "."
+
+// ToService converts an api.Service to a *Service.
+func ToService(obj meta.Object) (meta.Object, error) {
+	svc, ok := obj.(*api.Service)
+	if !ok {
+		return nil, fmt.Errorf("unexpected object %v", obj)
+	}
+
+	s := &Service{
+		Version:   svc.GetResourceVersion(),
+		Name:      svc.GetName(),
+		Namespace: svc.GetNamespace(),
+	}
+
+	if svc.Spec.Type == api.ServiceTypeExternalName {
+		// Make the name fully qualified.
+		externalName := dns.Fqdn(svc.Spec.ExternalName)
+		// Check if the name is valid. Even names that pass Kubernetes validation
+		// can fail this check, because Kubernetes does not validate that labels
+		// must be at most 63 characters.
+		if !domainNameRegexp.MatchString(externalName) || len(externalName) > 254 {
+			externalName = ExternalNameInvalid
+		}
+		s.ExternalName = externalName
+	} else {
+		if svc.Spec.ClusterIP == api.ClusterIPNone {
+			s.Headless = true
+		} else {
+			s.ClusterIPs = make([]string, 0, len(svc.Spec.ClusterIPs))
+			for _, rawIP := range svc.Spec.ClusterIPs {
+				parsedIP, err := netip.ParseAddr(rawIP)
+				if err != nil || parsedIP.Zone() != "" {
+					continue
+				}
+				parsedIP = parsedIP.Unmap()
+				s.ClusterIPs = append(s.ClusterIPs, string(parsedIP.AsSlice()))
+			}
+
+			s.Ports = make([]Port, 0, len(svc.Spec.Ports))
+			for _, p := range svc.Spec.Ports {
+				if p.Port >= 1 && p.Port <= 0xffff && p.Name != "" {
+					ep := Port{
+						Port:     uint16(p.Port),
+						Name:     strings.ToLower(p.Name),
+						Protocol: strings.ToLower(string(p.Protocol)),
+					}
+					s.Ports = append(s.Ports, ep)
+				}
+			}
+		}
+	}
+
+	*svc = api.Service{}
+
+	return s, nil
+}
+
+var _ runtime.Object = &Service{}
+
+// DeepCopyObject implements the ObjectKind interface.
+func (s *Service) DeepCopyObject() runtime.Object {
+	s1 := &Service{
+		Version:      s.Version,
+		Name:         s.Name,
+		Namespace:    s.Namespace,
+		ClusterIPs:   make([]string, len(s.ClusterIPs)),
+		ExternalName: s.ExternalName,
+		Ports:        make([]Port, len(s.Ports)),
+		Headless:     s.Headless,
+	}
+	copy(s1.ClusterIPs, s.ClusterIPs)
+	copy(s1.Ports, s.Ports)
+	return s1
+}
+
+// GetNamespace implements the metav1.Object interface.
+func (s *Service) GetNamespace() string { return s.Namespace }
+
+// SetNamespace implements the metav1.Object interface.
+func (s *Service) SetNamespace(namespace string) {}
+
+// GetName implements the metav1.Object interface.
+func (s *Service) GetName() string { return s.Name }
+
+// SetName implements the metav1.Object interface.
+func (s *Service) SetName(name string) {}
+
+// GetResourceVersion implements the metav1.Object interface.
+func (s *Service) GetResourceVersion() string { return s.Version }
+
+// SetResourceVersion implements the metav1.Object interface.
+func (s *Service) SetResourceVersion(version string) {}
+
+// ServiceModified checks if the update to a service is something
+// that matters to us or if they are effectively equivalent.
+func ServiceModified(oldSvc, newSvc *Service) bool {
+	if oldSvc.ExternalName != newSvc.ExternalName {
+		return true
+	}
+	if oldSvc.Headless != newSvc.Headless {
+		return true
+	}
+	if !slices.Equal(oldSvc.ClusterIPs, newSvc.ClusterIPs) {
+		return true
+	}
+	if !slices.Equal(oldSvc.Ports, newSvc.Ports) {
+		return true
+	}
+	return false
+}
