Skip to content

Commit a6d8851

Browse files
Merge pull request #2014 from vyzigold/prometheus-mtls
Generate and configure Prometheus client certs
2 parents fff4536 + 4072510 commit a6d8851

1 file changed

Lines changed: 49 additions & 3 deletions

File tree

internal/openstack/telemetry.go

Lines changed: 49 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@ import (
44
"context"
55
"fmt"
66

7+
certmgrv1 "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
8+
"github.com/openstack-k8s-operators/lib-common/modules/certmanager"
79
"github.com/openstack-k8s-operators/lib-common/modules/common"
10+
"github.com/openstack-k8s-operators/lib-common/modules/common/clusterdns"
811
"github.com/openstack-k8s-operators/lib-common/modules/common/condition"
912
"github.com/openstack-k8s-operators/lib-common/modules/common/helper"
1013
"github.com/openstack-k8s-operators/lib-common/modules/common/service"
@@ -29,6 +32,7 @@ const (
2932

3033
// ReconcileTelemetry puts telemetry resources to required state
3134
func ReconcileTelemetry(ctx context.Context, instance *corev1beta1.OpenStackControlPlane, version *corev1beta1.OpenStackVersion, helper *helper.Helper) (ctrl.Result, error) {
35+
Log := helper.GetLogger()
3236
telemetry := &telemetryv1.Telemetry{
3337
ObjectMeta: metav1.ObjectMeta{
3438
Name: telemetryName,
@@ -273,6 +277,7 @@ func ReconcileTelemetry(ctx context.Context, instance *corev1beta1.OpenStackCont
273277
instance.Spec.Telemetry.Template.Autoscaling.Aodh.TLS = telemetry.Spec.Autoscaling.Aodh.TLS
274278
instance.Spec.Telemetry.Template.MetricStorage.PrometheusTLS = telemetry.Spec.MetricStorage.PrometheusTLS
275279
instance.Spec.Telemetry.Template.MetricStorage.AlertmanagerTLS = telemetry.Spec.MetricStorage.AlertmanagerTLS
280+
instance.Spec.Telemetry.Template.MetricStorage.PrometheusClientCertSecret = telemetry.Spec.MetricStorage.PrometheusClientCertSecret
276281
instance.Spec.Telemetry.Template.Ceilometer.TLS = telemetry.Spec.Ceilometer.TLS
277282
instance.Spec.Telemetry.Template.Ceilometer.MysqldExporterTLS = telemetry.Spec.Ceilometer.MysqldExporterTLS
278283
instance.Spec.Telemetry.Template.Ceilometer.KSMTLS = telemetry.Spec.Ceilometer.KSMTLS
@@ -442,6 +447,47 @@ func ReconcileTelemetry(ctx context.Context, instance *corev1beta1.OpenStackCont
442447
// update TLS settings with cert secret
443448
instance.Spec.Telemetry.Template.MetricStorage.PrometheusTLS.SecretName = prometheusEndpointDetails.GetEndptCertSecret(service.EndpointInternal)
444449

450+
// Generate Prometheus client certificate for scraping metrics from TLS-enabled endpoints
451+
if instance.Spec.TLS.PodLevel.Enabled {
452+
if promSvc, ok := prometheusEndpointDetails.EndpointDetails[service.EndpointInternal]; ok {
453+
Log.Info("Reconciling Prometheus client certificate", telemetryNamespaceLabel, instance.Namespace)
454+
clusterDomain := clusterdns.GetDNSClusterDomain()
455+
certRequest := certmanager.CertificateRequest{
456+
IssuerName: instance.GetInternalIssuer(),
457+
CertName: fmt.Sprintf("%s-client", promSvc.Name),
458+
Hostnames: []string{
459+
fmt.Sprintf("*.%s.svc", instance.Namespace),
460+
fmt.Sprintf("*.%s.svc.%s", instance.Namespace, clusterDomain),
461+
},
462+
Usages: []certmgrv1.KeyUsage{
463+
certmgrv1.UsageKeyEncipherment,
464+
certmgrv1.UsageDigitalSignature,
465+
certmgrv1.UsageClientAuth,
466+
},
467+
Labels: map[string]string{ServiceCertSelector: ""},
468+
}
469+
if instance.Spec.TLS.PodLevel.Internal.Cert.Duration != nil {
470+
certRequest.Duration = &instance.Spec.TLS.PodLevel.Internal.Cert.Duration.Duration
471+
}
472+
if instance.Spec.TLS.PodLevel.Internal.Cert.RenewBefore != nil {
473+
certRequest.RenewBefore = &instance.Spec.TLS.PodLevel.Internal.Cert.RenewBefore.Duration
474+
}
475+
certSecret, ctrlResult, err := certmanager.EnsureCert(
476+
ctx,
477+
helper,
478+
certRequest,
479+
nil)
480+
if err != nil {
481+
return ctrlResult, err
482+
} else if (ctrlResult != ctrl.Result{}) {
483+
return ctrlResult, nil
484+
}
485+
instance.Spec.Telemetry.Template.MetricStorage.PrometheusClientCertSecret.SecretName = &certSecret.Name
486+
} else {
487+
Log.Info("Prometheus internal endpoint not found, skipping client certificate generation", telemetryNamespaceLabel, instance.Namespace)
488+
}
489+
}
490+
445491
// EnsureEndpoint for alertmanager
446492
// NOTE: We don't manage the alertmanager service, it's managed by COO, we just annotate it
447493
alertmanagerEndpointDetails, ctrlResult, err := EnsureEndpointConfig(
@@ -539,7 +585,7 @@ func ReconcileTelemetry(ctx context.Context, instance *corev1beta1.OpenStackCont
539585
instance.Spec.Telemetry.Template.Ceilometer.KSMTLS.SecretName = ksmEpDetails.GetEndptCertSecret(service.EndpointInternal)
540586
}
541587

542-
helper.GetLogger().Info("Reconciling Telemetry", telemetryNamespaceLabel, instance.Namespace, telemetryNameLabel, telemetryName)
588+
Log.Info("Reconciling Telemetry", telemetryNamespaceLabel, instance.Namespace, telemetryNameLabel, telemetryName)
543589
op, err := controllerutil.CreateOrPatch(ctx, helper.GetClient(), telemetry, func() error {
544590
instance.Spec.Telemetry.Template.TelemetrySpecBase.DeepCopyInto(&telemetry.Spec.TelemetrySpecBase)
545591
instance.Spec.Telemetry.Template.Autoscaling.AutoscalingSpecBase.DeepCopyInto(&telemetry.Spec.Autoscaling.AutoscalingSpecBase)
@@ -639,11 +685,11 @@ func ReconcileTelemetry(ctx context.Context, instance *corev1beta1.OpenStackCont
639685
return ctrl.Result{}, err
640686
}
641687
if op != controllerutil.OperationResultNone {
642-
helper.GetLogger().Info(fmt.Sprintf("%s %s - %s", telemetryName, telemetry.Name, op))
688+
Log.Info(fmt.Sprintf("%s %s - %s", telemetryName, telemetry.Name, op))
643689
}
644690

645691
if telemetry.Status.ObservedGeneration == telemetry.Generation && telemetry.IsReady() {
646-
helper.GetLogger().Info("Telemetry ready condition is true")
692+
Log.Info("Telemetry ready condition is true")
647693
instance.Status.ContainerImages.CeilometerCentralImage = version.Status.ContainerImages.CeilometerCentralImage
648694
instance.Status.ContainerImages.CeilometerComputeImage = version.Status.ContainerImages.CeilometerComputeImage
649695
instance.Status.ContainerImages.CeilometerIpmiImage = version.Status.ContainerImages.CeilometerIpmiImage

0 commit comments

Comments
 (0)