From dec7a61147e482eb693b68f17ddfe56e9c865fa3 Mon Sep 17 00:00:00 2001 From: lamai93 Date: Mon, 13 May 2019 16:12:37 +0200 Subject: [PATCH 1/2] Create headless service for exporter pods. --- .../deployment/v1alpha/deployment_status.go | 2 + pkg/deployment/resources/services.go | 17 +++++++- pkg/util/k8sutil/services.go | 41 ++++++++++++++++++- pkg/util/k8sutil/util.go | 16 ++++++++ 4 files changed, 74 insertions(+), 2 deletions(-) diff --git a/pkg/apis/deployment/v1alpha/deployment_status.go b/pkg/apis/deployment/v1alpha/deployment_status.go index 632a41658..56f34ad54 100644 --- a/pkg/apis/deployment/v1alpha/deployment_status.go +++ b/pkg/apis/deployment/v1alpha/deployment_status.go @@ -38,6 +38,8 @@ type DeploymentStatus struct { // to access syncmasters (only set when dc2dc synchronization is enabled). SyncServiceName string `json:"syncServiceName,omitempty"` + ExporterServiceName string `json:"exporterServiceName,omitempty"` + // Images holds a list of ArangoDB images with their ID and ArangoDB version. Images ImageInfoList `json:"arangodb-images,omitempty"` // Image that is currently being used when new pods are created diff --git a/pkg/deployment/resources/services.go b/pkg/deployment/resources/services.go index 26842a05a..d2134c7f2 100644 --- a/pkg/deployment/resources/services.go +++ b/pkg/deployment/resources/services.go @@ -25,7 +25,7 @@ package resources import ( "time" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1alpha" @@ -117,6 +117,21 @@ func (r *Resources) EnsureServices() error { } } } + + if spec.Metrics.IsEnabled() { + name, _, err := k8sutil.CreateExporterService(svcs, apiObject, apiObject.AsOwner()) + if err != nil { + log.Debug().Err(err).Msgf("Failed to create %s exporter service", name) + return maskAny(err) + } + status, lastVersion := r.context.GetStatus() + if status.ExporterServiceName != name { + status.ExporterServiceName = name + if err := r.context.UpdateStatus(status, lastVersion); err != nil { + return maskAny(err) + } + } + } return nil } diff --git a/pkg/util/k8sutil/services.go b/pkg/util/k8sutil/services.go index bc07ef086..cf0e30e10 100644 --- a/pkg/util/k8sutil/services.go +++ b/pkg/util/k8sutil/services.go @@ -29,7 +29,7 @@ import ( "strconv" "strings" - "k8s.io/api/core/v1" + v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -64,6 +64,45 @@ func CreateSyncMasterClientServiceName(deploymentName string) string { return deploymentName + "-sync" } +// CreateExporterClientServiceName returns the name of the service used by arangodb-exporter clients for the given +// deployment name. +func CreateExporterClientServiceName(deploymentName string) string { + return deploymentName + "-exporter" +} + +// CreateExporterService +func CreateExporterService(svcs ServiceInterface, deployment metav1.Object, owner metav1.OwnerReference) (string, bool, error) { + deploymentName := deployment.GetName() + svcName := CreateExporterClientServiceName(deploymentName) + + selectorLabels := LabelsForExporterServiceSelector(deploymentName) + + svc := &v1.Service{ + ObjectMeta: metav1.ObjectMeta{ + Name: svcName, + Labels: LabelsForExporterService(deploymentName), + }, + Spec: v1.ServiceSpec{ + ClusterIP: v1.ClusterIPNone, + Ports: []v1.ServicePort{ + v1.ServicePort{ + Name: "exporter", + Protocol: v1.ProtocolTCP, + Port: ArangoExporterPort, + }, + }, + Selector: selectorLabels, + }, + } + addOwnerRefToObject(svc.GetObjectMeta(), &owner) + if _, err := svcs.Create(svc); IsAlreadyExists(err) { + return svcName, false, nil + } else if err != nil { + return svcName, false, maskAny(err) + } + return svcName, true, nil +} + // CreateHeadlessService prepares and creates a headless service in k8s, used to provide a stable // DNS name for all pods. // If the service already exists, nil is returned. diff --git a/pkg/util/k8sutil/util.go b/pkg/util/k8sutil/util.go index 0e6f94576..0ac079557 100644 --- a/pkg/util/k8sutil/util.go +++ b/pkg/util/k8sutil/util.go @@ -50,6 +50,22 @@ func addOwnerRefToObject(obj metav1.Object, ownerRef *metav1.OwnerReference) { } } +// LabelsForExporterServiceSelector returns a map of labels, used to select the all arangodb-exporter containers +func LabelsForExporterServiceSelector(deploymentName string) map[string]string { + return map[string]string{ + LabelKeyArangoDeployment: deploymentName, + LabelKeyArangoExporter: "yes", + } +} + +// LabelsForExporterService returns a map of labels, used to select the all arangodb-exporter containers +func LabelsForExporterService(deploymentName string) map[string]string { + return map[string]string{ + LabelKeyArangoDeployment: deploymentName, + LabelKeyApp: AppName, + } +} + // LabelsForDeployment returns a map of labels, given to all resources for given deployment name func LabelsForDeployment(deploymentName, role string) map[string]string { l := map[string]string{ From 2270b3e07e5f19528ae801191540f3becab8375f Mon Sep 17 00:00:00 2001 From: lamai93 Date: Mon, 13 May 2019 16:22:04 +0200 Subject: [PATCH 2/2] Fixed wrong exporter service name in status. --- pkg/apis/deployment/v1alpha/deployment_status.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/apis/deployment/v1alpha/deployment_status.go b/pkg/apis/deployment/v1alpha/deployment_status.go index 56f34ad54..5ef925d34 100644 --- a/pkg/apis/deployment/v1alpha/deployment_status.go +++ b/pkg/apis/deployment/v1alpha/deployment_status.go @@ -71,6 +71,7 @@ func (ds *DeploymentStatus) Equal(other DeploymentStatus) bool { ds.Reason == other.Reason && ds.ServiceName == other.ServiceName && ds.SyncServiceName == other.SyncServiceName && + ds.ExporterServiceName == other.ExporterServiceName && ds.Images.Equal(other.Images) && ds.CurrentImage.Equal(other.CurrentImage) && ds.Members.Equal(other.Members) &&