GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was ist Cert-Manager und wie richtet man Cert-Manager für SSL-Zertifikate in Kubernetes Cluster on AWS mit Helm ein

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.

  1. Emittent :Aussteller und Cluster-Aussteller sind Objekte in Kubernetes, die Zertifizierungsstellen (CAs) darstellen, die signierte Zertifikate generieren können.
  2. Zertifikat : Ein Zertifikat ist eine Namespace-Ressource, die auf einen Aussteller oder Cluster-Aussteller verweist und erneuert und auf dem neuesten Stand gehalten wird.
  3. Zertifikatsanforderung : Die CertificateRequest ist eine Namespace-Ressource, die verwendet wird, um ein Zertifikat von einem Aussteller oder Cluster-Aussteller anzufordern.
  4. ACME-Befehle : Eine Bestellung stellt eine Zertifikatsanforderung dar, die erstellt wird, sobald eine neue CertificateRequest-Ressource erstellt wurde, die auf einen ACME-Aussteller verweist
  5. ACME-Herausforderungen :Wenn eine Bestellressource erstellt wird, werden Herausforderungsressourcen für jeden DNS-Namen, der mit dem ACME-Server autorisiert wird, vom Bestellcontroller erstellt.
  6. Webhook :Er wird zusammen mit den Haupt-Cert-Manager-Pods als weiterer Pod bereitgestellt und hat drei Funktionen: ValidatingAdmissionWebhook, MutatingAdmissionWebhook und CustomResourceConversionWebhook.
  7. 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

  1. AWS-Konto (erstellen wenn Sie noch keins haben).
  2. Kubernetes-Cluster (Klicken Sie hier, um zu erfahren, wie Sie einen Kubernetes-Cluster mit Kops erstellen und mehr darüber erfahren.)
  3. 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)
  4. Helm v3.5.3 (Klicken Sie hier, um zu erfahren, wie Sie Helm auf Ubuntu Server installieren)
  5. S3-Bucket (Klicken Sie hier, um zu erfahren, wie Sie einen S3-Bucket auf AWS erstellen).
  6. Domänenname (Klicken Sie hier, um zu erfahren, wie Sie eine Domäne auf AWS registrieren).
  7. IAM-Rolle mit Administratorberechtigungen (Klicken Sie hier um zu erfahren, wie Sie eine IAM-Rolle auf AWS erstellen).

Was werden wir tun?

  1. Ingress-Controller im Cluster prüfen
  2. Einen Cert-Manager einrichten
  3. Objektdefinitionsdateien für eine Beispielanwendung erstellen
  4. Let's Encrypt Issuer für Staging und Produktion einrichten
  5. Stellen Sie eine Beispielanwendung bereit
  6. 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"

erstellt
kubectl 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"

erstellt
kubectl 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


Linux
  1. Was ist Helm? Helm und Helmkarten erklärt

  2. Was ist Kubernetes DaemonSet und wie wird es verwendet?

  3. So richten Sie einen eigenen Instant Messaging-Server mit Openfire und Spark ein

  4. Kubernetes-Cluster unter Ubuntu 20.04 mit kubeadm einrichten

  5. So installieren Sie Kubernetes Cert-Manager und konfigurieren Let’s Encrypt

Was ist Terraform und wie wird es auf AWS EC2 installiert und verwendet?

So erstellen Sie einen Kubernetes-Cluster mit AWS CLI

So stellen Sie Anwendungen auf Kubernetes mit Helm bereit

So stellen Sie Kubernetes-Cluster auf AWS mit Amazon EKS bereit

So generieren Sie selbstsignierte SSL-Zertifikate mit OpenSSL

So richten Sie einen Linux-VPN-Server und -Client mit OpenVPN ein