@@ -42,12 +42,23 @@ func (r *Reconciler) reconcileRootCertificate(
4242) (
4343 * pki.RootCertificateAuthority , error ,
4444) {
45+ mode , err := certmanager .ResolveIssuerMode (ctx , r .Client , cluster )
46+ if err != nil {
47+ return nil , errors .Wrap (err , "failed to resolve issuer mode" )
48+ }
49+ if mode == certmanager .IssuerModeExternal {
50+ return nil , nil
51+ }
52+
4553 const keyCertificate , keyPrivateKey = "root.crt" , "root.key"
4654
4755 // K8SPG-553
4856 existing := & corev1.Secret {
4957 ObjectMeta : naming .PostgresRootCASecret (cluster ),
5058 }
59+ if mode == certmanager .IssuerModeManagedCluster {
60+ existing .ObjectMeta = naming .ClusterCACertSecret (cluster , certmanager .CertManagerNamespace ())
61+ }
5162
5263 privateKey := keyPrivateKey
5364 certificateKey := keyCertificate
@@ -64,11 +75,11 @@ func (r *Reconciler) reconcileRootCertificate(
6475 }
6576 }
6677
67- err : = errors .WithStack (
78+ err = errors .WithStack (
6879 r .Client .Get (ctx , client .ObjectKeyFromObject (existing ), existing ))
6980 // K8SPG-555: we need to check ca certificate from old operator versions
7081 // TODO: remove when 2.4.0 will become unsupported
71- if k8serrors .IsNotFound (err ) {
82+ if k8serrors .IsNotFound (err ) && mode == certmanager . IssuerModeManagedNamespaced {
7283 nn := client .ObjectKeyFromObject (existing )
7384 nn .Name = naming .RootCertSecret
7485 err = errors .WithStack (
@@ -104,6 +115,12 @@ func (r *Reconciler) reconcileRootCertificate(
104115 return nil , errors .New ("waiting for cert-manager to issue a valid CA certificate" )
105116 }
106117
118+ if mode == certmanager .IssuerModeManagedCluster {
119+ // The cluster-scoped CA cert/secret is entirely cert-manager's
120+ // responsibility; there is no internal-PKI fallback for it.
121+ return nil , errors .New ("waiting for cert-manager to issue a valid CA certificate" )
122+ }
123+
107124 root := & pki.RootCertificateAuthority {}
108125
109126 if err == nil {
@@ -186,8 +203,17 @@ func (r *Reconciler) reconcileCertManagerRootCertificate(
186203 return nil , errors .Wrap (err , "error applying CA certificate" )
187204 }
188205
206+ mode , err := certmanager .ResolveIssuerMode (ctx , r .Client , cluster )
207+ if err != nil {
208+ return nil , errors .Wrap (err , "failed to resolve issuer mode" )
209+ }
210+ secretMeta := naming .PostgresRootCASecret (cluster )
211+ if mode == certmanager .IssuerModeManagedCluster {
212+ secretMeta = naming .ClusterCACertSecret (cluster , certmanager .CertManagerNamespace ())
213+ }
214+
189215 // Try to fetch the CA secret created by cert-manager.
190- secret := & corev1.Secret {ObjectMeta : naming . PostgresRootCASecret ( cluster ) }
216+ secret := & corev1.Secret {ObjectMeta : secretMeta }
191217 if err := r .Client .Get (ctx , client .ObjectKeyFromObject (secret ), secret ); err != nil {
192218 if k8serrors .IsNotFound (err ) {
193219 log .Info ("waiting for cert-manager to issue CA certificate" )
@@ -335,9 +361,14 @@ func (r *Reconciler) reconcileCertManagerClusterCertificate(
335361) {
336362 c := r .CertManagerCtrlFunc (r .Client , r .Scheme , false )
337363
338- err := c . ApplyIssuer (ctx , cluster )
364+ mode , err := certmanager . ResolveIssuerMode (ctx , r . Client , cluster )
339365 if err != nil {
340- return nil , errors .Wrap (err , "failed to apply TLS issuer" )
366+ return nil , errors .Wrap (err , "failed to resolve issuer mode" )
367+ }
368+ if mode != certmanager .IssuerModeExternal {
369+ if err := c .ApplyIssuer (ctx , cluster ); err != nil {
370+ return nil , errors .Wrap (err , "failed to apply TLS issuer" )
371+ }
341372 }
342373
343374 primaryDNSNames , err := naming .ServiceDNSNames (ctx , primaryService , cluster .Spec .ClusterServiceDNSSuffix )
@@ -385,11 +416,27 @@ func (r *Reconciler) isRootCACertManagerManaged(ctx context.Context, cluster *v1
385416 return false , nil
386417 }
387418
419+ mode , err := certmanager .ResolveIssuerMode (ctx , r .Client , cluster )
420+ if err != nil {
421+ return false , errors .Wrap (err , "failed to resolve issuer mode" )
422+ }
423+
388424 installed , err := r .isCertManagerInstalled (ctx , cluster .Namespace )
389- if err != nil || ! installed {
425+ if err != nil {
390426 return false , err
391427 }
392428
429+ if mode != certmanager .IssuerModeManagedNamespaced {
430+ if ! installed {
431+ return false , errors .New ("cert-manager is required when spec.tls.issuerConf is set" )
432+ }
433+ return true , nil
434+ }
435+
436+ if ! installed {
437+ return false , nil
438+ }
439+
393440 rootSecret := & corev1.Secret {ObjectMeta : naming .PostgresRootCASecret (cluster )}
394441 err = r .Client .Get (ctx , client .ObjectKeyFromObject (rootSecret ), rootSecret )
395442 if err != nil {
0 commit comments