Skip to content

Commit a8bcd24

Browse files
authored
Merge pull request #385 from arangodb/bug-fix/arangodb-exporter-fixes
Create headless service for exporter pods.
2 parents cc06bf2 + 2270b3e commit a8bcd24

File tree

4 files changed

+75
-2
lines changed

4 files changed

+75
-2
lines changed

pkg/apis/deployment/v1alpha/deployment_status.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ type DeploymentStatus struct {
3838
// to access syncmasters (only set when dc2dc synchronization is enabled).
3939
SyncServiceName string `json:"syncServiceName,omitempty"`
4040

41+
ExporterServiceName string `json:"exporterServiceName,omitempty"`
42+
4143
// Images holds a list of ArangoDB images with their ID and ArangoDB version.
4244
Images ImageInfoList `json:"arangodb-images,omitempty"`
4345
// Image that is currently being used when new pods are created
@@ -69,6 +71,7 @@ func (ds *DeploymentStatus) Equal(other DeploymentStatus) bool {
6971
ds.Reason == other.Reason &&
7072
ds.ServiceName == other.ServiceName &&
7173
ds.SyncServiceName == other.SyncServiceName &&
74+
ds.ExporterServiceName == other.ExporterServiceName &&
7275
ds.Images.Equal(other.Images) &&
7376
ds.CurrentImage.Equal(other.CurrentImage) &&
7477
ds.Members.Equal(other.Members) &&

pkg/deployment/resources/services.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ package resources
2525
import (
2626
"time"
2727

28-
"k8s.io/api/core/v1"
28+
v1 "k8s.io/api/core/v1"
2929
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3030

3131
api "github.com/arangodb/kube-arangodb/pkg/apis/deployment/v1alpha"
@@ -117,6 +117,21 @@ func (r *Resources) EnsureServices() error {
117117
}
118118
}
119119
}
120+
121+
if spec.Metrics.IsEnabled() {
122+
name, _, err := k8sutil.CreateExporterService(svcs, apiObject, apiObject.AsOwner())
123+
if err != nil {
124+
log.Debug().Err(err).Msgf("Failed to create %s exporter service", name)
125+
return maskAny(err)
126+
}
127+
status, lastVersion := r.context.GetStatus()
128+
if status.ExporterServiceName != name {
129+
status.ExporterServiceName = name
130+
if err := r.context.UpdateStatus(status, lastVersion); err != nil {
131+
return maskAny(err)
132+
}
133+
}
134+
}
120135
return nil
121136
}
122137

pkg/util/k8sutil/services.go

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import (
2929
"strconv"
3030
"strings"
3131

32-
"k8s.io/api/core/v1"
32+
v1 "k8s.io/api/core/v1"
3333
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3434
)
3535

@@ -64,6 +64,45 @@ func CreateSyncMasterClientServiceName(deploymentName string) string {
6464
return deploymentName + "-sync"
6565
}
6666

67+
// CreateExporterClientServiceName returns the name of the service used by arangodb-exporter clients for the given
68+
// deployment name.
69+
func CreateExporterClientServiceName(deploymentName string) string {
70+
return deploymentName + "-exporter"
71+
}
72+
73+
// CreateExporterService
74+
func CreateExporterService(svcs ServiceInterface, deployment metav1.Object, owner metav1.OwnerReference) (string, bool, error) {
75+
deploymentName := deployment.GetName()
76+
svcName := CreateExporterClientServiceName(deploymentName)
77+
78+
selectorLabels := LabelsForExporterServiceSelector(deploymentName)
79+
80+
svc := &v1.Service{
81+
ObjectMeta: metav1.ObjectMeta{
82+
Name: svcName,
83+
Labels: LabelsForExporterService(deploymentName),
84+
},
85+
Spec: v1.ServiceSpec{
86+
ClusterIP: v1.ClusterIPNone,
87+
Ports: []v1.ServicePort{
88+
v1.ServicePort{
89+
Name: "exporter",
90+
Protocol: v1.ProtocolTCP,
91+
Port: ArangoExporterPort,
92+
},
93+
},
94+
Selector: selectorLabels,
95+
},
96+
}
97+
addOwnerRefToObject(svc.GetObjectMeta(), &owner)
98+
if _, err := svcs.Create(svc); IsAlreadyExists(err) {
99+
return svcName, false, nil
100+
} else if err != nil {
101+
return svcName, false, maskAny(err)
102+
}
103+
return svcName, true, nil
104+
}
105+
67106
// CreateHeadlessService prepares and creates a headless service in k8s, used to provide a stable
68107
// DNS name for all pods.
69108
// If the service already exists, nil is returned.

pkg/util/k8sutil/util.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,22 @@ func addOwnerRefToObject(obj metav1.Object, ownerRef *metav1.OwnerReference) {
5050
}
5151
}
5252

53+
// LabelsForExporterServiceSelector returns a map of labels, used to select the all arangodb-exporter containers
54+
func LabelsForExporterServiceSelector(deploymentName string) map[string]string {
55+
return map[string]string{
56+
LabelKeyArangoDeployment: deploymentName,
57+
LabelKeyArangoExporter: "yes",
58+
}
59+
}
60+
61+
// LabelsForExporterService returns a map of labels, used to select the all arangodb-exporter containers
62+
func LabelsForExporterService(deploymentName string) map[string]string {
63+
return map[string]string{
64+
LabelKeyArangoDeployment: deploymentName,
65+
LabelKeyApp: AppName,
66+
}
67+
}
68+
5369
// LabelsForDeployment returns a map of labels, given to all resources for given deployment name
5470
func LabelsForDeployment(deploymentName, role string) map[string]string {
5571
l := map[string]string{

0 commit comments

Comments
 (0)