Skip to content

Commit 4072510

Browse files
committed
Generate and configure Prometheus client certs
When TLS and metricStorage are enabled, generate client certificate for Prometheus. This will later be used by Prometheus to access metric exporters which require client certificates. jira: https://redhat.atlassian.net/browse/OSPRH-33208 Depends-On: openstack-k8s-operators/telemetry-operator#976 Generated-By: Claude-Code claude-opus-4-6
1 parent a759b85 commit 4072510

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)