Cert-Manager ist ein Controller, der für die Zertifikatsverwaltung verwendet wird. Ein Cert-Manager kann helfen, Zertifikate von verschiedenen Ausstellern wie Let’s Encrypt, HashiCorp Vault, Venafi, ein einfaches Signaturschlüsselpaar oder selbstsignierte Zertifikate auszustellen. Cert-Manager validiert Zertifikate, stellt sicher, dass sie auf dem neuesten Stand sind, und verlängert sie vor Ablauf. Cert-Manager besteht aus mehreren Komponenten, wie unten erwähnt.
- Emittent :Aussteller und Cluster-Aussteller sind Objekte in Kubernetes, die Zertifizierungsstellen (CAs) darstellen, die signierte Zertifikate generieren können.
- Zertifikat : Ein Zertifikat ist eine Namespace-Ressource, die auf einen Aussteller oder Cluster-Aussteller verweist und erneuert und auf dem neuesten Stand gehalten wird.
- Zertifikatsanforderung : Die CertificateRequest ist eine Namespace-Ressource, die verwendet wird, um ein Zertifikat von einem Aussteller oder Cluster-Aussteller anzufordern.
- ACME-Befehle : Eine Bestellung stellt eine Zertifikatsanforderung dar, die erstellt wird, sobald eine neue CertificateRequest-Ressource erstellt wurde, die auf einen ACME-Aussteller verweist
- ACME-Herausforderungen :Wenn eine Bestellressource erstellt wird, werden Herausforderungsressourcen für jeden DNS-Namen, der mit dem ACME-Server autorisiert wird, vom Bestellcontroller erstellt.
- Webhook :Er wird zusammen mit den Haupt-Cert-Manager-Pods als weiterer Pod bereitgestellt und hat drei Funktionen: ValidatingAdmissionWebhook, MutatingAdmissionWebhook und CustomResourceConversionWebhook.
- CA-Injektion r:Es hilft, Zertifikate für validierende Webhooks, mutierende Webhooks und Conversion-Webhooks zu konfigurieren.
In diesem Artikel richten wir einen Cert-Manager mit dem Aussteller von Let’s Encrypt ein. Wir werden unsere Beispielanwendung mit den TLS-Zertifikaten sichern und HTTPS in unserem Hostnamen haben, um über Ingress auf die Anwendung zuzugreifen. Dazu fügen wir Anmerkungen zum Ingress hinzu, sodass die Zertifikatsressource in unserem Namen erstellt wird.
Um mehr über Cert-Manager zu erfahren, besuchen Sie die offizielle Dokumentation hier. Der Schwerpunkt dieses Artikels liegt auf der Einrichtung des Cert-Managers mit Helm, und es wird davon ausgegangen, dass Sie mit den Konzepten des Cert-Managers vertraut sind.
Voraussetzungen
- AWS-Konto (erstellen wenn Sie noch keins haben).
- Kubernetes-Cluster (Klicken Sie hier, um zu erfahren, wie Sie einen Kubernetes-Cluster mit Kops erstellen und mehr darüber erfahren.)
- Nginx Ingress Controller im K8S-Cluster (Suchen Sie nach „What is Ingress Controller and how to deploy Nginx Ingress Controller in Kubernetes Cluster on AWS using Helm“, um zu erfahren, wie Nginx Ingress Controller eingerichtet wird)
- Helm v3.5.3 (Klicken Sie hier, um zu erfahren, wie Sie Helm auf Ubuntu Server installieren)
- S3-Bucket (Klicken Sie hier, um zu erfahren, wie Sie einen S3-Bucket auf AWS erstellen).
- Domänenname (Klicken Sie hier, um zu erfahren, wie Sie eine Domäne auf AWS registrieren).
- IAM-Rolle mit Administratorberechtigungen (Klicken Sie hier um zu erfahren, wie Sie eine IAM-Rolle auf AWS erstellen).
Was werden wir tun?
- Ingress-Controller im Cluster prüfen
- Einen Cert-Manager einrichten
- Objektdefinitionsdateien für eine Beispielanwendung erstellen
- Let's Encrypt Issuer für Staging und Produktion einrichten
- Stellen Sie eine Beispielanwendung bereit
- Stellen Sie ein Ingress-Objekt mit TLS bereit
Prüfen Sie den Ingress-Controller im Cluster
Bevor Sie fortfahren, prüfen Sie, ob der Nginx Ingress Controller im Cluster ausgeführt wird.
kubectl get pods
kubectl get svc

Setup Cert Manager
Note: I have used Helm binary present at my current location, hence you can see ./helm in screenshots.
Verwenden Sie Helm v3.5.3 und führen Sie die folgenden Befehle aus. Dadurch wird das Helm-Diagramm für Cert-Manager installiert.
kubectl create namespace cert-manager
helm repo add jetstack https://charts.jetstack.io
helm repo update helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.2.0 --set installCRDs=true

Im obigen Screenshot sehen Sie, dass das Helm Chart für Cert-Manager installiert wurde.
Überprüfen Sie die Pods, die als Teil des Cert-Managers erstellt wurden.
kubectl get pods -A

Sie können 3 neue Pods im Namespace „cert-manager“ sehen.
Erstellen Sie Objektdefinitionsdateien für eine Beispielanwendung und Aussteller
Erstellen Sie 1-nginx-main-app.yaml für Anwendung 1
Github-Link:Klicken Sie hier, um die Datei aus meinem Github-Repo zu kopieren.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx-deploy-main
spec:
replicas: 1
selector:
matchLabels:
run: nginx-main
template:
metadata:
labels:
run: nginx-main
spec:
containers:
- image: nginx
name: nginx
---
apiVersion: v1
kind: Service
metadata:
name: nginx-deploy-main
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
selector:
run: nginx-main Erstellen Sie 2-nginx-green-app.yaml für Anwendung 2.
Github-Link:Klicken Sie hier, um die Datei aus meinem Github-Repo zu kopieren.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx-deploy-green
spec:
replicas: 1
selector:
matchLabels:
run: nginx-green
template:
metadata:
labels:
run: nginx-green
spec:
volumes:
- name: webdata
emptyDir: {}
initContainers:
- name: web-content
image: busybox
volumeMounts:
- name: webdata
mountPath: "/webdata"
command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=green>GREEN</font></h1>" > /webdata/index.html']
containers:
- image: nginx
name: nginx
volumeMounts:
- name: webdata
mountPath: "/usr/share/nginx/html"
---
---
apiVersion: v1
kind: Service
metadata:
name: nginx-deploy-green
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
selector:
run: nginx-green Erstellen Sie 3-nginx-blue-app.yaml für Anwendung 3
Github-Link:Klicken Sie hier, um die Datei aus meinem Github-Repo zu kopieren.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
run: nginx
name: nginx-deploy-blue
spec:
replicas: 1
selector:
matchLabels:
run: nginx-blue
template:
metadata:
labels:
run: nginx-blue
spec:
volumes:
- name: webdata
emptyDir: {}
initContainers:
- name: web-content
image: busybox
volumeMounts:
- name: webdata
mountPath: "/webdata"
command: ["/bin/sh", "-c", 'echo "<h1>I am <font color=blue>BLUE</font></h1>" > /webdata/index.html']
containers:
- image: nginx
name: nginx
volumeMounts:
- name: webdata
mountPath: "/usr/share/nginx/html"
---
apiVersion: v1
kind: Service
metadata:
name: nginx-deploy-blue
spec:
type: ClusterIP
ports:
- port: 80
targetPort: 80
selector:
run: nginx-blue
Erstellen Sie 4-tls-ingress.yaml, um pfadbasierte Ingress-Regeln mit Staging Issuer zu erstellen.
Github-Link:Klicken Sie hier, um die Datei aus meinem Github-Repo zu kopieren.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: letsencrypt-staging
name: ingress-resource-3
spec:
tls:
- hosts:
- kops.devopslee.com
secretName: sample-kubernetes-tls
rules:
- host: kops.devopslee.com
http:
paths:
- path: /
backend:
serviceName: nginx-deploy-main
servicePort: 80
- path: /blue
backend:
serviceName: nginx-deploy-blue
servicePort: 80
- path: /green
backend:
serviceName: nginx-deploy-green
servicePort: 80 Erstellen Sie 5-tls-ingress-prod-issuer.yaml, um pfadbasierte Ingress-Regeln mit Production Issuer zu erstellen.
Github-Link:Klicken Sie hier, um die Datei aus meinem Github-Repo zu kopieren.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
cert-manager.io/cluster-issuer: letsencrypt-production
name: ingress-resource-3
spec:
tls:
- hosts:
- kops.devopslee.com
secretName: sample-kubernetes-tls
rules:
- host: kops.devopslee.com
http:
paths:
- path: /
backend:
serviceName: nginx-deploy-main
servicePort: 80
- path: /blue
backend:
serviceName: nginx-deploy-blue
servicePort: 80
- path: /green
backend:
serviceName: nginx-deploy-green
servicePort: 80 Erstellen Sie staging_issuer.yaml für Let's Encrypt Staging Issuer
Github-Link:Klicken Sie hier, um die Datei aus meinem Github-Repo zu kopieren.
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
# Email address used for ACME registration
email: your-email-id-here
server: https://acme-staging-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# Name of a secret used to store the ACME account private key
name: letsencrypt-staging-private-key
# Add a single challenge solver, HTTP01 using nginx
solvers:
- http01:
ingress:
class: nginx
Erstellen Sie production_issuer.yaml für Let's Encrypt Production Issuer
Github-Link:Klicken Sie hier, um die Datei aus meinem Github-Repo zu kopieren.
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
name: letsencrypt-production
spec:
acme:
# Email address used for ACME registration
email: your-email-id-here
server: https://acme-v02.api.letsencrypt.org/directory
privateKeySecretRef:
# Name of a secret used to store the ACME account private key
name: letsencrypt-production-private-key
# Add a single challenge solver, HTTP01 using nginx
solvers:
- http01:
ingress:
class: nginx Alle diese Dateien finden Sie hier in meinem Github-Repository.
Let's Encrypt Issuer für Staging und Produktion einrichten
Wir werden sowohl Staging als auch Production Cluster Issuer installieren.
Inszenierung :
Staging hat „Server:https://acme-staging-v02.api.letsencrypt.org/directory“
kubectl logs cert-manager-56f5c44b5d-jn46m -n cert-manager -f
kubectl apply -f cluster-issuer/staging_issuer.yaml
Dadurch wird ein Geheimnis namens "letsencrypt-staging-private-key"
erstelltkubectl get secret letsencrypt-staging-private-key -n cert-manager -o json

Produktion :
Produktion hat "Server:https://acme-v02.api.letsencrypt.org/directory"
kubectl logs cert-manager-56f5c44b5d-jn46m -n cert-manager -f
kubectl apply -f cluster-issuer/production_issuer.yaml

Dadurch wird ein Geheimnis namens "letsencrypt-production-private-key"
erstelltkubectl get secret letsencrypt-production-private-key -n cert-manager -o json

Stellen Sie eine Beispielanwendung bereit
Stellen wir unsere 3 Beispielanwendungen bereit.
kubectl apply -f sample-app/1-nginx-main-app.yaml
kubectl apply -f sample-app/2-nginx-green-app.yaml
kubectl apply -f sample-app/3-nginx-blue-app.yaml
Check the deployments, pods, and services created by the above commands.
kubectl get deployments
kubectl get pods kubectl
get service

Ingress bereitstellen
Lassen Sie uns zuerst ein Ingress mit Staging Issuer bereitstellen.
kubectl apply -f sample-app/4-tls-ingress.yaml
kubectl get ingress
kubectl describe ingress ingress-resource-3

Nachdem die Ingress-Ressource erstellt wurde, können Sie sehen, was alles im Hintergrund passiert ist, um das Zertifikat für den TLS-Abschnitt von Ingress auszustellen.
kubectl get certificate -A
kubectl get certificaterequests.cert-manager.io -A
kubectl get orders.acme.cert-manager.io -A
kubectl get challenges.acme.cert-manager.io -A
kubectl get certificate -o json | grep secretName
kubectl get secret sample-kubernetes-tls -o yaml

Auf die Anwendung kann jetzt über HTTPS zugegriffen werden, aber da wir die Staging-Umgebung des Let's Encrypt-Ausstellers verwendet haben, erhalten wir eine Warnung:"Ihre Verbindung zu dieser Website ist nicht sicher".

Stellen Sie Ingress mit dem Produktionsaussteller bereit.
Lassen Sie uns nun den Ingress mithilfe des Staging löschen und einen neuen Ingress erstellen, der auf den Produktionsaussteller verweist.
kubectl delete -f sample-app/4-tls-ingress.yaml
kubectl apply -f sample-app/5-tls-ingress-prod-issuer.yaml
kubectl get ingress
kubectl describe ingress ingress-resource-3

Wenn Sie dieses Mal versuchen, auf die Anwendung zuzugreifen, erhalten Sie keine Warnung wie „Die Verbindung zu dieser Website ist nicht sicher“.

Schlussfolgerung
In diesem Artikel haben wir die Schritte zum Einrichten eines Cert-Managers im Kubernetes-Cluster gesehen. Wir haben eine Beispielanwendung bereitgestellt und den Datenverkehr basierend auf dem Pfad durch Ingress geleitet und die Verbindung mit HTTPS gesichert, indem wir ein Zertifikat verwendet haben, das vom Aussteller des Let’s Encrypt-Clusters ausgestellt wurde. Wir haben zuerst ein Zertifikat mit der Staging-Umgebung von Let's Encrypt ausgestellt und dann die Produktionsumgebung von Let's Encrypt verwendet
