GNU/Linux >> Znalost Linux >  >> Linux

Co je Cert-Manager a jak nastavit Cert-Manager pro certifikáty SSL v Kubernetes Cluster na AWS pomocí Helm

Cert-Manager je kontrolér používaný pro správu certifikátů. Cert-Manager může pomoci vydávat certifikáty od různých vydavatelů, jako je Let’s Encrypt, HashiCorp Vault, Venafi, jednoduchý pár podpisových klíčů nebo certifikáty s vlastním podpisem. Cert-Manager ověřuje certifikáty, zajišťuje jejich aktuálnost a obnovuje je před vypršením platnosti. Cert-Manager se skládá z několika komponent, jak je uvedeno níže.

  1. Emitent : Vydavatelé a ClusterIssuers jsou objekty v Kubernetes, které představují certifikační autority (CA), které mohou generovat podepsané certifikáty.
  2. Certifikát : Certifikát je zdroj s jmenným prostorem, který odkazuje na Vydavatele nebo Vydavatele clusteru a bude obnovován a aktualizován.
  3. Žádost o certifikát : CertificateRequest je zdroj s prostorem názvů, který se používá k vyžádání certifikátu od vydavatele nebo vydavatele clusteru.
  4. Objednávky ACME : Objednávka představuje žádost o certifikát, která bude vytvořena, jakmile bude vytvořen nový zdroj CertificateRequest odkazující na vydavatele ACME
  5. Výzvy ACME :Když je vytvořen zdroj objednávky, zdroje výzvy pro každý název DNS, který je autorizován serverem ACME, vytvoří správce objednávky.
  6. Webhook :Je nasazen jako další modul spolu s hlavními moduly Cert-Manager a má 3 funkce: ValidatingAdmissionWebhook, MutatingAdmissionWebhook a CustomResourceConversionWebhook.
  7. CA Injecto r:Pomáhá nakonfigurovat certifikáty pro ověřování webhooků, mutování webhooků a konverzní webhooky.

V tomto článku nastavíme Cert-Manager s vydavatelem Let's Encrypt. Naši ukázkovou aplikaci zabezpečíme pomocí certifikátů TLS a v názvu hostitele budeme mít HTTPS pro přístup k aplikaci pomocí Ingress. Za tímto účelem přidáme do Ingressu anotace, aby byl zdroj certifikátu vytvořen naším jménem.

Chcete-li se podrobně dozvědět o Cert-Manageru, navštivte oficiální dokumentaci zde. Tento článek se zaměřuje na nastavení Cert-Manager pomocí Helm a předpokládá se, že jste obeznámeni s koncepty souvisejícími s Cert-Manager.

Předpoklady

  1. Účet AWS (vytvořte, pokud jej nemáte).
  2. Cluster Kubernetes (Kliknutím sem se naučíte vytvářet cluster Kubernetes pomocí Kops a dozvíte se o něm více.)
  3. Nginx Ingress Controller v K8S Cluster (vyhledejte „Co je Ingress Controller a jak nasadit Nginx Ingress Controller v Kubernetes Cluster na AWS pomocí Helm“, abyste se naučili nastavit Nginx Ingress Controller)
  4. Helm v3.5.3 (Klikněte sem a naučte se nainstalovat Helm na server Ubuntu)
  5. Bucket S3 (Kliknutím sem se dozvíte, jak vytvořit Bucket S3 na AWS).
  6. Název domény (kliknutím sem se dozvíte, jak zaregistrovat doménu na AWS).
  7. Role IAM s oprávněními správce (Kliknutím sem se dozvíte, jak vytvořit roli IAM na AWS).

Co budeme dělat?

  1. Zkontrolujte Ingress Controller v clusteru
  2. Nastavení správce certifikátů
  3. Vytvořte soubory definice objektů pro ukázkovou aplikaci
  4. Nastavení fáze a produkce Let's Encrypt Issuer
  5. Nasazení ukázkové aplikace
  6. Nasazení vstupního objektu pomocí TLS 

Zkontrolujte Ingress Controller v klastru

Než budete pokračovat, zkontrolujte, zda máte v clusteru spuštěný Nginx Ingress Controller.

kubectl get pods
kubectl get svc

Správce nastavení certifikátů

Note: I have used Helm binary present at my current location, hence you can see ./helm in screenshots.

Použijte Helm v3.5.3 a spusťte následující příkazy. Tím se nainstaluje Helm Chart pro Cert-Manager.

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

Na výše uvedeném snímku obrazovky můžete vidět, že Helm Chart pro Cert-Manager byl nainstalován.

Zkontrolujte moduly, které byly vytvořeny jako součást Cert-Manager.

kubectl get pods -A

Ve jmenném prostoru "cert-manager" můžete vidět 3 nové moduly.

Vytvořte definiční soubory objektů pro ukázkovou aplikaci a vydavatele

Vytvořte 1-nginx-main-app.yaml pro aplikaci 1

Odkaz Github:Kliknutím sem zkopírujete soubor z mého úložiště Github.

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

Vytvořte 2-nginx-green-app.yaml pro aplikaci 2.

Odkaz Github:Kliknutím sem zkopírujete soubor z mého úložiště Github.

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          

Vytvořte 3-nginx-blue-app.yaml pro aplikaci 3

Odkaz Github:Kliknutím sem zkopírujete soubor z mého úložiště Github.

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

Vytvořte soubor 4-tls-ingress.yaml pro vytváření pravidel Ingress založených na cestě pomocí Staging Issuer.

Odkaz Github:Kliknutím sem zkopírujete soubor z mého úložiště Github.

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

Vytvořte soubor 5-tls-ingress-prod-issuer.yaml pro vytváření pravidel Ingress založených na cestě s Produkčním vydavatelem.

Odkaz Github:Kliknutím sem zkopírujete soubor z mého úložiště Github.

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

Vytvořte staging_issuer.yaml pro Let's Encrypt Staging Issuer

Odkaz Github:Kliknutím sem zkopírujete soubor z mého úložiště Github.

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

Vytvořte production_issuer.yaml pro Let's Encrypt Production Issuer

Odkaz Github:Kliknutím sem zkopírujete soubor z mého úložiště Github.

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

Všechny tyto soubory naleznete v mém repozitáři Github zde.

Nastavení fáze a produkce Let's Encrypt Issuer

Nainstalujeme jak Staging, tak Production Cluster Issuer.

Staging :

Staging má "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

Tím se vytvoří tajný klíč s názvem „letsencrypt-staging-private-key“

kubectl get secret letsencrypt-staging-private-key -n cert-manager -o json

Produkce :

Produkce má "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

Tím se vytvoří tajemství s názvem „letsencrypt-production-private-key“

kubectl get secret letsencrypt-production-private-key -n cert-manager -o json

Nasazení ukázkové aplikace

Pojďme nasadit naše 3 ukázkové aplikace.

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

Nasadit Ingress

Nejprve nasadíme Ingress se Staging Issuer.

kubectl apply -f sample-app/4-tls-ingress.yaml
kubectl get ingress
kubectl describe ingress ingress-resource-3

Po vytvoření zdroje Ingress můžete vidět, co všechno se stalo na pozadí, abyste mohli vydat certifikát pro sekci TLS Ingress.

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

K aplikaci je nyní možné přistupovat přes HTTPS, ale protože jsme použili prostředí Staging Environment vydavatele Let's Encrypt, dostaneme varování  „Vaše připojení k tomuto webu není zabezpečené“.

Nasaďte Ingress u produkčního vydavatele.

Nyní smažeme Ingress pomocí Stagingu a vytvoříme nový Ingress směřující na produkčního vydavatele.

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

Tentokrát, pokud se pokusíte o přístup k aplikaci, neobdržíte žádné varování jako „Připojení k tomuto webu není zabezpečené“.

Závěr

V tomto článku jsme viděli kroky k nastavení Cert-Manager na Kubernetes Cluster. Nasadili jsme ukázkovou aplikaci a směrovali provoz přes ingress na základě cesty a zabezpečili spojení s HTTPS pomocí certifikátu vydaného vydavatelem clusteru Let's Encrypt. Nejprve jsme vydali certifikát pomocí prostředí Let's Encrypt Staging a poté jsme použili produkční prostředí Let's Encrypt


Linux
  1. Jak nastavit vlastní Instant Messaging Server pomocí Openfire a Spark

  2. Nastavte Kubernetes Cluster na Ubuntu 20.04 pomocí kubeadm

  3. Jak nainstalovat Kubernetes Cert-Manager a nakonfigurovat Let’s Encrypt

  1. Co je Helm? Vysvětlení map kormidla a kormidla

  2. Co je Kubernetes DaemonSet a jak jej používat?

  3. Jak nastavit Kubernetes(k8s) Cluster v HA s Kubeadm

  1. Jak nastavit Kubernetes Cluster na Google Cloud Platform (GCP)

  2. Jak nastavit NGINX Ingress Controller v Kubernetes

  3. Jak nainstalovat a používat Helm v Kubernetes