Skip to content

Commit bb2f654

Browse files
egeguneshors
andcommitted
K8SPXC-1030: Don't delete cert-manager certs by default (#1171)
* K8SPXC-1030: Don't delete cert-manager certs by default We shouldn't set owner references to cert-manager objects if we don't want to delete secrets too. This way, after the PXC cluster is deleted issuers, certificates and their secrets will remain intact in the cluster. If users want to cleanup objects created for SSL, we introduce a new finalizer: `delete-ssl`. If this finalizer is set, the operator will delete secrets, certificates and issuers. Unfortunately, cert-manager doesn't set owner reference to the secret it created and this behaviour can only configured by command line flag in the controller. Since we can't control how users deploy cert-manager to their clusters, we shouldn't rely on this feature and cleanup certificates and secrets altogether. Hopefully, cert-manager/cert-manager#5158 will merged and we can configure this behaviour on certificate level. * fix tests Co-authored-by: Viacheslav Sarzhan <[email protected]>
1 parent e797d01 commit bb2f654

File tree

10 files changed

+78
-52
lines changed

10 files changed

+78
-52
lines changed

deploy/cr.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ metadata:
44
name: cluster1
55
finalizers:
66
- delete-pxc-pods-in-order
7+
# - delete-ssl
78
# - delete-proxysql-pvc
89
# - delete-pxc-pvc
910
# annotations:

e2e-tests/init-deploy/compare/certificate_no-proxysql-ssl-internal.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@ kind: Certificate
33
metadata:
44
generation: 1
55
name: no-proxysql-ssl-internal
6-
ownerReferences:
7-
- controller: true
8-
kind: PerconaXtraDBCluster
9-
name: no-proxysql
106
spec:
117
commonName: no-proxysql-pxc
128
dnsNames:

e2e-tests/init-deploy/compare/certificate_no-proxysql-ssl.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@ kind: Certificate
33
metadata:
44
generation: 1
55
name: no-proxysql-ssl
6-
ownerReferences:
7-
- controller: true
8-
kind: PerconaXtraDBCluster
9-
name: no-proxysql
106
spec:
117
commonName: no-proxysql-proxysql
128
dnsNames:

e2e-tests/init-deploy/compare/issuer_no-proxysql-pxc-issuer.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@ kind: Issuer
33
metadata:
44
generation: 1
55
name: no-proxysql-pxc-issuer
6-
ownerReferences:
7-
- controller: true
8-
kind: PerconaXtraDBCluster
9-
name: no-proxysql
106
spec:
117
ca:
128
secretName: no-proxysql-ca-cert

e2e-tests/tls-issue-cert-manager-ref/compare/certificate_some-name-tls-issueref-ssl.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@ kind: Certificate
33
metadata:
44
generation: 1
55
name: some-name-tls-issueref-ssl
6-
ownerReferences:
7-
- controller: true
8-
kind: PerconaXtraDBCluster
9-
name: some-name-tls-issueref
106
spec:
117
commonName: some-name-tls-issueref-proxysql
128
dnsNames:

e2e-tests/tls-issue-cert-manager/compare/certificate_some-name-tls-issue-ssl.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@ kind: Certificate
33
metadata:
44
generation: 1
55
name: some-name-tls-issue-ssl
6-
ownerReferences:
7-
- controller: true
8-
kind: PerconaXtraDBCluster
9-
name: some-name-tls-issue
106
spec:
117
commonName: some-name-tls-issue-proxysql
128
dnsNames:

e2e-tests/tls-issue-cert-manager/compare/issuer_some-name-tls-issue-pxc-ca-issuer.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,5 @@ kind: Issuer
33
metadata:
44
generation: 1
55
name: some-name-tls-issue-pxc-ca-issuer
6-
ownerReferences:
7-
- controller: true
8-
kind: PerconaXtraDBCluster
9-
name: some-name-tls-issue
106
spec:
117
selfSigned: {}

e2e-tests/tls-issue-cert-manager/compare/issuer_some-name-tls-issue-pxc-issuer.yml

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,6 @@ kind: Issuer
33
metadata:
44
generation: 1
55
name: some-name-tls-issue-pxc-issuer
6-
ownerReferences:
7-
- controller: true
8-
kind: PerconaXtraDBCluster
9-
name: some-name-tls-issue
106
spec:
117
ca:
128
secretName: some-name-tls-issue-ca-cert

pkg/controller/pxc/controller.go

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"sync/atomic"
1111
"time"
1212

13+
cm "github.com/cert-manager/cert-manager/pkg/apis/certmanager/v1"
1314
"github.com/go-logr/logr"
1415
"github.com/go-logr/zapr"
1516
"github.com/pkg/errors"
@@ -228,6 +229,8 @@ func (r *ReconcilePerconaXtraDBCluster) Reconcile(_ context.Context, request rec
228229
for _, fnlz := range o.GetFinalizers() {
229230
var sfs api.StatefulApp
230231
switch fnlz {
232+
case "delete-ssl":
233+
err = r.deleteCerts(o)
231234
case "delete-proxysql-pvc":
232235
sfs = statefulset.NewProxy(o)
233236
// deletePVC is always true on this stage
@@ -1172,6 +1175,67 @@ func (r *ReconcilePerconaXtraDBCluster) deleteSecrets(cr *api.PerconaXtraDBClust
11721175
return nil
11731176
}
11741177

1178+
func (r *ReconcilePerconaXtraDBCluster) deleteCerts(cr *api.PerconaXtraDBCluster) error {
1179+
issuers := []string{
1180+
cr.Name + "-pxc-ca-issuer",
1181+
cr.Name + "-pxc-issuer",
1182+
}
1183+
for _, issuerName := range issuers {
1184+
issuer := &cm.Issuer{}
1185+
err := r.client.Get(context.TODO(), types.NamespacedName{
1186+
Namespace: cr.Namespace,
1187+
Name: issuerName,
1188+
}, issuer)
1189+
if err != nil {
1190+
continue
1191+
}
1192+
1193+
err = r.client.Delete(context.TODO(), issuer, &client.DeleteOptions{Preconditions: &metav1.Preconditions{UID: &issuer.UID}})
1194+
if err != nil {
1195+
return errors.Wrapf(err, "delete issuer %s", issuerName)
1196+
}
1197+
}
1198+
1199+
certs := []string{
1200+
cr.Name + "-ssl",
1201+
cr.Name + "-ssl-internal",
1202+
cr.Name + "-ca-cert",
1203+
}
1204+
for _, certName := range certs {
1205+
secret := &corev1.Secret{}
1206+
err := r.client.Get(context.TODO(), types.NamespacedName{
1207+
Namespace: cr.Namespace,
1208+
Name: certName,
1209+
}, secret)
1210+
if client.IgnoreNotFound(err) != nil {
1211+
continue
1212+
}
1213+
1214+
err = r.client.Delete(context.TODO(), secret,
1215+
&client.DeleteOptions{Preconditions: &metav1.Preconditions{UID: &secret.UID}})
1216+
if client.IgnoreNotFound(err) != nil {
1217+
return errors.Wrapf(err, "delete secret %s", certName)
1218+
}
1219+
1220+
cert := &cm.Certificate{}
1221+
err = r.client.Get(context.TODO(), types.NamespacedName{
1222+
Namespace: cr.Namespace,
1223+
Name: certName,
1224+
}, cert)
1225+
if err != nil {
1226+
continue
1227+
}
1228+
1229+
err = r.client.Delete(context.TODO(), cert,
1230+
&client.DeleteOptions{Preconditions: &metav1.Preconditions{UID: &cert.UID}})
1231+
if err != nil {
1232+
return errors.Wrapf(err, "delete certificate %s", certName)
1233+
}
1234+
}
1235+
1236+
return nil
1237+
}
1238+
11751239
func setControllerReference(ro runtime.Object, obj metav1.Object, scheme *runtime.Scheme) error {
11761240
ownerRef, err := OwnerRef(ro, scheme)
11771241
if err != nil {

pkg/controller/pxc/tls.go

Lines changed: 13 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,6 @@ func (r *ReconcilePerconaXtraDBCluster) reconcileSSL(cr *api.PerconaXtraDBCluste
6262
}
6363

6464
func (r *ReconcilePerconaXtraDBCluster) createSSLByCertManager(cr *api.PerconaXtraDBCluster) error {
65-
owner, err := OwnerRef(cr, r.scheme)
66-
if err != nil {
67-
return err
68-
}
69-
ownerReferences := []metav1.OwnerReference{owner}
70-
7165
issuerName := cr.Name + "-pxc-issuer"
7266
caIssuerName := cr.Name + "-pxc-ca-issuer"
7367
issuerKind := "Issuer"
@@ -77,15 +71,14 @@ func (r *ReconcilePerconaXtraDBCluster) createSSLByCertManager(cr *api.PerconaXt
7771
issuerName = cr.Spec.TLS.IssuerConf.Name
7872
issuerGroup = cr.Spec.TLS.IssuerConf.Group
7973
} else {
80-
if err := r.createIssuer(ownerReferences, cr.Namespace, caIssuerName, ""); err != nil {
74+
if err := r.createIssuer(cr.Namespace, caIssuerName, ""); err != nil {
8175
return err
8276
}
8377

8478
caCert := &cm.Certificate{
8579
ObjectMeta: metav1.ObjectMeta{
86-
Name: cr.Name + "-ca-cert",
87-
Namespace: cr.Namespace,
88-
OwnerReferences: ownerReferences,
80+
Name: cr.Name + "-ca-cert",
81+
Namespace: cr.Namespace,
8982
},
9083
Spec: cm.CertificateSpec{
9184
SecretName: cr.Name + "-ca-cert",
@@ -101,7 +94,7 @@ func (r *ReconcilePerconaXtraDBCluster) createSSLByCertManager(cr *api.PerconaXt
10194
},
10295
}
10396

104-
err = r.client.Create(context.TODO(), caCert)
97+
err := r.client.Create(context.TODO(), caCert)
10598
if err != nil && !k8serr.IsAlreadyExists(err) {
10699
return fmt.Errorf("create CA certificate: %v", err)
107100
}
@@ -110,16 +103,15 @@ func (r *ReconcilePerconaXtraDBCluster) createSSLByCertManager(cr *api.PerconaXt
110103
return err
111104
}
112105

113-
if err := r.createIssuer(ownerReferences, cr.Namespace, issuerName, caCert.Spec.SecretName); err != nil {
106+
if err := r.createIssuer(cr.Namespace, issuerName, caCert.Spec.SecretName); err != nil {
114107
return err
115108
}
116109
}
117110

118111
kubeCert := &cm.Certificate{
119112
ObjectMeta: metav1.ObjectMeta{
120-
Name: cr.Name + "-ssl",
121-
Namespace: cr.Namespace,
122-
OwnerReferences: ownerReferences,
113+
Name: cr.Name + "-ssl",
114+
Namespace: cr.Namespace,
123115
},
124116
Spec: cm.CertificateSpec{
125117
SecretName: cr.Spec.PXC.SSLSecretName,
@@ -143,7 +135,7 @@ func (r *ReconcilePerconaXtraDBCluster) createSSLByCertManager(cr *api.PerconaXt
143135
kubeCert.Spec.DNSNames = append(kubeCert.Spec.DNSNames, cr.Spec.TLS.SANs...)
144136
}
145137

146-
err = r.client.Create(context.TODO(), kubeCert)
138+
err := r.client.Create(context.TODO(), kubeCert)
147139
if err != nil && !k8serr.IsAlreadyExists(err) {
148140
return fmt.Errorf("create certificate: %v", err)
149141
}
@@ -154,9 +146,8 @@ func (r *ReconcilePerconaXtraDBCluster) createSSLByCertManager(cr *api.PerconaXt
154146

155147
kubeCert = &cm.Certificate{
156148
ObjectMeta: metav1.ObjectMeta{
157-
Name: cr.Name + "-ssl-internal",
158-
Namespace: cr.Namespace,
159-
OwnerReferences: ownerReferences,
149+
Name: cr.Name + "-ssl-internal",
150+
Namespace: cr.Namespace,
160151
},
161152
Spec: cm.CertificateSpec{
162153
SecretName: cr.Spec.PXC.SSLInternalSecretName,
@@ -220,8 +211,7 @@ func (r *ReconcilePerconaXtraDBCluster) waitForCerts(namespace string, secretsLi
220211
}
221212
}
222213

223-
func (r *ReconcilePerconaXtraDBCluster) createIssuer(ownRef []metav1.OwnerReference, namespace, issuer string, caCertSecret string) error {
224-
214+
func (r *ReconcilePerconaXtraDBCluster) createIssuer(namespace, issuer string, caCertSecret string) error {
225215
spec := cm.IssuerSpec{}
226216

227217
if caCertSecret == "" {
@@ -240,9 +230,8 @@ func (r *ReconcilePerconaXtraDBCluster) createIssuer(ownRef []metav1.OwnerRefere
240230

241231
err := r.client.Create(context.TODO(), &cm.Issuer{
242232
ObjectMeta: metav1.ObjectMeta{
243-
Name: issuer,
244-
Namespace: namespace,
245-
OwnerReferences: ownRef,
233+
Name: issuer,
234+
Namespace: namespace,
246235
},
247236
Spec: spec,
248237
})

0 commit comments

Comments
 (0)