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