Lab 8.3 - TLS/SSL with Cert-Manager
Lab Objectives
By the end of this lab, you will be able to:
- Install cert-manager in the cluster.
- Configure a ClusterIssuer for Let's Encrypt.
- Create a TLS certificate for an Ingress.
- Configure HTTPS with Ingress.
- Test secure HTTPS access.
Estimated Duration
60-75 minutes
Prerequisites
- kubectl installed and configured.
- Kubernetes cluster with Ingress Controller.
- Publicly accessible domain (or use of self-signed certificates for local testing).
Part 1: Installing cert-manager
cert-manager is a Kubernetes operator that automates TLS certificate management.
Step 1.1: Install cert-manager
Install cert-manager:
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.1/cert-manager.yaml
Wait for cert-manager to be ready:
kubectl wait --for=condition=ready pod -l app.kubernetes.io/instance=cert-manager -n cert-manager --timeout=90s
Verify the installation:
kubectl get pods -n cert-manager
Part 2: Configuring a ClusterIssuer
A ClusterIssuer defines how cert-manager obtains certificates (Let's Encrypt, self-signed, etc.).
Step 2.1: ClusterIssuer for Let's Encrypt (Production)
For a public domain, create clusterissuer-letsencrypt.yaml:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
server: https://acme-v02.api.letsencrypt.org/directory
email: your-email@example.com # Replace with your email
privateKeySecretRef:
name: letsencrypt-prod
solvers:
- http01:
ingress:
class: nginx
Note: For Let's Encrypt, you must have a public domain and an Ingress accessible from the Internet.
Step 2.2: Self-Signed ClusterIssuer (Local Testing)
For a local cluster, use a self-signed certificate:
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: selfsigned-issuer
spec:
selfSigned: {}
Apply the self-signed ClusterIssuer:
kubectl apply -f clusterissuer-selfsigned.yaml
Verify:
kubectl get clusterissuer
Part 3: Creating a Certificate
Step 3.1: Create a Certificate
Create certificate-example.yaml:
apiVersion: cert-manager.io/v1
kind: Certificate
metadata:
name: app-tls-cert
spec:
secretName: app-tls-secret # Name of the Secret where the certificate will be stored
issuerRef:
name: selfsigned-issuer
kind: ClusterIssuer
dnsNames:
- app.local # Hostname for the certificate
Apply the certificate:
kubectl apply -f certificate-example.yaml
Verify the status:
kubectl get certificate
kubectl describe certificate app-tls-cert
Wait for the certificate to be ready:
kubectl wait --for=condition=ready certificate app-tls-cert --timeout=60s
Verify that the Secret has been created:
kubectl get secret app-tls-secret
Part 4: Configuring the Ingress with TLS
Step 4.1: Create an Ingress with TLS
Create ingress-tls.yaml:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress-tls
annotations:
cert-manager.io/cluster-issuer: selfsigned-issuer # Annotation for cert-manager
spec:
ingressClassName: nginx
tls:
- hosts:
- app.local
secretName: app-tls-secret # Reference to the certificate Secret
rules:
- host: app.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app-service
port:
number: 80
Note: If you use the cert-manager.io/cluster-issuer annotation, cert-manager will automatically create the certificate. Otherwise, reference the manually created Secret.
Apply the Ingress:
kubectl apply -f ingress-tls.yaml
Part 5: Testing HTTPS Access
Step 5.1: Configure the Hostname
Make sure app.local points to the Ingress Controller IP in /etc/hosts.
Step 5.2: Test HTTPS
Test HTTPS access:
# Ignore self-signed certificate verification
curl -k https://app.local
Or in the browser, accept the self-signed certificate (you will see a security warning, this is normal for a self-signed certificate).
Part 6: Automatic Certificate with Annotation
You can also let cert-manager create the certificate automatically via the annotation in the Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress-auto-tls
annotations:
cert-manager.io/cluster-issuer: selfsigned-issuer
spec:
ingressClassName: nginx
tls:
- hosts:
- app.local
secretName: app-tls-secret-auto
rules:
- host: app.local
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-app-service
port:
number: 80
Cert-manager will automatically create the certificate and the Secret.
Part 7: Cleanup
Delete the resources:
kubectl delete ingress app-ingress-tls
kubectl delete certificate app-tls-cert
kubectl delete clusterissuer selfsigned-issuer
kubectl delete secret app-tls-secret
To uninstall cert-manager:
kubectl delete -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.1/cert-manager.yaml
Lab Summary
In this lab, you installed cert-manager, configured a ClusterIssuer (self-signed for local testing), created a TLS certificate, and configured an Ingress with HTTPS. You learned how to automate TLS certificate management in Kubernetes.
Next Steps
The last lab in this module will show you how to configure multiple domains and virtual hosts with Ingress.
Lab 8.4: Multi-domains and Virtual Hosts
Lab created: December 2024