mirror of
https://github.com/coredns/coredns.git
synced 2025-10-27 16:24:19 -04:00
kubernetes: add multicluster support (#7266)
* kubernetes: add multicluster support Add multicluster support via Multi-Cluster Services API (MCS-API) via a new option `multiclusterZones` in the kubernetes plugin. When some multicluster zones are passed to the kubernetes plugin, it will start watching the ServiceImport objects and its associated EndpointSlices. Signed-off-by: Arthur Outhenin-Chalandre <arthur@cri.epita.fr> * kubernetes: implement xfr support for multicluster zones Signed-off-by: Arthur Outhenin-Chalandre <arthur@cri.epita.fr> --------- Signed-off-by: Arthur Outhenin-Chalandre <arthur@cri.epita.fr>
This commit is contained in:
committed by
GitHub
parent
76b199f829
commit
5c71bd0b87
95
plugin/kubernetes/object/serviceimport.go
Normal file
95
plugin/kubernetes/object/serviceimport.go
Normal file
@@ -0,0 +1,95 @@
|
||||
package object
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
meta "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
mcs "sigs.k8s.io/mcs-api/pkg/apis/v1alpha1"
|
||||
)
|
||||
|
||||
// ServiceImport is a stripped down api.ServiceImport with only the items we need for CoreDNS.
|
||||
type ServiceImport struct {
|
||||
Version string
|
||||
Name string
|
||||
Namespace string
|
||||
Index string
|
||||
ClusterIPs []string
|
||||
Type mcs.ServiceImportType
|
||||
Ports []mcs.ServicePort
|
||||
|
||||
*Empty
|
||||
}
|
||||
|
||||
// ServiceImportKey returns a string using for the index.
|
||||
func ServiceImportKey(name, namespace string) string { return name + "." + namespace }
|
||||
|
||||
// ToServiceImport converts an v1alpha1.ServiceImport to a *ServiceImport.
|
||||
func ToServiceImport(obj meta.Object) (meta.Object, error) {
|
||||
svc, ok := obj.(*mcs.ServiceImport)
|
||||
|
||||
if !ok {
|
||||
return nil, fmt.Errorf("unexpected object %v", obj)
|
||||
}
|
||||
s := &ServiceImport{
|
||||
Version: svc.GetResourceVersion(),
|
||||
Name: svc.GetName(),
|
||||
Namespace: svc.GetNamespace(),
|
||||
Index: ServiceImportKey(svc.GetName(), svc.GetNamespace()),
|
||||
Type: svc.Spec.Type,
|
||||
}
|
||||
|
||||
if len(svc.Spec.IPs) > 0 {
|
||||
s.ClusterIPs = make([]string, len(svc.Spec.IPs))
|
||||
copy(s.ClusterIPs, svc.Spec.IPs)
|
||||
}
|
||||
|
||||
if len(svc.Spec.Ports) > 0 {
|
||||
s.Ports = make([]mcs.ServicePort, len(svc.Spec.Ports))
|
||||
copy(s.Ports, svc.Spec.Ports)
|
||||
}
|
||||
|
||||
*svc = mcs.ServiceImport{}
|
||||
return s, nil
|
||||
}
|
||||
|
||||
var _ runtime.Object = &ServiceImport{}
|
||||
|
||||
// Headless returns true if the service is headless
|
||||
func (s *ServiceImport) Headless() bool {
|
||||
return s.Type == mcs.Headless
|
||||
}
|
||||
|
||||
// DeepCopyObject implements the ObjectKind interface.
|
||||
func (s *ServiceImport) DeepCopyObject() runtime.Object {
|
||||
s1 := &ServiceImport{
|
||||
Version: s.Version,
|
||||
Name: s.Name,
|
||||
Namespace: s.Namespace,
|
||||
Index: s.Index,
|
||||
Type: s.Type,
|
||||
ClusterIPs: make([]string, len(s.ClusterIPs)),
|
||||
Ports: make([]mcs.ServicePort, len(s.Ports)),
|
||||
}
|
||||
copy(s1.ClusterIPs, s.ClusterIPs)
|
||||
copy(s1.Ports, s.Ports)
|
||||
return s1
|
||||
}
|
||||
|
||||
// GetNamespace implements the metav1.Object interface.
|
||||
func (s *ServiceImport) GetNamespace() string { return s.Namespace }
|
||||
|
||||
// SetNamespace implements the metav1.Object interface.
|
||||
func (s *ServiceImport) SetNamespace(namespace string) {}
|
||||
|
||||
// GetName implements the metav1.Object interface.
|
||||
func (s *ServiceImport) GetName() string { return s.Name }
|
||||
|
||||
// SetName implements the metav1.Object interface.
|
||||
func (s *ServiceImport) SetName(name string) {}
|
||||
|
||||
// GetResourceVersion implements the metav1.Object interface.
|
||||
func (s *ServiceImport) GetResourceVersion() string { return s.Version }
|
||||
|
||||
// SetResourceVersion implements the metav1.Object interface.
|
||||
func (s *ServiceImport) SetResourceVersion(version string) {}
|
||||
Reference in New Issue
Block a user