operator: Support TLS enabled lokistack-gateway (Kubernetes native) (#6478)

pull/6516/head
Mohamed-Amine Bouqsimi 4 years ago committed by GitHub
parent 74327e5374
commit 4c90d57e68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 1
      operator/CHANGELOG.md
  2. 1
      operator/apis/config/v1/projectconfig_types.go
  3. 1
      operator/bundle/manifests/loki-operator-manager-config_v1_configmap.yaml
  4. 1
      operator/cmd/loki-broker/main.go
  5. 2
      operator/config/crd/bases/config.grafana.com_projectconfigs.yaml
  6. 1
      operator/config/overlays/openshift/controller_manager_config.yaml
  7. 2
      operator/docs/howto_connect_grafana.md
  8. 77
      operator/internal/manifests/build_test.go
  9. 8
      operator/internal/manifests/compactor.go
  10. 8
      operator/internal/manifests/distributor.go
  11. 2
      operator/internal/manifests/gateway.go
  12. 2
      operator/internal/manifests/gateway_tenants.go
  13. 3
      operator/internal/manifests/gateway_tenants_test.go
  14. 8
      operator/internal/manifests/indexgateway.go
  15. 8
      operator/internal/manifests/ingester.go
  16. 2
      operator/internal/manifests/openshift/configure.go
  17. 1
      operator/internal/manifests/options.go
  18. 8
      operator/internal/manifests/querier.go
  19. 8
      operator/internal/manifests/query-frontend.go
  20. 8
      operator/internal/manifests/ruler.go
  21. 58
      operator/internal/manifests/service.go
  22. 64
      operator/internal/manifests/service_monitor.go
  23. 6
      operator/main.go

@ -1,5 +1,6 @@
## Main ## Main
- [6411](https://github.com/grafana/loki/pull/6478) **aminesnow**: Support TLS enabled lokistack-gateway for vanilla kubernetes deployments
- [6504](https://github.com/grafana/loki/pull/6504) **periklis**: Disable usage report on OpenShift - [6504](https://github.com/grafana/loki/pull/6504) **periklis**: Disable usage report on OpenShift
- [6411](https://github.com/grafana/loki/pull/6411) **Red-GV**: Extend schema validation in LokiStack webhook - [6411](https://github.com/grafana/loki/pull/6411) **Red-GV**: Extend schema validation in LokiStack webhook
- [6334](https://github.com/grafana/loki/pull/6433) **periklis**: Move operator cli flags to component config - [6334](https://github.com/grafana/loki/pull/6433) **periklis**: Move operator cli flags to component config

@ -9,6 +9,7 @@ import (
type FeatureFlags struct { type FeatureFlags struct {
EnableCertificateSigningService bool `json:"enableCertSigningService,omitempty"` EnableCertificateSigningService bool `json:"enableCertSigningService,omitempty"`
EnableServiceMonitors bool `json:"enableServiceMonitors,omitempty"` EnableServiceMonitors bool `json:"enableServiceMonitors,omitempty"`
EnableTLSHTTPServices bool `json:"enableTlsHttpServices,omitempty"`
EnableTLSServiceMonitorConfig bool `json:"enableTlsServiceMonitorConfig,omitempty"` EnableTLSServiceMonitorConfig bool `json:"enableTlsServiceMonitorConfig,omitempty"`
EnableTLSGRPCServices bool `json:"enableTlsGrpcServices,omitempty"` EnableTLSGRPCServices bool `json:"enableTlsGrpcServices,omitempty"`
EnablePrometheusAlerts bool `json:"enableLokiStackAlerts,omitempty"` EnablePrometheusAlerts bool `json:"enableLokiStackAlerts,omitempty"`

@ -18,6 +18,7 @@ data:
enableCertSigningService: true enableCertSigningService: true
enableServiceMonitors: true enableServiceMonitors: true
enableTlsServiceMonitorConfig: true enableTlsServiceMonitorConfig: true
enableTlsHttpServices: true
enableTlsGRPCServices: true enableTlsGRPCServices: true
enableLokiStackAlerts: true enableLokiStackAlerts: true
enableLokiStackGateway: true enableLokiStackGateway: true

@ -38,6 +38,7 @@ func (c *config) registerFlags(f *flag.FlagSet) {
c.featureFlags = manifests.FeatureFlags{} c.featureFlags = manifests.FeatureFlags{}
f.BoolVar(&c.featureFlags.EnableCertificateSigningService, "with-cert-signing-service", false, "Enable usage of cert-signing service for scraping prometheus metrics via TLS.") f.BoolVar(&c.featureFlags.EnableCertificateSigningService, "with-cert-signing-service", false, "Enable usage of cert-signing service for scraping prometheus metrics via TLS.")
f.BoolVar(&c.featureFlags.EnableServiceMonitors, "with-service-monitors", false, "Enable service monitors for all LokiStack components.") f.BoolVar(&c.featureFlags.EnableServiceMonitors, "with-service-monitors", false, "Enable service monitors for all LokiStack components.")
f.BoolVar(&c.featureFlags.EnableTLSHTTPServices, "with-http-tls-services", false, "Enables TLS for lokistack-gateway.")
f.BoolVar(&c.featureFlags.EnableTLSServiceMonitorConfig, "with-tls-service-monitors", false, "Enable TLS endpoint for service monitors.") f.BoolVar(&c.featureFlags.EnableTLSServiceMonitorConfig, "with-tls-service-monitors", false, "Enable TLS endpoint for service monitors.")
f.BoolVar(&c.featureFlags.EnablePrometheusAlerts, "with-prometheus-alerts", false, "Enables prometheus alerts") f.BoolVar(&c.featureFlags.EnablePrometheusAlerts, "with-prometheus-alerts", false, "Enables prometheus alerts")
f.BoolVar(&c.featureFlags.EnableGateway, "with-lokistack-gateway", false, "Enables the manifest creation for the entire lokistack-gateway.") f.BoolVar(&c.featureFlags.EnableGateway, "with-lokistack-gateway", false, "Enables the manifest creation for the entire lokistack-gateway.")

@ -78,6 +78,8 @@ spec:
type: boolean type: boolean
enableTlsServiceMonitorConfig: enableTlsServiceMonitorConfig:
type: boolean type: boolean
enableTlsHttpServices:
type: boolean
type: object type: object
gracefulShutDown: gracefulShutDown:
description: GracefulShutdownTimeout is the duration given to runnable description: GracefulShutdownTimeout is the duration given to runnable

@ -15,6 +15,7 @@ featureFlags:
enableCertSigningService: true enableCertSigningService: true
enableServiceMonitors: true enableServiceMonitors: true
enableTlsServiceMonitorConfig: true enableTlsServiceMonitorConfig: true
enableTlsHttpServices: true
enableTlsGRPCServices: true enableTlsGRPCServices: true
enableLokiStackAlerts: true enableLokiStackAlerts: true
enableLokiStackGateway: true enableLokiStackGateway: true

@ -67,7 +67,7 @@ datasources:
httpHeaderValue1: ${LOKI_TENANT_ID} httpHeaderValue1: ${LOKI_TENANT_ID}
``` ```
If the operator was started with the `--with-tls-service-monitors` option, then the protocol used to access the service needs to be set to `https` and, depending on the used certificate another option needs to be added to the `jsonData`: `tlsSkipVerify: true` If the operator was started with the `--with-http-tls-services` option, then the protocol used to access the service needs to be set to `https` and, depending on the used certificate another option needs to be added to the `jsonData`: `tlsSkipVerify: true`
The values for the variables used in the configuration file depend on the Lokistack deployment and which Loki tenant needs to be accessed. The values for the variables used in the configuration file depend on the Lokistack deployment and which Loki tenant needs to be accessed.

@ -219,6 +219,80 @@ func TestBuildAll_WithFeatureFlags_EnableCertificateSigningService(t *testing.T)
} }
} }
func TestBuildAll_WithFeatureFlags_EnableTLSHTTPServices(t *testing.T) {
opts := Options{
Name: "test",
Namespace: "test",
Stack: lokiv1beta1.LokiStackSpec{
Size: lokiv1beta1.SizeOneXSmall,
Rules: &lokiv1beta1.RulesSpec{
Enabled: true,
},
},
Flags: FeatureFlags{
EnableTLSHTTPServices: true,
},
}
err := ApplyDefaultSettings(&opts)
require.NoError(t, err)
objects, buildErr := BuildAll(opts)
require.NoError(t, buildErr)
for _, obj := range objects {
var (
name string
vs []corev1.Volume
vms []corev1.VolumeMount
args []string
rps corev1.URIScheme
lps corev1.URIScheme
)
switch o := obj.(type) {
case *appsv1.Deployment:
name = o.Name
vs = o.Spec.Template.Spec.Volumes
vms = o.Spec.Template.Spec.Containers[0].VolumeMounts
args = o.Spec.Template.Spec.Containers[0].Args
rps = o.Spec.Template.Spec.Containers[0].ReadinessProbe.ProbeHandler.HTTPGet.Scheme
lps = o.Spec.Template.Spec.Containers[0].LivenessProbe.ProbeHandler.HTTPGet.Scheme
case *appsv1.StatefulSet:
name = o.Name
vs = o.Spec.Template.Spec.Volumes
vms = o.Spec.Template.Spec.Containers[0].VolumeMounts
args = o.Spec.Template.Spec.Containers[0].Args
rps = o.Spec.Template.Spec.Containers[0].ReadinessProbe.ProbeHandler.HTTPGet.Scheme
lps = o.Spec.Template.Spec.Containers[0].LivenessProbe.ProbeHandler.HTTPGet.Scheme
default:
continue
}
secretName := fmt.Sprintf("%s-http", name)
expVolume := corev1.Volume{
Name: secretName,
VolumeSource: corev1.VolumeSource{
Secret: &corev1.SecretVolumeSource{
SecretName: secretName,
},
},
}
require.Contains(t, vs, expVolume)
expVolumeMount := corev1.VolumeMount{
Name: secretName,
ReadOnly: false,
MountPath: "/var/run/tls/http",
}
require.Contains(t, vms, expVolumeMount)
require.Contains(t, args, "-server.http-tls-cert-path=/var/run/tls/http/tls.crt")
require.Contains(t, args, "-server.http-tls-key-path=/var/run/tls/http/tls.key")
require.Equal(t, corev1.URISchemeHTTPS, rps)
require.Equal(t, corev1.URISchemeHTTPS, lps)
}
}
func TestBuildAll_WithFeatureFlags_EnableTLSServiceMonitorConfig(t *testing.T) { func TestBuildAll_WithFeatureFlags_EnableTLSServiceMonitorConfig(t *testing.T) {
opts := Options{ opts := Options{
Name: "test", Name: "test",
@ -231,6 +305,7 @@ func TestBuildAll_WithFeatureFlags_EnableTLSServiceMonitorConfig(t *testing.T) {
}, },
Flags: FeatureFlags{ Flags: FeatureFlags{
EnableServiceMonitors: true, EnableServiceMonitors: true,
EnableTLSHTTPServices: true,
EnableTLSServiceMonitorConfig: true, EnableTLSServiceMonitorConfig: true,
}, },
} }
@ -480,6 +555,7 @@ func TestBuildAll_WithFeatureFlags_EnableGateway(t *testing.T) {
}, },
Flags: FeatureFlags{ Flags: FeatureFlags{
EnableGateway: false, EnableGateway: false,
EnableTLSHTTPServices: true,
EnableTLSServiceMonitorConfig: false, EnableTLSServiceMonitorConfig: false,
}, },
}, },
@ -517,6 +593,7 @@ func TestBuildAll_WithFeatureFlags_EnableGateway(t *testing.T) {
}, },
Flags: FeatureFlags{ Flags: FeatureFlags{
EnableGateway: true, EnableGateway: true,
EnableTLSHTTPServices: true,
EnableTLSServiceMonitorConfig: true, EnableTLSServiceMonitorConfig: true,
}, },
}, },

@ -20,8 +20,8 @@ import (
// BuildCompactor builds the k8s objects required to run Loki Compactor. // BuildCompactor builds the k8s objects required to run Loki Compactor.
func BuildCompactor(opts Options) ([]client.Object, error) { func BuildCompactor(opts Options) ([]client.Object, error) {
statefulSet := NewCompactorStatefulSet(opts) statefulSet := NewCompactorStatefulSet(opts)
if opts.Flags.EnableTLSServiceMonitorConfig { if opts.Flags.EnableTLSHTTPServices {
if err := configureCompactorServiceMonitorPKI(statefulSet, opts.Name); err != nil { if err := configureCompactorHTTPServicePKI(statefulSet, opts.Name); err != nil {
return nil, err return nil, err
} }
} }
@ -220,9 +220,9 @@ func NewCompactorHTTPService(opts Options) *corev1.Service {
} }
} }
func configureCompactorServiceMonitorPKI(statefulSet *appsv1.StatefulSet, stackName string) error { func configureCompactorHTTPServicePKI(statefulSet *appsv1.StatefulSet, stackName string) error {
serviceName := serviceNameCompactorHTTP(stackName) serviceName := serviceNameCompactorHTTP(stackName)
return configureServiceMonitorPKI(&statefulSet.Spec.Template.Spec, serviceName) return configureHTTPServicePKI(&statefulSet.Spec.Template.Spec, serviceName)
} }
func configureCompactorGRPCServicePKI(sts *appsv1.StatefulSet, stackName string) error { func configureCompactorGRPCServicePKI(sts *appsv1.StatefulSet, stackName string) error {

@ -19,8 +19,8 @@ import (
// BuildDistributor returns a list of k8s objects for Loki Distributor // BuildDistributor returns a list of k8s objects for Loki Distributor
func BuildDistributor(opts Options) ([]client.Object, error) { func BuildDistributor(opts Options) ([]client.Object, error) {
deployment := NewDistributorDeployment(opts) deployment := NewDistributorDeployment(opts)
if opts.Flags.EnableTLSServiceMonitorConfig { if opts.Flags.EnableTLSHTTPServices {
if err := configureDistributorServiceMonitorPKI(deployment, opts.Name); err != nil { if err := configureDistributorHTTPServicePKI(deployment, opts.Name); err != nil {
return nil, err return nil, err
} }
} }
@ -196,9 +196,9 @@ func NewDistributorHTTPService(opts Options) *corev1.Service {
} }
} }
func configureDistributorServiceMonitorPKI(deployment *appsv1.Deployment, stackName string) error { func configureDistributorHTTPServicePKI(deployment *appsv1.Deployment, stackName string) error {
serviceName := serviceNameDistributorHTTP(stackName) serviceName := serviceNameDistributorHTTP(stackName)
return configureServiceMonitorPKI(&deployment.Spec.Template.Spec, serviceName) return configureHTTPServicePKI(&deployment.Spec.Template.Spec, serviceName)
} }
func configureDistributorGRPCServicePKI(deployment *appsv1.Deployment, stackName, stackNS string) error { func configureDistributorGRPCServicePKI(deployment *appsv1.Deployment, stackName, stackNS string) error {

@ -40,7 +40,7 @@ func BuildGateway(opts Options) ([]client.Object, error) {
objs := []client.Object{cm, dpl, svc, ing} objs := []client.Object{cm, dpl, svc, ing}
if opts.Flags.EnableTLSServiceMonitorConfig { if opts.Flags.EnableTLSHTTPServices {
serviceName := serviceNameGatewayHTTP(opts.Name) serviceName := serviceNameGatewayHTTP(opts.Name)
if err := configureGatewayMetricsPKI(&dpl.Spec.Template.Spec, serviceName); err != nil { if err := configureGatewayMetricsPKI(&dpl.Spec.Template.Spec, serviceName); err != nil {
return nil, err return nil, err

@ -72,7 +72,7 @@ func configureDeploymentForMode(d *appsv1.Deployment, mode lokiv1beta1.ModeType,
caBundleName, caBundleName,
caBundleDir, caBundleDir,
caFile, caFile,
flags.EnableTLSServiceMonitorConfig, flags.EnableTLSHTTPServices,
flags.EnableCertificateSigningService, flags.EnableCertificateSigningService,
secretName, secretName,
serverName, serverName,

@ -357,6 +357,7 @@ func TestConfigureDeploymentForMode(t *testing.T) {
stackName: "test", stackName: "test",
stackNs: "test-ns", stackNs: "test-ns",
flags: FeatureFlags{ flags: FeatureFlags{
EnableTLSHTTPServices: true,
EnableTLSServiceMonitorConfig: true, EnableTLSServiceMonitorConfig: true,
}, },
dpl: &appsv1.Deployment{ dpl: &appsv1.Deployment{
@ -536,6 +537,7 @@ func TestConfigureDeploymentForMode(t *testing.T) {
stackName: "test", stackName: "test",
stackNs: "test-ns", stackNs: "test-ns",
flags: FeatureFlags{ flags: FeatureFlags{
EnableTLSHTTPServices: true,
EnableTLSServiceMonitorConfig: true, EnableTLSServiceMonitorConfig: true,
EnableCertificateSigningService: true, EnableCertificateSigningService: true,
}, },
@ -822,6 +824,7 @@ func TestConfigureServiceMonitorForMode(t *testing.T) {
desc: "openshift-logging mode with-tls-service-monitor-config", desc: "openshift-logging mode with-tls-service-monitor-config",
mode: lokiv1beta1.OpenshiftLogging, mode: lokiv1beta1.OpenshiftLogging,
flags: FeatureFlags{ flags: FeatureFlags{
EnableTLSHTTPServices: true,
EnableTLSServiceMonitorConfig: true, EnableTLSServiceMonitorConfig: true,
}, },
sm: &monitoringv1.ServiceMonitor{ sm: &monitoringv1.ServiceMonitor{

@ -19,8 +19,8 @@ import (
// BuildIndexGateway returns a list of k8s objects for Loki IndexGateway // BuildIndexGateway returns a list of k8s objects for Loki IndexGateway
func BuildIndexGateway(opts Options) ([]client.Object, error) { func BuildIndexGateway(opts Options) ([]client.Object, error) {
statefulSet := NewIndexGatewayStatefulSet(opts) statefulSet := NewIndexGatewayStatefulSet(opts)
if opts.Flags.EnableTLSServiceMonitorConfig { if opts.Flags.EnableTLSHTTPServices {
if err := configureIndexGatewayServiceMonitorPKI(statefulSet, opts.Name); err != nil { if err := configureIndexGatewayHTTPServicePKI(statefulSet, opts.Name); err != nil {
return nil, err return nil, err
} }
} }
@ -220,9 +220,9 @@ func NewIndexGatewayHTTPService(opts Options) *corev1.Service {
} }
} }
func configureIndexGatewayServiceMonitorPKI(statefulSet *appsv1.StatefulSet, stackName string) error { func configureIndexGatewayHTTPServicePKI(statefulSet *appsv1.StatefulSet, stackName string) error {
serviceName := serviceNameIndexGatewayHTTP(stackName) serviceName := serviceNameIndexGatewayHTTP(stackName)
return configureServiceMonitorPKI(&statefulSet.Spec.Template.Spec, serviceName) return configureHTTPServicePKI(&statefulSet.Spec.Template.Spec, serviceName)
} }
func configureIndexGatewayGRPCServicePKI(sts *appsv1.StatefulSet, stackName string) error { func configureIndexGatewayGRPCServicePKI(sts *appsv1.StatefulSet, stackName string) error {

@ -23,8 +23,8 @@ import (
// BuildIngester builds the k8s objects required to run Loki Ingester // BuildIngester builds the k8s objects required to run Loki Ingester
func BuildIngester(opts Options) ([]client.Object, error) { func BuildIngester(opts Options) ([]client.Object, error) {
statefulSet := NewIngesterStatefulSet(opts) statefulSet := NewIngesterStatefulSet(opts)
if opts.Flags.EnableTLSServiceMonitorConfig { if opts.Flags.EnableTLSHTTPServices {
if err := configureIngesterServiceMonitorPKI(statefulSet, opts.Name); err != nil { if err := configureIngesterHTTPServicePKI(statefulSet, opts.Name); err != nil {
return nil, err return nil, err
} }
} }
@ -252,9 +252,9 @@ func NewIngesterHTTPService(opts Options) *corev1.Service {
} }
} }
func configureIngesterServiceMonitorPKI(statefulSet *appsv1.StatefulSet, stackName string) error { func configureIngesterHTTPServicePKI(statefulSet *appsv1.StatefulSet, stackName string) error {
serviceName := serviceNameIngesterHTTP(stackName) serviceName := serviceNameIngesterHTTP(stackName)
return configureServiceMonitorPKI(&statefulSet.Spec.Template.Spec, serviceName) return configureHTTPServicePKI(&statefulSet.Spec.Template.Spec, serviceName)
} }
func configureIngesterGRPCServicePKI(sts *appsv1.StatefulSet, stackName, stackNS string) error { func configureIngesterGRPCServicePKI(sts *appsv1.StatefulSet, stackName, stackNS string) error {

@ -107,7 +107,7 @@ func ConfigureGatewayDeployment(
gwContainer.LivenessProbe.ProbeHandler.HTTPGet.Scheme = corev1.URISchemeHTTPS gwContainer.LivenessProbe.ProbeHandler.HTTPGet.Scheme = corev1.URISchemeHTTPS
gwContainer.Args = gwArgs gwContainer.Args = gwArgs
// Create and mount TLS secrets volumes if it's not already done by the service monitor config. // Create and mount TLS secrets volumes if not already created.
if !withTLS { if !withTLS {
gwVolumes = append(gwVolumes, corev1.Volume{ gwVolumes = append(gwVolumes, corev1.Volume{
Name: secretVolumeName, Name: secretVolumeName,

@ -37,6 +37,7 @@ type Options struct {
type FeatureFlags struct { type FeatureFlags struct {
EnableCertificateSigningService bool EnableCertificateSigningService bool
EnableServiceMonitors bool EnableServiceMonitors bool
EnableTLSHTTPServices bool
EnableTLSServiceMonitorConfig bool EnableTLSServiceMonitorConfig bool
EnableTLSGRPCServices bool EnableTLSGRPCServices bool
EnablePrometheusAlerts bool EnablePrometheusAlerts bool

@ -21,8 +21,8 @@ import (
// BuildQuerier returns a list of k8s objects for Loki Querier // BuildQuerier returns a list of k8s objects for Loki Querier
func BuildQuerier(opts Options) ([]client.Object, error) { func BuildQuerier(opts Options) ([]client.Object, error) {
deployment := NewQuerierDeployment(opts) deployment := NewQuerierDeployment(opts)
if opts.Flags.EnableTLSServiceMonitorConfig { if opts.Flags.EnableTLSHTTPServices {
if err := configureQuerierServiceMonitorPKI(deployment, opts.Name); err != nil { if err := configureQuerierHTTPServicePKI(deployment, opts.Name); err != nil {
return nil, err return nil, err
} }
} }
@ -202,9 +202,9 @@ func NewQuerierHTTPService(opts Options) *corev1.Service {
} }
} }
func configureQuerierServiceMonitorPKI(deployment *appsv1.Deployment, stackName string) error { func configureQuerierHTTPServicePKI(deployment *appsv1.Deployment, stackName string) error {
serviceName := serviceNameQuerierHTTP(stackName) serviceName := serviceNameQuerierHTTP(stackName)
return configureServiceMonitorPKI(&deployment.Spec.Template.Spec, serviceName) return configureHTTPServicePKI(&deployment.Spec.Template.Spec, serviceName)
} }
func configureQuerierGRPCServicePKI(deployment *appsv1.Deployment, stackName, stackNS string) error { func configureQuerierGRPCServicePKI(deployment *appsv1.Deployment, stackName, stackNS string) error {

@ -17,8 +17,8 @@ import (
// BuildQueryFrontend returns a list of k8s objects for Loki QueryFrontend // BuildQueryFrontend returns a list of k8s objects for Loki QueryFrontend
func BuildQueryFrontend(opts Options) ([]client.Object, error) { func BuildQueryFrontend(opts Options) ([]client.Object, error) {
deployment := NewQueryFrontendDeployment(opts) deployment := NewQueryFrontendDeployment(opts)
if opts.Flags.EnableTLSServiceMonitorConfig { if opts.Flags.EnableTLSHTTPServices {
if err := configureQueryFrontendServiceMonitorPKI(deployment, opts.Name); err != nil { if err := configureQueryFrontendHTTPServicePKI(deployment, opts.Name); err != nil {
return nil, err return nil, err
} }
} }
@ -206,9 +206,9 @@ func NewQueryFrontendHTTPService(opts Options) *corev1.Service {
} }
} }
func configureQueryFrontendServiceMonitorPKI(deployment *appsv1.Deployment, stackName string) error { func configureQueryFrontendHTTPServicePKI(deployment *appsv1.Deployment, stackName string) error {
serviceName := serviceNameQueryFrontendHTTP(stackName) serviceName := serviceNameQueryFrontendHTTP(stackName)
return configureServiceMonitorPKI(&deployment.Spec.Template.Spec, serviceName) return configureHTTPServicePKI(&deployment.Spec.Template.Spec, serviceName)
} }
func configureQueryFrontendGRPCServicePKI(deployment *appsv1.Deployment, stackName string) error { func configureQueryFrontendGRPCServicePKI(deployment *appsv1.Deployment, stackName string) error {

@ -20,8 +20,8 @@ import (
// BuildRuler returns a list of k8s objects for Loki Stack Ruler // BuildRuler returns a list of k8s objects for Loki Stack Ruler
func BuildRuler(opts Options) ([]client.Object, error) { func BuildRuler(opts Options) ([]client.Object, error) {
statefulSet := NewRulerStatefulSet(opts) statefulSet := NewRulerStatefulSet(opts)
if opts.Flags.EnableTLSServiceMonitorConfig { if opts.Flags.EnableTLSHTTPServices {
if err := configureRulerServiceMonitorPKI(statefulSet, opts.Name); err != nil { if err := configureRulerHTTPServicePKI(statefulSet, opts.Name); err != nil {
return nil, err return nil, err
} }
} }
@ -266,9 +266,9 @@ func NewRulerHTTPService(opts Options) *corev1.Service {
} }
} }
func configureRulerServiceMonitorPKI(statefulSet *appsv1.StatefulSet, stackName string) error { func configureRulerHTTPServicePKI(statefulSet *appsv1.StatefulSet, stackName string) error {
serviceName := serviceNameRulerHTTP(stackName) serviceName := serviceNameRulerHTTP(stackName)
return configureServiceMonitorPKI(&statefulSet.Spec.Template.Spec, serviceName) return configureHTTPServicePKI(&statefulSet.Spec.Template.Spec, serviceName)
} }
func configureRulerGRPCServicePKI(sts *appsv1.StatefulSet, stackName string) error { func configureRulerGRPCServicePKI(sts *appsv1.StatefulSet, stackName string) error {

@ -46,3 +46,61 @@ func configureGRPCServicePKI(podSpec *corev1.PodSpec, serviceName string) error
return nil return nil
} }
func configureHTTPServicePKI(podSpec *corev1.PodSpec, serviceName string) error {
secretVolumeSpec := corev1.PodSpec{
Volumes: []corev1.Volume{
{
Name: serviceName,
VolumeSource: corev1.VolumeSource{
Secret: &corev1.SecretVolumeSource{
SecretName: serviceName,
},
},
},
},
}
secretContainerSpec := corev1.Container{
VolumeMounts: []corev1.VolumeMount{
{
Name: serviceName,
ReadOnly: false,
MountPath: httpTLSDir,
},
},
Args: []string{
fmt.Sprintf("-server.http-tls-cert-path=%s", path.Join(httpTLSDir, tlsCertFile)),
fmt.Sprintf("-server.http-tls-key-path=%s", path.Join(httpTLSDir, tlsKeyFile)),
},
}
uriSchemeContainerSpec := corev1.Container{
ReadinessProbe: &corev1.Probe{
ProbeHandler: corev1.ProbeHandler{
HTTPGet: &corev1.HTTPGetAction{
Scheme: corev1.URISchemeHTTPS,
},
},
},
LivenessProbe: &corev1.Probe{
ProbeHandler: corev1.ProbeHandler{
HTTPGet: &corev1.HTTPGetAction{
Scheme: corev1.URISchemeHTTPS,
},
},
},
}
if err := mergo.Merge(podSpec, secretVolumeSpec, mergo.WithAppendSlice); err != nil {
return kverrors.Wrap(err, "failed to merge volumes")
}
if err := mergo.Merge(&podSpec.Containers[0], secretContainerSpec, mergo.WithAppendSlice); err != nil {
return kverrors.Wrap(err, "failed to merge container")
}
if err := mergo.Merge(&podSpec.Containers[0], uriSchemeContainerSpec, mergo.WithOverride); err != nil {
return kverrors.Wrap(err, "failed to merge container")
}
return nil
}

@ -1,16 +1,10 @@
package manifests package manifests
import ( import (
"fmt"
"path"
"github.com/ViaQ/logerr/v2/kverrors"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels" "k8s.io/apimachinery/pkg/labels"
"sigs.k8s.io/controller-runtime/pkg/client" "sigs.k8s.io/controller-runtime/pkg/client"
"github.com/imdario/mergo"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1" monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"
) )
@ -147,61 +141,3 @@ func newServiceMonitor(namespace, serviceMonitorName string, labels labels.Set,
}, },
} }
} }
func configureServiceMonitorPKI(podSpec *corev1.PodSpec, serviceName string) error {
secretVolumeSpec := corev1.PodSpec{
Volumes: []corev1.Volume{
{
Name: serviceName,
VolumeSource: corev1.VolumeSource{
Secret: &corev1.SecretVolumeSource{
SecretName: serviceName,
},
},
},
},
}
secretContainerSpec := corev1.Container{
VolumeMounts: []corev1.VolumeMount{
{
Name: serviceName,
ReadOnly: false,
MountPath: httpTLSDir,
},
},
Args: []string{
fmt.Sprintf("-server.http-tls-cert-path=%s", path.Join(httpTLSDir, tlsCertFile)),
fmt.Sprintf("-server.http-tls-key-path=%s", path.Join(httpTLSDir, tlsKeyFile)),
},
}
uriSchemeContainerSpec := corev1.Container{
ReadinessProbe: &corev1.Probe{
ProbeHandler: corev1.ProbeHandler{
HTTPGet: &corev1.HTTPGetAction{
Scheme: corev1.URISchemeHTTPS,
},
},
},
LivenessProbe: &corev1.Probe{
ProbeHandler: corev1.ProbeHandler{
HTTPGet: &corev1.HTTPGetAction{
Scheme: corev1.URISchemeHTTPS,
},
},
},
}
if err := mergo.Merge(podSpec, secretVolumeSpec, mergo.WithAppendSlice); err != nil {
return kverrors.Wrap(err, "failed to merge volumes")
}
if err := mergo.Merge(&podSpec.Containers[0], secretContainerSpec, mergo.WithAppendSlice); err != nil {
return kverrors.Wrap(err, "failed to merge container")
}
if err := mergo.Merge(&podSpec.Containers[0], uriSchemeContainerSpec, mergo.WithOverride); err != nil {
return kverrors.Wrap(err, "failed to merge container")
}
return nil
}

@ -71,6 +71,11 @@ func main() {
os.Exit(1) os.Exit(1)
} }
if ctrlCfg.Flags.EnableTLSServiceMonitorConfig && !ctrlCfg.Flags.EnableTLSHTTPServices {
logger.Error(kverrors.New("enableTlsServiceMonitorConfig flag requires enableTlsHttpServices"), "")
os.Exit(1)
}
if ctrlCfg.Flags.EnableServiceMonitors || ctrlCfg.Flags.EnableTLSServiceMonitorConfig { if ctrlCfg.Flags.EnableServiceMonitors || ctrlCfg.Flags.EnableTLSServiceMonitorConfig {
utilruntime.Must(monitoringv1.AddToScheme(scheme)) utilruntime.Must(monitoringv1.AddToScheme(scheme))
} }
@ -92,6 +97,7 @@ func main() {
featureFlags := manifests.FeatureFlags{ featureFlags := manifests.FeatureFlags{
EnableCertificateSigningService: ctrlCfg.Flags.EnableCertificateSigningService, EnableCertificateSigningService: ctrlCfg.Flags.EnableCertificateSigningService,
EnableServiceMonitors: ctrlCfg.Flags.EnableServiceMonitors, EnableServiceMonitors: ctrlCfg.Flags.EnableServiceMonitors,
EnableTLSHTTPServices: ctrlCfg.Flags.EnableTLSHTTPServices,
EnableTLSServiceMonitorConfig: ctrlCfg.Flags.EnableTLSServiceMonitorConfig, EnableTLSServiceMonitorConfig: ctrlCfg.Flags.EnableTLSServiceMonitorConfig,
EnableTLSGRPCServices: ctrlCfg.Flags.EnableTLSGRPCServices, EnableTLSGRPCServices: ctrlCfg.Flags.EnableTLSGRPCServices,
EnablePrometheusAlerts: ctrlCfg.Flags.EnablePrometheusAlerts, EnablePrometheusAlerts: ctrlCfg.Flags.EnablePrometheusAlerts,

Loading…
Cancel
Save