Skip to content

Commit c1c4c8e

Browse files
committed
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.
1 parent a1eae42 commit c1c4c8e

File tree

3 files changed

+70
-16
lines changed

3 files changed

+70
-16
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:

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: 5 additions & 16 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{
8680
Name: cr.Name + "-ca-cert",
8781
Namespace: cr.Namespace,
88-
OwnerReferences: ownerReferences,
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,7 +103,7 @@ 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
}
@@ -119,7 +112,6 @@ func (r *ReconcilePerconaXtraDBCluster) createSSLByCertManager(cr *api.PerconaXt
119112
ObjectMeta: metav1.ObjectMeta{
120113
Name: cr.Name + "-ssl",
121114
Namespace: cr.Namespace,
122-
OwnerReferences: ownerReferences,
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
}
@@ -156,7 +148,6 @@ func (r *ReconcilePerconaXtraDBCluster) createSSLByCertManager(cr *api.PerconaXt
156148
ObjectMeta: metav1.ObjectMeta{
157149
Name: cr.Name + "-ssl-internal",
158150
Namespace: cr.Namespace,
159-
OwnerReferences: ownerReferences,
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 == "" {
@@ -242,7 +232,6 @@ func (r *ReconcilePerconaXtraDBCluster) createIssuer(ownRef []metav1.OwnerRefere
242232
ObjectMeta: metav1.ObjectMeta{
243233
Name: issuer,
244234
Namespace: namespace,
245-
OwnerReferences: ownRef,
246235
},
247236
Spec: spec,
248237
})

0 commit comments

Comments
 (0)