cert-manager
cert-manager gives kinder clusters automatic TLS certificate management. A self-signed ClusterIssuer is created during cluster setup so you can issue Certificate resources immediately — no manual cert-manager installation or issuer configuration required.
kinder installs cert-manager v1.16.3.
What gets installed
Section titled “What gets installed”| Resource | Namespace | Purpose |
|---|---|---|
| cert-manager controller | cert-manager | Watches Certificate resources, issues certs |
| cert-manager-cainjector | cert-manager | Injects CA bundles into webhooks and API services |
| cert-manager-webhook | cert-manager | Validates and converts cert-manager resources |
selfsigned-issuer ClusterIssuer | cluster-scoped | Self-signed issuer ready for immediate use |
How to use
Section titled “How to use”Create a self-signed certificate:
apiVersion: cert-manager.io/v1kind: Certificatemetadata: name: my-cert namespace: defaultspec: secretName: my-cert-tls issuerRef: name: selfsigned-issuer kind: ClusterIssuer dnsNames: - myapp.localApply it and verify:
kubectl apply -f certificate.yamlkubectl get certificate my-certExpected output:
NAME READY SECRET AGEmy-cert True my-cert-tls 10sThe TLS secret is now available for use in Ingress, Gateway, or pod volume mounts:
kubectl get secret my-cert-tls -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -subjectUse with Envoy Gateway
Section titled “Use with Envoy Gateway”cert-manager pairs naturally with the Envoy Gateway addon. Create a Gateway with TLS termination:
apiVersion: gateway.networking.k8s.io/v1kind: Gatewaymetadata: name: my-gateway annotations: cert-manager.io/cluster-issuer: selfsigned-issuerspec: gatewayClassName: eg listeners: - name: https protocol: HTTPS port: 443 tls: mode: Terminate certificateRefs: - name: my-gateway-tlsHow to verify
Section titled “How to verify”After creating a cluster, confirm all three cert-manager components are running:
kubectl get pods -n cert-managerExpected output:
NAME READY STATUS RESTARTS AGEcert-manager-... 1/1 Running 0 60scert-manager-cainjector-... 1/1 Running 0 60scert-manager-webhook-... 1/1 Running 0 60sVerify the ClusterIssuer is ready:
kubectl get clusterissuer selfsigned-issuerExpected output:
NAME READY AGEselfsigned-issuer True 60sConfiguration
Section titled “Configuration”cert-manager is controlled by the addons.certManager field in your cluster config:
apiVersion: kind.x-k8s.io/v1alpha4kind: Clusteraddons: certManager: true # defaultSee the Configuration Reference for all available addon fields.
How to disable
Section titled “How to disable”To create a cluster without cert-manager, set certManager: false:
apiVersion: kind.x-k8s.io/v1alpha4kind: Clusteraddons: certManager: falseMore certificate examples
Section titled “More certificate examples”Wildcard certificate with custom duration
Section titled “Wildcard certificate with custom duration”A wildcard certificate covers all subdomains under a single domain. This is useful when you have multiple services (e.g., api.example.local, app.example.local) and want a single cert to cover them all.
apiVersion: cert-manager.io/v1kind: Certificatemetadata: name: wildcard-example-local namespace: defaultspec: secretName: wildcard-example-local-tls duration: 2160h # 90 days renewBefore: 360h # renew 15 days before expiry issuerRef: name: selfsigned-issuer kind: ClusterIssuer dnsNames: - "*.example.local" - "example.local"Apply it and verify it reaches READY: True:
kubectl apply -f wildcard-cert.yamlkubectl get certificate wildcard-example-localExpected output:
NAME READY SECRET AGEwildcard-example-local True wildcard-example-local-tls 15sTroubleshooting
Section titled “Troubleshooting”Certificate stays READY: False
Section titled “Certificate stays READY: False”Symptom: kubectl get certificate shows READY: False and the status does not change.
Two common causes:
(a) Webhook not ready yet
cert-manager’s webhook takes 30–60 seconds to become ready after cluster creation. If you apply a Certificate immediately after kinder create cluster, it may fail validation.
Fix: Wait 60 seconds and reapply, or check webhook readiness first:
kubectl get pods -n cert-managerAll three pods must be Running before applying certificates.
(b) Wrong issuer kind
The Certificate spec has kind: Issuer but selfsigned-issuer is a ClusterIssuer.
Fix: Change kind: Issuer to kind: ClusterIssuer in the issuerRef block:
issuerRef: name: selfsigned-issuer kind: ClusterIssuer # not IssuerDiagnostic commands:
kubectl describe certificate <name>kubectl get certificaterequestkubectl describe certificate shows events that indicate whether the issue is with the issuer reference or a webhook timeout. kubectl get certificaterequest shows whether cert-manager created a request at all — if no request exists, the webhook likely rejected the Certificate resource.