Skip to content

Commit d346d57

Browse files
committed
fix: update existing cert-manager Certificate CRs on operator upgrade
createSSLByCertManager() uses r.client.Create() with an IsAlreadyExists guard, so any spec changes (duration, renewBefore, SANs, labels) introduced in newer operator versions are never applied to Certificate CRs that were created by an older version. The most significant impact is the CA certificate duration: clusters originally deployed with operator < 1.15.0 still carry duration=8760h (1 year) instead of the current default of 26280h (3 years). Replace the create-and-ignore pattern with a createOrUpdateCertificate helper that attempts Create first, and on AlreadyExists fetches the existing Certificate, compares Spec and Labels, and issues an Update when they differ. Fixes #2413
1 parent fd84444 commit d346d57

5 files changed

Lines changed: 345 additions & 9 deletions

File tree

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
apiVersion: cert-manager.io/v1
2+
kind: Certificate
3+
metadata:
4+
generation: 3
5+
labels:
6+
app.kubernetes.io/instance: some-name-tls-issue
7+
app.kubernetes.io/managed-by: percona-xtradb-cluster-operator
8+
app.kubernetes.io/name: percona-xtradb-cluster
9+
app.kubernetes.io/part-of: percona-xtradb-cluster
10+
name: some-name-tls-issue-ca-cert
11+
spec:
12+
commonName: some-name-tls-issue-ca
13+
duration: 20000h0m0s
14+
isCA: true
15+
issuerRef:
16+
kind: Issuer
17+
name: some-name-tls-issue-pxc-ca-issuer
18+
renewBefore: 730h0m0s
19+
secretName: some-name-tls-issue-ca-cert
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
apiVersion: cert-manager.io/v1
2+
kind: Certificate
3+
metadata:
4+
generation: 3
5+
labels:
6+
app.kubernetes.io/instance: some-name-tls-issue
7+
app.kubernetes.io/managed-by: percona-xtradb-cluster-operator
8+
app.kubernetes.io/name: percona-xtradb-cluster
9+
app.kubernetes.io/part-of: percona-xtradb-cluster
10+
name: some-name-tls-issue-ssl
11+
spec:
12+
commonName: some-name-tls-issue-proxysql
13+
dnsNames:
14+
- some-name-tls-issue-pxc
15+
- some-name-tls-issue-proxysql
16+
- '*.some-name-tls-issue-pxc'
17+
- '*.some-name-tls-issue-proxysql'
18+
- test.com
19+
- new-san.example.com
20+
duration: 2160h0m0s
21+
issuerRef:
22+
kind: Issuer
23+
name: some-name-tls-issue-pxc-issuer
24+
secretName: some-name-tls-issue-ssl
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
apiVersion: pxc.percona.com/v1
2+
kind: PerconaXtraDBCluster
3+
metadata:
4+
name: some-name-tls-issue
5+
finalizers:
6+
- percona.com/delete-pxc-pods-in-order
7+
spec:
8+
tls:
9+
certValidityDuration: 2160h
10+
caValidityDuration: 20000h
11+
SANs:
12+
- test.com
13+
- new-san.example.com
14+
secretsName: my-cluster-secrets
15+
vaultSecretName: some-name-vault
16+
pause: false
17+
pxc:
18+
size: 3
19+
image: -pxc
20+
resources:
21+
requests:
22+
memory: 0.1G
23+
cpu: 100m
24+
limits:
25+
memory: "2G"
26+
cpu: "1"
27+
volumeSpec:
28+
persistentVolumeClaim:
29+
resources:
30+
requests:
31+
storage: 2Gi
32+
affinity:
33+
antiAffinityTopologyKey: "kubernetes.io/hostname"
34+
proxysql:
35+
enabled: false
36+
size: 2
37+
image: -proxysql
38+
resources:
39+
requests:
40+
memory: 0.1G
41+
cpu: 100m
42+
limits:
43+
memory: 1G
44+
cpu: 700m
45+
affinity:
46+
antiAffinityTopologyKey: "kubernetes.io/hostname"
47+
volumeSpec:
48+
persistentVolumeClaim:
49+
resources:
50+
requests:
51+
storage: 2Gi
52+
haproxy:
53+
enabled: true
54+
size: 2
55+
image: -haproxy
56+
resources:
57+
requests:
58+
memory: 0.1G
59+
cpu: 100m
60+
limits:
61+
memory: 1G
62+
cpu: 700m
63+
affinity:
64+
antiAffinityTopologyKey: "kubernetes.io/hostname"
65+
pmm:
66+
enabled: false
67+
image: perconalab/pmm-client:1.17.1
68+
serverHost: monitoring-service
69+
serverUser: pmm
70+
backup:
71+
image: -backup
72+
storages:
73+
pvc:
74+
type: filesystem
75+
volume:
76+
persistentVolumeClaim:
77+
accessModes: [ "ReadWriteOnce" ]
78+
resources:
79+
requests:
80+
storage: 1Gi
81+
aws-s3:
82+
type: s3
83+
s3:
84+
region: us-east-1
85+
bucket: operator-testing
86+
credentialsSecret: aws-s3-secret
87+
minio:
88+
type: s3
89+
s3:
90+
credentialsSecret: minio-secret
91+
region: us-east-1
92+
bucket: operator-testing
93+
endpointUrl: http://minio-service:9000/
94+
gcp-cs:
95+
type: s3
96+
s3:
97+
credentialsSecret: gcp-cs-secret
98+
region: us-east-1
99+
bucket: operator-testing
100+
endpointUrl: https://storage.googleapis.com

e2e-tests/tls-issue-cert-manager/run

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,21 @@ main() {
4848
desc 'check ssl-internal certificate using HAProxy'
4949
check_verify_identity "$cluster-haproxy"
5050

51+
desc 'update tls spec: change duration and add new SAN'
52+
apply_config "$test_dir/conf/$cluster-updated.yml"
53+
sleep 30
54+
55+
desc 'check if CA certificate updated'
56+
compare_kubectl certificate/$cluster-ca-cert "-updated"
57+
58+
desc 'check if SSL certificate updated'
59+
compare_kubectl certificate/$cluster-ssl "-updated"
60+
61+
wait_cluster_consistency "$cluster" 3 2
62+
63+
desc 'check ssl-internal certificate using PXC after update'
64+
check_verify_identity "$cluster-pxc"
65+
5166
destroy $namespace
5267
desc "test passed"
5368
}

0 commit comments

Comments
 (0)