Skip to content

Commit cfd50e0

Browse files
implement logrotate config override
Signed-off-by: Mayank Shah <mayank.shah@percona.com>
1 parent e29e544 commit cfd50e0

File tree

6 files changed

+233
-88
lines changed

6 files changed

+233
-88
lines changed

build/logcollector/entrypoint.sh

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,19 @@ set -o xtrace
44

55
export PATH="$PATH":/opt/fluent-bit/bin
66

7+
LOGROTATE_CONF_DIR=""
8+
if [ -f /opt/percona/logcollector/logrotate/conf.d ]; then
9+
LOGROTATE_CONF_DIR="/opt/percona/logcollector/logrotate/conf.d"
10+
fi
11+
712
if [ "$1" = 'logrotate' ]; then
813
if [[ $EUID != 1001 ]]; then
914
# logrotate requires UID in /etc/passwd
1015
sed -e "s^x:1001:^x:$EUID:^" /etc/passwd >/tmp/passwd
1116
cat /tmp/passwd >/etc/passwd
1217
rm -rf /tmp/passwd
1318
fi
14-
exec go-cron "0 0 * * *" sh -c "logrotate -s /data/db/logs/logrotate.status /opt/percona/logcollector/logrotate/logrotate.conf;"
19+
exec go-cron "0 0 * * *" sh -c "logrotate -s /data/db/logs/logrotate.status /opt/percona/logcollector/logrotate/logrotate.conf ${LOGROTATE_CONF_DIR};"
1520
else
1621
if [ "$1" = 'fluent-bit' ]; then
1722
fluentbit_opt+='-c /opt/percona/logcollector/fluentbit/fluentbit.conf'

pkg/controller/perconaservermongodb/psmdb_controller.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ import (
4040
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/backup"
4141
psmdbconfig "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/config"
4242
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector"
43+
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector/logrotate"
4344
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/pmm"
4445
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/secret"
4546
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/tls"
@@ -350,6 +351,12 @@ func (r *ReconcilePerconaServerMongoDB) Reconcile(ctx context.Context, request r
350351
}
351352
}
352353

354+
if cr.CompareVersion("1.22.0") >= 0 {
355+
if err := r.reconcileLogRotateConfigMaps(ctx, cr); err != nil {
356+
return reconcile.Result{}, errors.Wrap(err, "reconcile log rotate config map")
357+
}
358+
}
359+
353360
err = r.reconcileUsers(ctx, cr, repls)
354361
if err != nil {
355362
return reconcile.Result{}, errors.Wrap(err, "failed to reconcile users")
@@ -1249,6 +1256,40 @@ func (r *ReconcilePerconaServerMongoDB) reconcileLogCollectorConfigMaps(ctx cont
12491256
return nil
12501257
}
12511258

1259+
func (r *ReconcilePerconaServerMongoDB) reconcileLogRotateConfigMaps(ctx context.Context, cr *api.PerconaServerMongoDB) error {
1260+
if !cr.IsLogCollectorEnabled() {
1261+
if err := deleteConfigMapIfExists(ctx, r.client, cr, logrotate.ConfigMapName(cr.Name)); err != nil {
1262+
return errors.Wrap(err, "failed to delete log rotate config map when log collector is disabled")
1263+
}
1264+
return nil
1265+
}
1266+
1267+
if cr.Spec.LogCollector == nil || cr.Spec.LogCollector.LogRotate == nil || cr.Spec.LogCollector.LogRotate.Configuration == "" {
1268+
if err := deleteConfigMapIfExists(ctx, r.client, cr, logrotate.ConfigMapName(cr.Name)); err != nil {
1269+
return errors.Wrap(err, "failed to delete log rotate config map when the configuration is empty")
1270+
}
1271+
return nil
1272+
}
1273+
1274+
cm := &corev1.ConfigMap{
1275+
ObjectMeta: metav1.ObjectMeta{
1276+
Name: logrotate.ConfigMapName(cr.Name),
1277+
Namespace: cr.GetNamespace(),
1278+
Labels: naming.ClusterLabels(cr),
1279+
},
1280+
Data: map[string]string{
1281+
logrotate.MongodbConfig: cr.Spec.LogCollector.LogRotate.Configuration,
1282+
},
1283+
}
1284+
1285+
err := r.createOrUpdateConfigMap(ctx, cr, cm)
1286+
if err != nil {
1287+
return errors.Wrap(err, "create or update config map")
1288+
}
1289+
1290+
return nil
1291+
}
1292+
12521293
func deleteConfigMapIfExists(ctx context.Context, cl client.Client, cr *api.PerconaServerMongoDB, cmName string) error {
12531294
configMap := &corev1.ConfigMap{}
12541295

pkg/controller/perconaservermongodb/statefulset.go

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import (
1313
api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
1414
"github.com/percona/percona-server-mongodb-operator/pkg/naming"
1515
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb"
16+
psmdbconfig "github.com/percona/percona-server-mongodb-operator/pkg/psmdb/config"
1617
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector"
18+
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector/logrotate"
1719
)
1820

1921
func (r *ReconcilePerconaServerMongoDB) reconcileStatefulSet(ctx context.Context, cr *api.PerconaServerMongoDB, rs *api.ReplsetSpec, ls map[string]string) (*appsv1.StatefulSet, error) {
@@ -118,6 +120,19 @@ func (r *ReconcilePerconaServerMongoDB) getStatefulsetFromReplset(ctx context.Co
118120
return nil, errors.Wrap(err, "check if log collection custom configuration exists")
119121
}
120122

123+
logRotateCustomConfig, err := r.getCustomConfig(ctx, cr.Namespace, logrotate.ConfigMapName(cr.Name))
124+
if err != nil {
125+
return nil, errors.Wrap(err, "check if log rotate configuration exists")
126+
}
127+
128+
logRotateExtraConfig := psmdbconfig.CustomConfig{}
129+
if cr.Spec.LogCollector != nil && cr.Spec.LogCollector.LogRotate != nil && cr.Spec.LogCollector.LogRotate.ExtraConfig.Name != "" {
130+
logRotateExtraConfig, err = r.getCustomConfig(ctx, cr.Namespace, cr.Spec.LogCollector.LogRotate.ExtraConfig.Name)
131+
if err != nil {
132+
return nil, errors.Wrap(err, "check if log rotate extra configuration exists")
133+
}
134+
}
135+
121136
usersSecret := new(corev1.Secret)
122137
err = r.client.Get(ctx, types.NamespacedName{Name: api.UserSecretName(cr), Namespace: cr.Namespace}, usersSecret)
123138
if client.IgnoreNotFound(err) != nil {
@@ -130,16 +145,20 @@ func (r *ReconcilePerconaServerMongoDB) getStatefulsetFromReplset(ctx context.Co
130145
return nil, errors.Wrap(err, "check ssl secrets")
131146
}
132147

148+
configs := psmdb.StatefulConfigParams{
149+
MongoDConf: mongodCustomConfig,
150+
LogCollectionConf: logCollectionCustomConfig,
151+
LogRotateConf: logRotateCustomConfig,
152+
LogRotateExtraConf: logRotateExtraConfig,
153+
}
154+
secrets := psmdb.StatefulSpecSecretParams{
155+
UsersSecret: usersSecret,
156+
SSLSecret: sslSecret,
157+
}
133158
sfsSpec, err := psmdb.StatefulSpec(
134159
ctx, cr, rs, ls, r.initImage,
135-
psmdb.StatefulConfigParams{
136-
MongoDConf: mongodCustomConfig,
137-
LogCollectionConf: logCollectionCustomConfig,
138-
},
139-
psmdb.StatefulSpecSecretParams{
140-
UsersSecret: usersSecret,
141-
SSLSecret: sslSecret,
142-
},
160+
configs,
161+
secrets,
143162
)
144163
if err != nil {
145164
return nil, errors.Wrapf(err, "create StatefulSet.Spec %s", sfs.Name)

pkg/psmdb/logcollector/container.go

Lines changed: 2 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@ package logcollector
22

33
import (
44
"fmt"
5-
"strconv"
65

76
"github.com/pkg/errors"
87
corev1 "k8s.io/api/core/v1"
98

109
api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
1110
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/config"
11+
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/logcollector/logrotate"
1212
)
1313

1414
const (
@@ -35,7 +35,7 @@ func Containers(cr *api.PerconaServerMongoDB, mongoPort int32) ([]corev1.Contain
3535
return nil, err
3636
}
3737

38-
logRotationCont, err := logRotationContainer(cr, mongoPort)
38+
logRotationCont, err := logrotate.Container(cr, mongoPort)
3939
if err != nil {
4040
return nil, err
4141
}
@@ -103,72 +103,3 @@ func logContainer(cr *api.PerconaServerMongoDB) (*corev1.Container, error) {
103103

104104
return &container, nil
105105
}
106-
107-
func logRotationContainer(cr *api.PerconaServerMongoDB, mongoPort int32) (*corev1.Container, error) {
108-
if cr.Spec.LogCollector == nil {
109-
return nil, errors.New("logcollector can't be nil")
110-
}
111-
112-
boolFalse := false
113-
114-
usersSecretName := api.UserSecretName(cr)
115-
116-
envs := []corev1.EnvVar{
117-
{
118-
Name: "MONGODB_HOST",
119-
Value: "localhost",
120-
},
121-
{
122-
Name: "MONGODB_PORT",
123-
Value: strconv.Itoa(int(mongoPort)),
124-
},
125-
{
126-
Name: "MONGODB_USER",
127-
ValueFrom: &corev1.EnvVarSource{
128-
SecretKeyRef: &corev1.SecretKeySelector{
129-
Key: "MONGODB_CLUSTER_ADMIN_USER_ESCAPED",
130-
LocalObjectReference: corev1.LocalObjectReference{
131-
Name: usersSecretName,
132-
},
133-
Optional: &boolFalse,
134-
},
135-
},
136-
},
137-
{
138-
Name: "MONGODB_PASSWORD",
139-
ValueFrom: &corev1.EnvVarSource{
140-
SecretKeyRef: &corev1.SecretKeySelector{
141-
Key: "MONGODB_CLUSTER_ADMIN_PASSWORD_ESCAPED",
142-
LocalObjectReference: corev1.LocalObjectReference{
143-
Name: usersSecretName,
144-
},
145-
Optional: &boolFalse,
146-
},
147-
},
148-
},
149-
}
150-
151-
container := corev1.Container{
152-
Name: "logrotate",
153-
Image: cr.Spec.LogCollector.Image,
154-
Env: envs,
155-
ImagePullPolicy: cr.Spec.LogCollector.ImagePullPolicy,
156-
SecurityContext: cr.Spec.LogCollector.ContainerSecurityContext,
157-
Resources: cr.Spec.LogCollector.Resources,
158-
Args: []string{
159-
"logrotate",
160-
},
161-
Command: []string{"/opt/percona/logcollector/entrypoint.sh"},
162-
VolumeMounts: []corev1.VolumeMount{
163-
{
164-
Name: config.MongodDataVolClaimName,
165-
MountPath: config.MongodContainerDataDir,
166-
},
167-
{
168-
Name: config.BinVolumeName,
169-
MountPath: config.BinMountPath,
170-
},
171-
},
172-
}
173-
return &container, nil
174-
}
Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
package logrotate
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"strconv"
7+
8+
api "github.com/percona/percona-server-mongodb-operator/pkg/apis/psmdb/v1"
9+
"github.com/percona/percona-server-mongodb-operator/pkg/psmdb/config"
10+
corev1 "k8s.io/api/core/v1"
11+
)
12+
13+
const (
14+
ConfigMapNameSuffix = "log-rotate-config"
15+
16+
VolumeName = "log-rotate-volume"
17+
CustomVolumeName = "custom-log-rotate-volume"
18+
19+
MongodbConfig = "mongodb.conf"
20+
21+
custonConfigDir = "/opt/percona/logcollector/logrotate/conf.d"
22+
)
23+
24+
func ConfigMapName(prefix string) string {
25+
if prefix == "" {
26+
return ConfigMapNameSuffix
27+
}
28+
return fmt.Sprintf("%s-%s", prefix, ConfigMapNameSuffix)
29+
}
30+
31+
func Container(cr *api.PerconaServerMongoDB, mongoPort int32) (*corev1.Container, error) {
32+
if cr.Spec.LogCollector == nil {
33+
return nil, errors.New("logcollector can't be nil")
34+
}
35+
36+
boolFalse := false
37+
38+
usersSecretName := api.UserSecretName(cr)
39+
40+
envs := []corev1.EnvVar{
41+
{
42+
Name: "MONGODB_HOST",
43+
Value: "localhost",
44+
},
45+
{
46+
Name: "MONGODB_PORT",
47+
Value: strconv.Itoa(int(mongoPort)),
48+
},
49+
{
50+
Name: "MONGODB_USER",
51+
ValueFrom: &corev1.EnvVarSource{
52+
SecretKeyRef: &corev1.SecretKeySelector{
53+
Key: "MONGODB_CLUSTER_ADMIN_USER_ESCAPED",
54+
LocalObjectReference: corev1.LocalObjectReference{
55+
Name: usersSecretName,
56+
},
57+
Optional: &boolFalse,
58+
},
59+
},
60+
},
61+
{
62+
Name: "MONGODB_PASSWORD",
63+
ValueFrom: &corev1.EnvVarSource{
64+
SecretKeyRef: &corev1.SecretKeySelector{
65+
Key: "MONGODB_CLUSTER_ADMIN_PASSWORD_ESCAPED",
66+
LocalObjectReference: corev1.LocalObjectReference{
67+
Name: usersSecretName,
68+
},
69+
Optional: &boolFalse,
70+
},
71+
},
72+
},
73+
}
74+
75+
container := corev1.Container{
76+
Name: "logrotate",
77+
Image: cr.Spec.LogCollector.Image,
78+
Env: envs,
79+
ImagePullPolicy: cr.Spec.LogCollector.ImagePullPolicy,
80+
SecurityContext: cr.Spec.LogCollector.ContainerSecurityContext,
81+
Resources: cr.Spec.LogCollector.Resources,
82+
Args: []string{
83+
"logrotate",
84+
},
85+
Command: []string{"/opt/percona/logcollector/entrypoint.sh"},
86+
VolumeMounts: []corev1.VolumeMount{
87+
{
88+
Name: config.MongodDataVolClaimName,
89+
MountPath: config.MongodContainerDataDir,
90+
},
91+
{
92+
Name: config.BinVolumeName,
93+
MountPath: config.BinMountPath,
94+
},
95+
},
96+
}
97+
98+
if cr.Spec.LogCollector != nil && cr.Spec.LogCollector.LogRotate != nil {
99+
if cr.Spec.LogCollector.LogRotate.Configuration != "" {
100+
container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{
101+
Name: VolumeName,
102+
MountPath: custonConfigDir,
103+
})
104+
}
105+
if cr.Spec.LogCollector.LogRotate.ExtraConfig.Name != "" {
106+
container.VolumeMounts = append(container.VolumeMounts, corev1.VolumeMount{
107+
Name: CustomVolumeName,
108+
MountPath: custonConfigDir,
109+
})
110+
}
111+
}
112+
113+
return &container, nil
114+
}

0 commit comments

Comments
 (0)