GNU/Linux >> Belajar Linux >  >> Linux

Apa itu Cert-Manager dan cara menyiapkan Cert-Manager untuk sertifikat SSL di Kubernetes Cluster di AWS menggunakan Helm

Cert-Manager adalah pengontrol yang digunakan untuk manajemen sertifikat. Cert-Manager dapat membantu menerbitkan sertifikat dari berbagai penerbit seperti Let's Encrypt, HashiCorp Vault, Venafi, pasangan kunci penandatanganan sederhana, atau penandatanganan sendiri. Cert-Manager memvalidasi sertifikat, memastikan sertifikat terbaru, dan diperpanjang sebelum habis masa berlakunya. Cert-Manager terdiri dari beberapa komponen seperti yang disebutkan di bawah.

  1. Penerbit : Issuers, dan ClusterIssuers, adalah objek di Kubernetes yang mewakili otoritas sertifikat (CA) yang dapat menghasilkan sertifikat yang ditandatangani.
  2. Sertifikat : Sertifikat adalah resource dengan namespace yang mereferensikan Issuer atau ClusterIssuer dan akan diperbarui serta terus diperbarui.
  3. Permintaan Sertifikat : The CertificateRequest adalah resource dengan namespace yang digunakan untuk meminta sertifikat dari penerbit atau penerbit cluster.
  4. Pesanan ACME : Pesanan mewakili permintaan sertifikat yang akan dibuat setelah sumber daya CertificateRequest baru yang merujuk penerbit ACME telah dibuat
  5. Tantangan ACME :Saat Sumber daya Pesanan dibuat, sumber daya Tantangan untuk setiap nama DNS yang diotorisasi dengan server ACME akan dibuat oleh pengontrol pesanan.
  6. Webhook :Ini diterapkan sebagai pod lain bersama dengan pod Cert-Manager utama dan memiliki 3 fungsi: ValidatingAdmissionWebhook, MutatingAdmissionWebhook,  dan CustomResourceConversionWebhook.
  7. Injeksi CA r:Ini membantu untuk mengonfigurasi sertifikat untuk Memvalidasi Webhook, Mengubah Webhook,  dan Webhook Konversi.

Pada artikel ini, kami akan menyiapkan Cert-Manager dengan penerbit Let's Encrypt. Kami akan mengamankan aplikasi sampel kami menggunakan sertifikat TLS dan memiliki HTTPS di Hostname kami untuk mengakses aplikasi menggunakan Ingress. Untuk melakukannya, kami akan menambahkan anotasi ke Ingress sehingga resource sertifikat dibuat atas nama kami.

Untuk mengetahui secara detail tentang Cert-Manager, kunjungi dokumentasi resmi di sini. Fokus artikel ini adalah pada pengaturan Cert-Manager menggunakan Helm dan diasumsikan bahwa Anda sudah familiar dengan konsep yang terkait dengan Cert-Manager.

Prasyarat

  1. Akun AWS(Buat jika Anda belum memilikinya).
  2. Cluster Kubernetes (Klik di sini untuk mempelajari cara membuat Cluster Kubernetes menggunakan Kops dan mengetahui lebih banyak tentangnya.)
  3. Nginx Ingress Controller di K8S Cluster (Telusuri "Apa itu Ingress Controller dan bagaimana cara men-deploy Nginx Ingress Controller di Kubernetes Cluster di AWS menggunakan Helm" untuk belajar menyiapkan Nginx Ingress Controller)
  4. Helm v3.5.3 (Klik di sini untuk mempelajari cara menginstal Helm di Server Ubuntu)
  5. S3 Bucket (Klik di sini untuk mempelajari cara membuat Bucket S3 di AWS).
  6. Nama Domain (Klik di sini untuk mempelajari cara mendaftarkan Domain di AWS).
  7. Peran IAM dengan izin admin(Klik di sini untuk mempelajari cara membuat peran IAM di AWS).

Apa yang akan kita lakukan?

  1. Periksa Ingress Controller di Cluster
  2. Menyiapkan Manajer-Sert
  3. Membuat File definisi objek untuk aplikasi sampel
  4. Siapkan Staging dan Produksi Mari Enkripsi Penerbit
  5. Menerapkan contoh aplikasi
  6. Menerapkan Objek Ingress dengan TLS 

Periksa Ingress Controller di Cluster

Sebelum melanjutkan, periksa apakah Anda memiliki Nginx Ingress Controller yang berjalan di cluster.

kubectl get pods
kubectl get svc

Pengelola Sertifikat Pengaturan

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

Gunakan Helm v3.5.3 dan jalankan perintah berikut, ini akan menginstal Diagram Helm untuk 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

Pada screenshot di atas, Anda dapat melihat bahwa Helm Chart untuk Cert-Manager telah diinstal.

Periksa pod yang telah dibuat sebagai bagian dari Cert-Manager.

kubectl get pods -A

Anda dapat melihat 3 pod baru di namespace "cert-manager".

Buat file definisi objek untuk aplikasi sampel dan penerbit

Buat 1-nginx-main-app.yaml untuk aplikasi 1

Tautan Github:Klik di sini untuk menyalin file dari repo Github saya.

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

Buat 2-nginx-green-app.yaml untuk aplikasi 2.

Tautan Github:Klik di sini untuk menyalin file dari repo Github saya.

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          

Buat 3-nginx-blue-app.yaml untuk aplikasi 3

Tautan Github:Klik di sini untuk menyalin file dari repo Github saya.

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

Buat 4-tls-ingress.yaml untuk membuat aturan Ingress berbasis jalur dengan Staging Issuer.

Tautan Github:Klik di sini untuk menyalin file dari repo Github saya.

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

Buat 5-tls-ingress-prod-issuer.yaml untuk membuat aturan Ingress berbasis jalur dengan Production Issuer.

Tautan Github:Klik di sini untuk menyalin file dari repo Github saya.

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

Buat staging_issuer.yaml untuk Let's Encrypt Staging Issuer

Tautan Github:Klik di sini untuk menyalin file dari repo Github saya.

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

Buat production_issuer.yaml untuk Let's Encrypt Production Issuer

Tautan Github:Klik di sini untuk menyalin file dari repo Github saya.

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

Anda dapat menemukan semua file ini di repo Github saya di sini.

Setup Staging dan Produksi Mari Enkripsi Penerbit

Kami akan menginstal Staging dan Production Cluster Issuer.

Pementasan :

Staging memiliki "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

Ini menciptakan rahasia bernama "letsencrypt-staging-private-key"

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

Produksi :

Produksi memiliki "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

Ini menciptakan rahasia bernama "letsencrypt-production-private-key"

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

Terapkan contoh aplikasi

Mari kita terapkan 3 contoh aplikasi kita.

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

Menerapkan Ingress

Pertama, mari kita terapkan Ingress dengan Staging Issuer.

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

Setelah resource Ingress dibuat, Anda dapat melihat semua yang terjadi di latar belakang untuk mengeluarkan sertifikat untuk bagian TLS dari 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

Aplikasi sekarang dapat diakses melalui HTTPS, tetapi karena kami telah menggunakan Lingkungan Staging dari penerbit Let's Encrypt, kami akan mendapatkan peringatan  "Koneksi Anda ke situs ini tidak aman".

Deploy Ingress dengan Production Issuer.

Sekarang, mari kita hapus Ingress menggunakan Staging dan buat Ingress baru yang diarahkan ke penerbit Production.

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

Kali ini jika Anda mencoba mengakses aplikasi, Anda tidak akan mendapatkan peringatan apa pun seperti "Sambungan ke situs ini tidak aman".

Kesimpulan

Dalam artikel ini, kita melihat langkah-langkah untuk menyiapkan Manajer-Sert di Cluster Kubernetes. Kami menerapkan aplikasi sampel dan mengarahkan lalu lintas melalui ingress berdasarkan jalur dan mengamankan koneksi dengan HTTPS dengan menggunakan sertifikat yang dikeluarkan oleh penerbit cluster Let's Encrypt. Kami pertama-tama mengeluarkan sertifikat menggunakan lingkungan Let's Encrypt Staging, lalu menggunakan lingkungan produksi Let's Encrypt


Linux
  1. Cara Mengatur Server Pesan Instan sendiri menggunakan Openfire dan Spark

  2. Setup Cluster Kubernetes di Ubuntu 20.04 menggunakan kubeadm

  3. Cara Menginstal Kubernetes Cert-Manager dan Mengonfigurasi Let's Encrypt

  1. Apa itu Helm? Bagan Helm dan Helm Dijelaskan

  2. Apa itu Kubernetes DaemonSet dan Bagaimana Cara Menggunakannya?

  3. Cara Mengatur Cluster Kubernetes(k8s) di HA dengan Kubeadm

  1. Cara Menyiapkan Cluster Kubernetes di Google Cloud Platform (GCP)

  2. Cara Mengatur Ingress Controller NGINX di Kubernetes

  3. Cara Memasang dan Menggunakan Helm di Kubernetes