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
