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.
- Penerbit : Issuers, dan ClusterIssuers, adalah objek di Kubernetes yang mewakili otoritas sertifikat (CA) yang dapat menghasilkan sertifikat yang ditandatangani.
- Sertifikat : Sertifikat adalah resource dengan namespace yang mereferensikan Issuer atau ClusterIssuer dan akan diperbarui serta terus diperbarui.
- Permintaan Sertifikat : The CertificateRequest adalah resource dengan namespace yang digunakan untuk meminta sertifikat dari penerbit atau penerbit cluster.
- Pesanan ACME : Pesanan mewakili permintaan sertifikat yang akan dibuat setelah sumber daya CertificateRequest baru yang merujuk penerbit ACME telah dibuat
- Tantangan ACME :Saat Sumber daya Pesanan dibuat, sumber daya Tantangan untuk setiap nama DNS yang diotorisasi dengan server ACME akan dibuat oleh pengontrol pesanan.
- Webhook :Ini diterapkan sebagai pod lain bersama dengan pod Cert-Manager utama dan memiliki 3 fungsi: ValidatingAdmissionWebhook, MutatingAdmissionWebhook, dan CustomResourceConversionWebhook.
- 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
- Akun AWS(Buat jika Anda belum memilikinya).
- Cluster Kubernetes (Klik di sini untuk mempelajari cara membuat Cluster Kubernetes menggunakan Kops dan mengetahui lebih banyak tentangnya.)
- 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)
- Helm v3.5.3 (Klik di sini untuk mempelajari cara menginstal Helm di Server Ubuntu)
- S3 Bucket (Klik di sini untuk mempelajari cara membuat Bucket S3 di AWS).
- Nama Domain (Klik di sini untuk mempelajari cara mendaftarkan Domain di AWS).
- Peran IAM dengan izin admin(Klik di sini untuk mempelajari cara membuat peran IAM di AWS).
Apa yang akan kita lakukan?
- Periksa Ingress Controller di Cluster
- Menyiapkan Manajer-Sert
- Membuat File definisi objek untuk aplikasi sampel
- Siapkan Staging dan Produksi Mari Enkripsi Penerbit
- Menerapkan contoh aplikasi
- 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