Manage TLS Certificates using IONOS Cloud DNS Webhook for cert-manager
This tutorial will guide you through managing TLS certificates using the IONOS Cloud DNS Webhook for cert-manager. Following these steps, you can secure your Kubernetes cluster workloads with valid TLS certificates that are automatically renewed before they expire.
Target audience
This tutorial is intended to help both developers and technical decision-makers.
What you will learn
You will learn how to automate the issuance and renewal of TLS certificates for your Kubernetes workloads using cert-manager and the IONOS Cloud DNS Webhook. This tutorial covers the complete setup process, including configuring DNS zones, secrets, and certificate resources for secure application deployment.
Before you begin
You must have the following:
An IONOS account.
A domain name registered and managed by IONOS Cloud DNS.
A Kubernetes cluster set up. If you have not yet set up a Kubernetes cluster, follow the instructions in Set Up a Kubernetes Cluster to create one.
A
kubectlinstalled and configured to interact with your Kubernetes cluster. If you have not downloaded thekubeconfigfile yet, follow the instructions in Download Kubeconfig File to download it.A
cert-managerinstalled in your Kubernetes cluster. If not, you can install it by following the instructions on the cert-manager Installation guide.
Procedure
Install cert-manager
cert-managerEnsure that cert-manager is installed in your Kubernetes cluster. For more information about the instructions, refer to the cert-manager Installation guide.
Execute the following command, if it is not already installed:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.17.0/cert-manager.yamlCreate a DNS Zone in IONOS Cloud DNS
If you have not yet created a primary zone in IONOS Cloud DNS, you need to create one. For more information, see Create a Primary Zone.
Install the IONOS Cloud Cert Manager webhook
To use the IONOS Cloud Cert Manager webhook, you need to install it in your Kubernetes cluster using Helm. Run the following command to install the webhook:
helm upgrade cert-manager-webhook-ionos-cloud \
--namespace cert-manager \
--install cert-manager-webhook-ionos-cloud/cert-manager-webhook-ionos-cloudFor more information, refer to the IONOS Cloud DNS Webhook for cert-manager documentation.
Create a ClusterIssuer resource
ClusterIssuer resourceCreate a ClusterIssuer resource in your Kubernetes cluster to configure the IONOS Cloud Cert Manager webhook. Save the following YAML content to a file named clusterissuer.yaml:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: ionos-cloud-issuer
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: [email protected]
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- dns01:
webhook:
groupName: acme.ionos.com
solverName: ionos-cloudCreate a Certificate resource
Certificate resourceCreate a Certificate resource to request a TLS certificate for your domain. Save the following YAML content to a file named certificate.yaml:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: yourdomain-com
namespace: default
spec:
secretName: yourdomain-com-tls
issuerRef:
name: ionos-cloud-issuer
kind: ClusterIssuer
commonName: '*.yourdomain.com' # project must be the owner of this primary zone
duration: 8760h0m0s
dnsNames:
- yourdomain.com
- '*.yourdomain.com'Create an Ingress resource
Ingress resourceCreate an Ingress resource to expose your application using the TLS certificate. Save the following YAML content to a file named ingress.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
namespace: default
annotations:
ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: "nginx"
rules:
- host: "app.yourdomain.com"
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: webapp
port:
number: 80
tls:
- hosts:
- "app.yourdomain.com"
secretName: yourdomain-com-tlsFinal result
You should see the certificate details and the status indicating that the certificate has been successfully issued. The output should look similar to the following:
Name: yourdomain-com
Namespace: default
Labels: <none>
Annotations: <none>
API Version: cert-manager.io/v1
Kind: Certificate
Metadata:
Creation Timestamp: 2025-03-24T16:01:05Z
Generation: 1
Resource Version: 37314086452
UID: 00354607-ab4c-4654-b7ad-941e1c945abe
Spec:
Common Name: *.yourdomain.com
Dns Names:
yourdomain.com
*.yourdomain.com
Duration: 8760h0m0s
Issuer Ref:
Kind: ClusterIssuer
Name: letsencrypt-prod
Secret Name: yourdomain-com-tls
Status:
Conditions:
Last Transition Time: 2025-03-24T16:03:32Z
Message: Certificate is up to date and has not expired
Observed Generation: 1
Reason: Ready
Status: True
Type: Ready
Not After: 2025-06-22T15:05:00Z
Not Before: 2025-03-24T15:05:01Z
Renewal Time: 2025-05-23T15:05:00Z
Revision: 1
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Issuing 29m cert-manager-certificates-trigger Issuing certificate as Secret does not exist
Normal Generated 29m cert-manager-certificates-key-manager Stored new private key in temporary Secret resource "yourdomain-com-wjmmm"
Normal Requested 29m cert-manager-certificates-request-manager Created new CertificateRequest resource "yourdomain-com-1"
Normal Issuing 26m cert-manager-certificates-issuing The certificate has been successfully issuedConclusion
You have successfully set up and managed TLS certificates using the IONOS Cloud cert-manager widget and IONOS Cloud DNS service. This ensures that your web server is secure and your data is protected. For more information, refer to the cert-manager official documentation and the IONOS Cloud DNS documentation.
Last updated
Was this helpful?