Manage TLS Certificates for Confluent Platform Using Confluent for Kubernetes
This topic describes how to manage Transport Layer Security (TLS) certificates for Confluent Platform using Confluent for Kubernetes (CFK).
Requirements and considerations
Plan rotation before certificate expiry.
There should be an overlap window between new and old certificates during the renewal process.
Test the rotation process first in a lower-tier, non-production environment.
Rotate user-provided server certificates
In CFK, to rotate user-provided certificates that have been provided as Kubernetes secrets, you can update the contents of the Kubernetes secrets.
For example, to rotate the server certificates that you provided in .pem files:
Update the
server.pemcertificate andserver-key.pemcertificate private key.Update the Kubernetes secret using the following command:
kubectl create secret generic component-tls \ --from-file=fullchain.pem=server.pem \ --from-file=cacerts.pem=ca.pem \ --from-file=privkey.pem=server-key.pem \ --save-config --dry-run=client -oyaml | \ kubectl apply -f -
CFK watches for secret changes, detects that the content has changed, and performs a rolling restart of the component to configure the new server certificate.
Note that CFK only watches the secrets provided in the .pem format. This feature is not supported for the secrets provided in the .jks format.
Secret updates and safe rolling restarts
Confluent for Kubernetes (CFK) now treats secret updates for Kafka and KRaft similarly to ConfigMap updates when deciding whether to roll brokers.
Previously, changes to secrets (for example, TLS certificates) caused the Kubernetes StatefulSet controller to roll pods directly, without CFK’s under-replicated partition (URP) safety checks. This could lead to URPs and cluster instability during certificate rotation and other secret changes. CFK now tracks referenced secrets and performs an operator-controlled roll with URP checks when they change, providing the same safety guarantees as for ConfigMap-triggered rolls.
Approaches to updating secrets
There are two ways to update secrets in CFK:
Create a new secret and update references
Create a new secret with updated values and modify the Kafka or KRaft CR spec to reference the new secret name. This is treated as a specification change, which triggers a safe rolling restart with URP checks and proper wait conditions.
Update existing secret content
Update the content of an existing secret without changing its name. Prior to version 3.2, this approach was unsafe because it caused the StatefulSet controller to roll pods directly without CFK’s URP safety checks. Starting in version 3.2, CFK now tracks secret content changes and performs an operator-controlled roll with URP checks, providing the same safety guarantees as specification-based changes.
Both approaches now trigger safe rolling restarts with URP checks.
How secret tracking works
CFK automatically discovers all secrets referenced in the Kafka or KRaft custom resource (CR) spec (for example, TLS, listener, and authentication secrets) and tracks their Kubernetes resourceVersion values. When any tracked secret changes:
CFK detects the change during reconciliation.
CFK marks a rolling restart as required and updates the StatefulSet template with a partitioned rolling strategy.
The operator-controlled roll runs one broker at a time, with URP and cluster-health checks between pod restarts.
This ensures that certificate rotation and other secret updates follow the same safe roll pattern as other configuration changes.
Controlling which secrets are tracked
You can fine-tune which secrets trigger a rolling restart using annotations on the Kafka or KRaft CR.
platform.confluent.io/additional-tracked-secretsAdd a comma-separated list of extra secret names to track, beyond those discovered automatically from the spec.
annotations: platform.confluent.io/additional-tracked-secrets: "custom-secret-1,custom-secret-2"
Use this when additional secrets are mounted or consumed in ways that are not explicitly referenced in the CR spec but should still trigger a safe roll when they change.
platform.confluent.io/exclude-tracked-secretsAdd a comma-separated list of secret names that should not trigger a roll, even if they are referenced in the spec.
annotations: platform.confluent.io/exclude-tracked-secrets: "monitoring-creds,logging-secret"
Use this for secrets that do not affect runtime broker behavior, change frequently, or are only used by components that do not require a pod restart.
Warning
Updating the platform.confluent.io/additional-tracked-secrets or platform.confluent.io/exclude-tracked-secrets annotations on an existing cluster changes the tracked secret set and triggers a rolling restart. Configure these annotations when you create the cluster to avoid unnecessary rolls.
Viewing tracked secrets
The final list of secrets currently being tracked and their versions is available in the platform.confluent.io/tracked-secrets-versions annotation on the Kafka or KRaft CR. This annotation is automatically maintained by CFK and shows the resource version of each tracked secret.
Manage auto-generated certificates
To manage auto-generated certificates in Confluent for Kubernetes (CFK), use the following annotations in the Confluent Platform component CRs.
Force a renewal of auto-generated certificates:
kubectl annotate <Component CR type> <Component CR name> \ platform.confluent.io/force-managed-cert-renewal="true"
The annotation triggers a reconciliation on the Confluent Platform component. The process causes the certificates to be renewed, and the component to be rolled.
After the certificates are renewed, the annotation is reset to
false.Add additional custom SAN for auto-generated certificates. This will be added to SANs defined at the global level in
managedCerts.sansin the CFK Helm values (in values.yaml).kubectl annotate secret ca-pair-sslcerts \ platform.confluent.io/managed-cert-add-sans="<Comma separated list of SANs>"
For example, the following annotation will add the SANs,
kafka.operator,kafka.operator.local, to auto-generated certificates for Kafka:kubectl annotate secret ca-pair-sslcerts \ platform.confluent.io/managed-cert-add-sans="kafka.operator, kafka.operator.local"
After the annotation is set, use the
platform.confluent.io/force-managed-cert-renewal="true"annotation to force a renewal of certificates. If not forced, SANs will be updated during the next reconciliation.Specify the Kubernetes secret name for the CA certificates at the CR level. This will override the global config defined in
managedCerts.caCertificatein the CFK Helm values (in values.yaml). This can be used even ifmanagedCerts.enableis set tofalse.kubectl annotate <Component CR type> <Component CR name> \ platform.confluent.io/managed-cert-ca-pair-secret=<Secret name>
The secret should have
tls.crtandtls.keywith the CA certificate and key.Configure the optional settings for auto-generated certificates at the CR level:
kubectl annotate <Component CR type> <Component CR name> \ platform.confluent.io/managed-cert-duration-in-days=<Number of days>
kubectl annotate <Component CR type> <Component CR name> \ platform.confluent.io/managed-cert-renew-before-in-days=<Number of days>
For example:
kubectl annotate kafka kafka platform.confluent.io/managed-cert-duration-in-days=60 kubectl annotate kafka kafka platform.confluent.io/managed-cert-renew-before-in-days=30
After the annotations are set, use the
platform.confluent.io/force-managed-cert-renewal="true"to force a renewal of certificates.