Skip to content

Commit ef29224

Browse files
koukpepov
authored andcommitted
Support TLS configuration with k8s.io/tls secrets
Modify the custom resources to optionally support specifying the certificate and key for each service using a secret of type `kubernetes.io/tls`.The pre-existing method of configuration, using a `Secret` that contained both cert/key pairs plus the CA cert remains the default. Also update the helm charts to optional support the new type of configuration. Fixes: #133
1 parent 4e74e36 commit ef29224

File tree

15 files changed

+194
-56
lines changed

15 files changed

+194
-56
lines changed

Diff for: charts/logging-operator-fluent/README.md

+4-2
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@ This chart applies Fluentd and Fluent-bit custom resources to [Logging Operator]
2424
| Parameter | Description | Default |
2525
| --------------------------------------------------- | ------------------------------------------------------ | ------------------------------ |
2626
| `tls.enabled` | Enabled TLS communication between components | true |
27-
| `tls.secretName` | Specified secret name, which contain tls certs | This will overwrite automatic Helm certificate generation. |
27+
| `tls.secretName` | Specified generic secret name, which contain tls certs | This will overwrite automatic Helm certificate generation and overrides `fluentbit.tlsSecret` and `fluentd.tlsSecret`. |
2828
| `tls.sharedKey` | Shared key between nodes (fluentd-fluentbit) | [autogenerated] |
2929
| `fluentbit.enabled` | Install fluent-bit | true |
3030
| `fluentbit.namespace` | Specified fluentbit installation namespace | same as operator namespace |
31-
| `fluentbit.image.tag` | Fluentbit container image tag | `1.1.3` |
31+
| `fluentbit.image.tag` | Fluentbit container image tag | `1.1.3` |
3232
| `fluentbit.image.repository` | Fluentbit container image repository | `fluent/fluent-bit` |
3333
| `fluentbit.image.pullPolicy` | Fluentbit container pull policy | `IfNotPresent` |
3434
| `fluentbit.tolerations` | Fluentbit tolerations | `nil` |
35+
| `fluentbit.tlsSecret` | Secret name that contains Fluentbit TLS client cert | Ignored if `tls.secretName` is specified. Must refer to a secret of type `kubernetes.io/tls` |
3536
| `fluentd.enabled` | Install fluentd | true |
3637
| `fluentd.namespace` | Specified fluentd installation namespace | same as operator namespace |
3738
| `fluentd.image.tag` | Fluentd container image tag | `v1.5.0` |
@@ -46,4 +47,5 @@ This chart applies Fluentd and Fluent-bit custom resources to [Logging Operator]
4647
| `fluentd.fluentdPvcSpec.accessModes` | Fluentd persistence volume access modes | `[ReadWriteOnce]` |
4748
| `fluentd.fluentdPvcSpec.resources.requests.storage` | Fluentd persistence volume size | `21Gi` |
4849
| `fluentd.tolerations` | Fluentd tolerations | `nil` |
50+
| `fluentd.tlsSecret` | Secret name that contains Fluentd TLS client cert | Ignored if `tls.secretName` is specified. Must refer to a secret of type `kubernetes.io/tls`. |
4951
| `psp.enabled` | Install PodSecurityPolicy | `false` |

Diff for: charts/logging-operator-fluent/templates/fluentbit-cr.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{{- if .Values.fluentbit.enabled }}
2+
{{ $fluentbitUseGenericSecret := or .Values.tls.secretName (not .Values.fluentbit.tlsSecret ) }}
23
apiVersion: logging.banzaicloud.com/v1alpha1
34
kind: Fluentbit
45
metadata:
@@ -21,6 +22,12 @@ spec:
2122
{{- end }}
2223
tls:
2324
enabled: {{ .Values.tls.enabled }}
25+
{{- if $fluentbitUseGenericSecret }}
2426
secretName: {{ .Values.tls.secretName | default (include "logging-operator-fluent.fullname" .) }}
27+
secretType: generic
28+
{{- else }}
29+
secretName: {{ .Values.fluentbit.tlsSecret }}
30+
secretType: tls
31+
{{- end }}
2532
sharedKey: {{ .Values.tls.sharedKey | default (derivePassword 1 "long" (.Release.Time | toString) .Release.Name .Chart.Name ) | b64enc | quote }}
2633
{{ end }}

Diff for: charts/logging-operator-fluent/templates/fluentd-cr.yaml

+7
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
{{- if .Values.fluentd.enabled }}
2+
{{ $fluentdUseGenericSecret := or .Values.tls.secretName (not .Values.fluentd.tlsSecret) }}
23
apiVersion: logging.banzaicloud.com/v1alpha1
34
kind: Fluentd
45
metadata:
@@ -24,7 +25,13 @@ spec:
2425
{{- end }}
2526
tls:
2627
enabled: {{ .Values.tls.enabled }}
28+
{{- if $fluentdUseGenericSecret }}
2729
secretName: {{ .Values.tls.secretName | default (include "logging-operator-fluent.fullname" .) }}
30+
secretType: generic
31+
{{- else }}
32+
secretName: {{ .Values.fluentd.tlsSecret }}
33+
secretType: tls
34+
{{- end }}
2835
sharedKey: {{ .Values.tls.sharedKey | default (derivePassword 1 "long" (.Release.Time | toString) .Release.Name .Chart.Name ) | b64enc | quote }}
2936
serviceType: {{ .Values.fluentd.serviceType | default "ClusterIP" | quote }}
3037
{{ end }}

Diff for: charts/logging-operator-fluent/templates/secret.yaml

+3-3
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77
apiVersion: v1
88
kind: Secret
99
metadata:
10-
name: {{ template "logging-operator.fullname" . }}
10+
name: {{ template "logging-operator-fluent.fullname" . }}
1111
labels:
12-
app.kubernetes.io/name: {{ include "logging-operator.name" . }}
13-
helm.sh/chart: {{ include "logging-operator.chart" . }}
12+
app.kubernetes.io/name: {{ include "logging-operator-fluent.name" . }}
13+
helm.sh/chart: {{ include "logging-operator-fluent.chart" . }}
1414
app.kubernetes.io/instance: {{ .Release.Name }}
1515
app.kubernetes.io/managed-by: {{ .Release.Service }}
1616
data:

Diff for: charts/logging-operator-fluent/values.yaml

+2
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ fluentbit:
1515
tag: "1.1.3"
1616
repository: "fluent/fluent-bit"
1717
pullPolicy: "IfNotPresent"
18+
tlsSecret: ""
1819

1920
fluentd:
2021
enabled: true
@@ -38,6 +39,7 @@ fluentd:
3839
resources:
3940
requests:
4041
storage: 21Gi
42+
tlsSecret: ""
4143

4244
psp:
4345
enabled: false

Diff for: docs/examples/tls.md

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
2+
# TLS Configuration
3+
4+
To configure TLS for Fluentd and Fluentbit the operator needs TLS certificates
5+
set via the Fluentd and Fluentbit Custom Resources respectively. This can be
6+
done in two ways:
7+
8+
## Generic Opaque secret (default)
9+
10+
Create a secret like this:
11+
12+
```
13+
apiVersion: v1
14+
data:
15+
caCert: ...
16+
clientCert: ...
17+
clientKey: ...
18+
serverCert: ...
19+
serverKey: ...
20+
kind: Secret
21+
metadata:
22+
name: something-something-tls
23+
type: Opaque
24+
```
25+
26+
Note that we are providing three certificates in the same secret, one for
27+
Fluentd (`serverCert`), one for Fluentbit (`clientCert`), and the CA
28+
certificate (`caCert`).
29+
30+
Then in your custom resource configure like this:
31+
32+
```
33+
apiVersion: logging.banzaicloud.com/v1alpha1
34+
kind: Fluentd/Fluentbit
35+
metadata:
36+
name: my-fluent-thing
37+
spec:
38+
...
39+
tls:
40+
enabled: true
41+
secretName: something-something-tls
42+
sharedKey: changeme
43+
```
44+
45+
46+
## `kubernetes.io/tls`
47+
48+
The alternative is if your certificates are in secrets of type `kubernetes.io/tls`, e.g.
49+
50+
```
51+
apiVersion: v1
52+
data:
53+
ca.crt: LS0tLS1...
54+
tls.crt: LS0tLS1...
55+
tls.key: LS0tLS1...
56+
kind: Secret
57+
metadata:
58+
name: something-something-tls
59+
type: kubernetes.io/tls
60+
```
61+
62+
Then configure your custom resources like this:
63+
64+
```
65+
apiVersion: logging.banzaicloud.com/v1alpha1
66+
kind: Fluentd/Fluentbit
67+
metadata:
68+
name: my-fluent-thing
69+
spec:
70+
...
71+
tls:
72+
enabled: true
73+
secretName: something-something-tls
74+
secretType: tls
75+
sharedKey: changeme
76+
```
77+
78+
Note: in this case we can use the same secret for both Fluentbit and Fluentd,
79+
or create separate secrets for each.
80+
81+
Note: the secret's data include the CA certificate, which is in-line with the
82+
structure created by [jetstack/cert-manager](https://github.com/jetstack/cert-manager/).
83+
84+
## Usage with the helm chart
85+
86+
For the generic Opaque secret just set `tls.enabled=True` and optionally provide the `tls.secretName` value to use your own certificates (instead of the automatically generated ones from the chart).
87+
88+
For `kubernetes.io/tls` install `logging-operator-fluent` with a `values.yaml` like this:
89+
90+
```
91+
tls:
92+
enabled: true
93+
94+
fluentbit:
95+
tlsSecret: something-something-tls
96+
97+
fluentd:
98+
tlsSecret: otherthing-otherthing-tls
99+
```
100+
101+
For more information see the helm chart's [README.md](https://github.com/banzaicloud/logging-operator/blob/master/charts/logging-operator-fluent/README.md).

Diff for: docs/plugins/forward.md

+6-3
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
| pattern | - | |
66
| clientHostname | fluentd.client | |
77
| tlsSharedKey | | |
8+
| tlsCACertFilel | fluentd/tls/caCert | |
9+
| tlsCertFile | fluentd/tls/clientCert | |
10+
| tlsKeyFile | /fluentd/tls/clientKey | |
811
| name | target | |
912
| host | - | |
1013
| port | - | |
@@ -26,9 +29,9 @@
2629
{{ if not (eq .tlsSharedKey "") -}}
2730
transport tls
2831
tls_version TLSv1_2
29-
tls_cert_path /fluentd/tls/caCert
30-
tls_client_cert_path /fluentd/tls/clientCert
31-
tls_client_private_key_path /fluentd/tls/clientKey
32+
tls_cert_path {{ .tlsCACertFile }}
33+
tls_client_cert_path {{ .tlsCertFile }}
34+
tls_client_private_key_path {{ .tlsKeyFile }}
3235
<security>
3336
self_hostname {{ .clientHostname }}
3437
shared_key {{ .tlsSharedKey }}

Diff for: pkg/apis/logging/v1alpha1/fluentbit_types.go

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ type FluentbitSpec struct {
4444
type FluentbitTLS struct {
4545
Enabled bool `json:"enabled"`
4646
SecretName string `json:"secretName"`
47+
SecretType string `json:"secretType,omitempty"`
4748
SharedKey string `json:"sharedKey"`
4849
}
4950

Diff for: pkg/apis/logging/v1alpha1/fluentd_types.go

+1
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ type FluentdSpec struct {
4848
type FluentdTLS struct {
4949
Enabled bool `json:"enabled"`
5050
SecretName string `json:"secretName"`
51+
SecretType string `json:"secretType,omitempty"`
5152
SharedKey string `json:"sharedKey"`
5253
}
5354

Diff for: pkg/resources/fluentbit/config.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -54,9 +54,9 @@ var fluentBitConfigTemplate = `
5454
{{ if .TLS.Enabled }}
5555
tls On
5656
tls.verify Off
57-
tls.ca_file /fluent-bit/tls/caCert
58-
tls.crt_file /fluent-bit/tls/clientCert
59-
tls.key_file /fluent-bit/tls/clientKey
57+
tls.ca_file {{ .TLS.CACertFile }}
58+
tls.crt_file {{ .TLS.CertFile }}
59+
tls.key_file {{ .TLS.KeyFile }}
6060
Shared_Key {{ .TLS.SharedKey }}
6161
{{- end }}
6262
Retry_Limit False

Diff for: pkg/resources/fluentbit/configmap.go

+26-14
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,19 @@ import (
2424
"text/template"
2525
)
2626

27+
type fluentbitTLSConfig struct {
28+
Enabled bool
29+
SharedKey string
30+
CACertFile string
31+
CertFile string
32+
KeyFile string
33+
}
34+
2735
type fluentBitConfig struct {
2836
Namespace string
29-
TLS struct {
30-
Enabled bool
31-
SharedKey string
32-
}
33-
Monitor map[string]string
34-
Output map[string]string
37+
TLS fluentbitTLSConfig
38+
Monitor map[string]string
39+
Output map[string]string
3540
}
3641

3742
func (r *Reconciler) configMap() runtime.Object {
@@ -41,16 +46,23 @@ func (r *Reconciler) configMap() runtime.Object {
4146
"Port": r.Fluentbit.Spec.Annotations["prometheus.io/port"],
4247
}
4348
}
49+
tlsConfig := fluentbitTLSConfig{
50+
Enabled: r.Fluentbit.Spec.TLS.Enabled,
51+
SharedKey: r.Fluentbit.Spec.TLS.SharedKey,
52+
}
53+
if r.Fluentbit.Spec.TLS.SecretType == "tls" {
54+
tlsConfig.CertFile = "/fluent-bit/tls/tls.crt"
55+
tlsConfig.KeyFile = "/fluent-bit/tls/tls.key"
56+
tlsConfig.CACertFile = "/fluent-bit/tls/ca.crt"
57+
} else {
58+
tlsConfig.CertFile = "/fluent-bit/tls/clientCert"
59+
tlsConfig.KeyFile = "/fluent-bit/tls/clientKey"
60+
tlsConfig.CACertFile = "/fluent-bit/tls/caCert"
61+
}
4462
input := fluentBitConfig{
4563
Namespace: r.Fluentbit.Namespace,
46-
TLS: struct {
47-
Enabled bool
48-
SharedKey string
49-
}{
50-
Enabled: r.Fluentbit.Spec.TLS.Enabled,
51-
SharedKey: r.Fluentbit.Spec.TLS.SharedKey,
52-
},
53-
Monitor: monitorConfig,
64+
TLS: tlsConfig,
65+
Monitor: monitorConfig,
5466
}
5567
return &corev1.ConfigMap{
5668
ObjectMeta: templates.FluentbitObjectMeta(fluentbitConfigMapName, r.Fluentbit.Labels, r.Fluentbit),

Diff for: pkg/resources/fluentbit/daemonset.go

+1-12
Original file line numberDiff line numberDiff line change
@@ -94,18 +94,7 @@ func generateVolumeMounts(fluentbit *loggingv1alpha1.Fluentbit) (v []corev1.Volu
9494
tlsRelatedVolume := []corev1.VolumeMount{
9595
{
9696
Name: "fluent-tls",
97-
MountPath: "/fluent-bit/tls/caCert",
98-
SubPath: "caCert",
99-
},
100-
{
101-
Name: "fluent-tls",
102-
MountPath: "/fluent-bit/tls/clientCert",
103-
SubPath: "clientCert",
104-
},
105-
{
106-
Name: "fluent-tls",
107-
MountPath: "/fluent-bit/tls/clientKey",
108-
SubPath: "clientKey",
97+
MountPath: "/fluent-bit/tls",
10998
},
11099
}
111100
v = append(v, tlsRelatedVolume...)

Diff for: pkg/resources/fluentd/config.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -50,9 +50,9 @@ var fluentdInputTemplate = `
5050
</security>
5151
<transport tls>
5252
version TLSv1_2
53-
ca_path /fluentd/tls/caCert
54-
cert_path /fluentd/tls/serverCert
55-
private_key_path /fluentd/tls/serverKey
53+
ca_path {{ .TLS.CACertFile }}
54+
cert_path {{ .TLS.CertFile }}
55+
private_key_path {{ .TLS.KeyFile }}
5656
client_cert_auth true
5757
</transport>
5858
{{- end }}

Diff for: pkg/resources/fluentd/configmap.go

+22-12
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,33 @@ import (
2626
"text/template"
2727
)
2828

29+
type fluentdTLSConfig struct {
30+
Enabled bool
31+
SharedKey string
32+
CACertFile string
33+
CertFile string
34+
KeyFile string
35+
}
36+
2937
type fluentdConfig struct {
30-
TLS struct {
31-
Enabled bool
32-
SharedKey string
33-
}
38+
TLS fluentdTLSConfig
3439
}
3540

3641
func (r *Reconciler) configMap() runtime.Object {
37-
input := fluentdConfig{
38-
TLS: struct {
39-
Enabled bool
40-
SharedKey string
41-
}{
42-
Enabled: r.Fluentd.Spec.TLS.Enabled,
43-
SharedKey: r.Fluentd.Spec.TLS.SharedKey,
44-
},
42+
tlsConfig := fluentdTLSConfig{
43+
Enabled: r.Fluentd.Spec.TLS.Enabled,
44+
SharedKey: r.Fluentd.Spec.TLS.SharedKey,
45+
}
46+
if r.Fluentd.Spec.TLS.SecretType == "tls" {
47+
tlsConfig.CertFile = "/fluentd/tls/tls.crt"
48+
tlsConfig.KeyFile = "/fluentd/tls/tls.key"
49+
tlsConfig.CACertFile = "/fluentd/tls/ca.crt"
50+
} else {
51+
tlsConfig.CertFile = "/fluentd/tls/serverCert"
52+
tlsConfig.KeyFile = "/fluentd/tls/serverKey"
53+
tlsConfig.CACertFile = "/fluentd/tls/caCert"
4554
}
55+
input := fluentdConfig{TLS: tlsConfig}
4656
return &corev1.ConfigMap{
4757
ObjectMeta: templates.FluentdObjectMeta(configMapName, util.MergeLabels(r.Fluentd.Labels, labelSelector), r.Fluentd),
4858
Data: map[string]string{

0 commit comments

Comments
 (0)