Cert-Manager là bộ điều khiển được sử dụng để quản lý chứng chỉ. Cert-Manager có thể giúp cấp chứng chỉ từ các đơn vị phát hành khác nhau như Let’s Encrypt, HashiCorp Vault, Venafi, cặp khóa ký đơn giản hoặc tự ký. Cert-Manager xác thực chứng chỉ, đảm bảo chúng được cập nhật và gia hạn trước khi hết hạn. Cert-Manager bao gồm một số thành phần như đã đề cập bên dưới.
Để biết thông tin chi tiết về Cert-Manager, hãy truy cập tài liệu chính thức tại đây. Bài viết này tập trung vào việc thiết lập Cert-Manager bằng Helm và giả định rằng bạn đã quen thuộc với các khái niệm liên quan đến Cert-Manager.
Sử dụng Helmv3.5.3 và thực hiện các lệnh sau, lệnh này sẽ cài đặt Helm Chart cho Cert-Manager.
Trong ảnh chụp màn hình ở trên, bạn có thể thấy Helm Chart cho Cert-Manager đã được cài đặt.
Kiểm tra các pod đã được tạo như một phần của Cert-Manager.
Bạn có thể thấy 3 pod mới trong không gian tên "cert-manager".
Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Create2-nginx-green-app.yaml cho ứng dụng 2.
Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Tạo 3-nginx-blue-app.yaml cho ứng dụng 3
Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Create4-tls-ingress.yaml để tạo các quy tắc Ingress dựa trên đường dẫn với Staging Issuer.
Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Create5-tls-ingress-prod-issuer.yaml để tạo các quy tắc Ingress dựa trên đường dẫn với ProductionIssuer.
Liên kết Github: Nhấp vàotại đâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Tạo staging_issuer.yaml cho Let's EncryptStaging Issuer
Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Tạo production_issuer.yaml cho Let's Encrypt Production Issuer
Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Bạn có thể tìm thấy tất cả các tệp này trên kho lưu trữ Github của tôitại đây.
Staging:
Staging có "máy chủ: https://acme-staging-v02.api.letsencrypt.org/directory"
Production:
Production có "server: https://acme-v02.api.letsencrypt.org/directory"
Điều này tạo ra một bí mật có tên là "letsencrypt-production-private-key"
Sau khi tài nguyên Ingress được tạo, bạn có thể xem mọi thứ đã diễn ra ở chế độ nền để cấp chứng chỉ cho phần TLS của Ingress.
Bây giờ có thể truy cập ứng dụng qua HTTPS, nhưng vì chúng tôi đã sử dụng Môi trường dàn dựng của đơn vị phát hành Let's Encrypt nên chúng tôi sẽ nhận được cảnh báo "Kết nối của bạn tới trang web này không an toàn".
Triển khai Ingress với ProductionIssuer.
Bây giờ, hãy xóa Ingress bằng cách sử dụng Staging và tạo một Ingress mới trỏ tới đơn vị phát hành Production.
Lần này nếu bạn thử truy cập ứng dụng, bạn sẽ không nhận được bất kỳ cảnh báo nào như "Kết nối đến trang web này không an toàn".
- Issuer:Issuers và ClusterIssuers là các đối tượng trong Kubernetes đại diện cho các cơ quan cấp chứng chỉ (CA) có thể tạo chứng chỉ đã ký.
- Certificate:ACertificate là tài nguyên có không gian tên tham chiếu đến một Issuer hoặc ClusterIssuer và sẽ được gia hạn và cập nhật thường xuyên.
- CertificateRequest:CertificateRequest là tài nguyên có không gian tên được sử dụng để yêu cầu chứng chỉ từ một đơn vị cấp hoặc đơn vị cấp cụm.
- ACME Orders:Order đại diện cho một yêu cầu chứng chỉ sẽ được tạo sau khi một tài nguyên CertificateRequest mới tham chiếu đến đơn vị cấp ACME được tạo
- ACME Challenges: Khi một Orderresource được tạo, các Challengeresource cho mỗi tên DNS đang được ủy quyền với máy chủ ACME sẽ được order tạo controller.
- Webhook: Được triển khai như một pod khác cùng với các pod Cert-Manager chính và có 3 chức năng: ValidatingAdmissionWebhook, MutatingAdmissionWebhook và CustomResourceConversionWebhook.
- CA Injectorr: Giúp cấu hình chứng chỉ cho Validating Webhooks, Mutating Webhooks và Conversion Webhooks.
Để biết thông tin chi tiết về Cert-Manager, hãy truy cập tài liệu chính thức tại đây. Bài viết này tập trung vào việc thiết lập Cert-Manager bằng Helm và giả định rằng bạn đã quen thuộc với các khái niệm liên quan đến Cert-Manager.
Điều kiện tiên quyết
- Tài khoản AWS (Tạonếu bạn chưa có).
- Cụm Kubernetes (Nhấp vào đây để tìm hiểu cách tạo Cụm Kubernetes bằng Kops và tìm hiểu thêm về cụm này.)
- Bộ điều khiển Nginx Ingress trong Cụm K8S (Tìm kiếm "Bộ điều khiển Ingress là gì và cách triển khai Bộ điều khiển Nginx Ingress trong Cụm Kubernetes trên AWS bằng Helm" để tìm hiểu cách thiết lập Bộ điều khiển Nginx Ingress)
- Helm v3.5.3 (Nhấp vào đây để tìm hiểu cách cài đặt Helm trên Máy chủ Ubuntu)
- Gầu S3 (Nhấp vào đây để tìm hiểu cách tạo Gầu S3 trên AWS).
- Tên miền (Clickheređể tìm hiểu cách đăng ký Miền trên AWS).
- Vai trò IAM với quyền quản trị (Clickheređể tìm hiểu cách tạo vai trò IAM trên AWS).
Chúng ta sẽ làm gì?
- Kiểm tra Bộ điều khiển Ingress trong Cụm
- Thiết lập Cert-Manager
- Tạo tệp định nghĩa Object cho ứng dụng mẫu
- Thiết lập Trình phân đoạn và Sản xuất Let's Encrypt Issuer
- Triển khai ứng dụng mẫu
- Triển khai Đối tượng Ingress với TLS
Kiểm tra Bộ điều khiển Ingress trong Cụm
Trước khi tiếp tục, hãy kiểm tra xem bạn có Bộ điều khiển Ingress Nginx đang chạy trong cụm không.
Mã:
kubectl get pods
Mã:
kubectl get svc
Thiết lập Cert Manager
Mã:
Lưu ý: Tôi đã sử dụng Helm binary hiện tại tại vị trí hiện tại của mình, do đó bạn có thể thấy ./helm trong ảnh chụp màn hình.
Mã:
kubectl create namespace cert-manager
Mã:
helm repo add jetstack https://charts.jetstack.io
Mã:
helm repo update helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.2.0 --set installCRDs=true
Trong ảnh chụp màn hình ở trên, bạn có thể thấy Helm Chart cho Cert-Manager đã được cài đặt.
Kiểm tra các pod đã được tạo như một phần của Cert-Manager.
Mã:
kubectl get pods -A
Bạn có thể thấy 3 pod mới trong không gian tên "cert-manager".
CreateObject các tệp định nghĩa cho một ứng dụng mẫu và các đơn vị phát hành
Tạo 1-nginx-main-app.yaml cho ứng dụng 1Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Mã:
apiVersion: apps/v1kind: Triển khaimetadata: labels: run: nginx name: nginx-deploy-mainspec: replicas: 1 selector: matchLabels: run: nginx-main template: metadata: labels: run: nginx-main spec: containers: - image: nginx name: nginx---apiVersion: v1kind: Servicemetadata: name: nginx-deploy-mainspec: type: ClusterIP ports: - port: 80 targetPort: 80 selector: run: nginx-main
Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Mã:
apiVersion: apps/v1kind: Deploymentmetadata: labels: run: nginx name: nginx-deploy-greenspec: 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 "[HEADING=1]Tôi là XANH LÁ[/HEADING]" > /webdata/index.html'] containers: - image: nginx name: nginx volumeMounts: - name: webdata mountPath: "/usr/share/nginx/html"------apiVersion: v1kind: Servicemetadata: name: nginx-deploy-greenspec: type: ClusterIP ports: - port: 80 targetPort: 80 selector: run: nginx-green
Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Mã:
apiVersion: apps/v1kind: Deploymentmetadata: labels: chạy: nginx tên: nginx-deploy-bluespec: bản sao: 1 selector: matchLabels: chạy: nginx-blue mẫu: siêu dữ liệu: nhãn: chạy: nginx-blue spec: khối lượng: - tên: webdata emptyDir: {} initContainers: - tên: web-content hình ảnh: busybox volumeMounts: - tên: webdata mountPath: "/webdata" lệnh: ["/bin/sh", "-c", 'echo "[HEADING=1]Tôi là BLUE[/HEADING]" > /webdata/index.html'] containers: - image: nginx name: nginx volumeMounts: - name: webdata mountPath: "/usr/share/nginx/html"---apiVersion: v1kind: Servicemetadata: name: nginx-deploy-bluespec: type: ClusterIP ports: - port: 80 targetPort: 80 selector: run: nginx-blue
Create4-tls-ingress.yaml để tạo các quy tắc Ingress dựa trên đường dẫn với Staging Issuer.
Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Mã:
apiVersion: extensions/v1beta1kind: Ingresssiêu dữ liệu: chú thích: nginx.ingress.kubernetes.io/rewrite-target: / cert-manager.io/cluster-issuer: letsencrypt-staging tên: ingress-resource-3spec: tls: - hosts: - kops.devopslee.com secretName: sample-kubernetes-tls quy tắc: - host: kops.devopslee.com http: đường dẫn: - đường dẫn: / backend: serviceName: nginx-deploy-main servicePort: 80 - đường dẫn: /blue backend: serviceName: nginx-deploy-blue servicePort: 80 - đường dẫn: /green backend: serviceName: nginx-deploy-green servicePort: 80
Liên kết Github: Nhấp vàotại đâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Mã:
apiPhiên bản: extensions/v1beta1loại: Ingresssiêu dữ liệu: chú thích: nginx.ingress.kubernetes.io/rewrite-target: / cert-manager.io/cluster-issuer: letsencrypt-production tên: ingress-resource-3spec: tls: - hosts: - kops.devopslee.com secretName: sample-kubernetes-tls quy tắc: - host: kops.devopslee.com http: đường dẫn: - đường dẫn: / backend: serviceName: nginx-deploy-main servicePort: 80 - đường dẫn: /blue backend: serviceName: nginx-deploy-blue servicePort: 80 - path: /green backend: serviceName: nginx-deploy-green servicePort: 80
Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Mã:
apiVersion: cert-manager.io/v1kind: ClusterIssuermetadata: name: letsencrypt-stagingspec: acme: # Địa chỉ email được sử dụng để đăng ký ACME email: your-email-id-here máy chủ: https://acme-staging-v02.api.letsencrypt.org/directory privateKeySecretRef: # Tên của bí mật được sử dụng để lưu trữ khóa riêng của tài khoản ACME name: letsencrypt-staging-private-key # Thêm một trình giải quyết thách thức duy nhất, HTTP01 bằng cách sử dụng trình giải quyết nginx: - http01: ingress: class: nginx
Tạo production_issuer.yaml cho Let's Encrypt Production Issuer
Liên kết Github: Nhấp vàođâyđể sao chép tệp từ kho lưu trữ Github của tôi.
Mã:
Phiên bản api: cert-manager.io/v1loại: ClusterIssuersiêu dữ liệu: tên: letsencrypt-productionthông số kỹ thuật: acme: # Địa chỉ email được sử dụng để đăng ký ACME email: your-email-id-here máy chủ: https://acme-v02.api.letsencrypt.org/directory privateKeySecretRef: # Tên của bí mật được sử dụng để lưu trữ khóa riêng của tài khoản ACME tên: letsencrypt-production-private-key # Thêm một trình giải quyết thử thách duy nhất, HTTP01 bằng trình giải quyết nginx: - http01: ingress: class: nginx
Thiết lập Staging và Production Let's Encrypt Issuer
Chúng tôi sẽ cài đặt cả Staging và Production Cluster Issuer.Staging:
Staging có "máy chủ: https://acme-staging-v02.api.letsencrypt.org/directory"
Mã:
kubectl logs cert-manager-56f5c44b5d-jn46m -n cert-manager -f
Mã:
kubectl apply -f cluster-issuer/staging_issuer.yaml
Điều này tạo ra một bí mật có tên "letsencrypt-staging-private-key"
Mã:
kubectl get secret letsencrypt-staging-private-key -n cert-manager -o json
Production:
Production có "server: https://acme-v02.api.letsencrypt.org/directory"
Mã:
kubectl logs cert-manager-56f5c44b5d-jn46m -n cert-manager -f
Mã:
kubectl apply -f cluster-issuer/production_issuer.yaml
Điều này tạo ra một bí mật có tên là "letsencrypt-production-private-key"
Mã:
kubectl get secret letsencrypt-production-private-key -n cert-manager -o json
Triển khai ứng dụng mẫu
Hãy triển khai 3 ứng dụng mẫu của chúng ta.
Mã:
kubectl apply -f sample-app/1-nginx-main-app.yaml
Mã:
kubectl apply -f sample-app/2-nginx-green-app.yaml
Mã:
kubectl apply -f sample-app/3-nginx-blue-app.yaml
Mã:
Kiểm tra các triển khai, pod và dịch vụ được tạo bởi các lệnh trên.
Mã:
kubectl get deployments
Mã:
kubectl get pods kubectl
Mã:
get service
Triển khai Ingress
Đầu tiên, hãy triển khai Ingress với Staging Issuer.
Mã:
kubectl apply -f sample-app/4-tls-ingress.yaml
Mã:
kubectl get ingress
Mã:
kubectl describe ingress ingress-resource-3
Sau khi tài nguyên Ingress được tạo, bạn có thể xem mọi thứ đã diễn ra ở chế độ nền để cấp chứng chỉ cho phần TLS của Ingress.
Mã:
kubectl get certificate -A
Mã:
kubectl get certificaterequests.cert-manager.io -A
Mã:
kubectl get orders.acme.cert-manager.io -A
Mã:
kubectl get challenges.acme.cert-manager.io -A
Mã:
kubectl get certificate -o json | grep secretName
Mã:
kubectl get secret sample-kubernetes-tls -o yaml
Bây giờ có thể truy cập ứng dụng qua HTTPS, nhưng vì chúng tôi đã sử dụng Môi trường dàn dựng của đơn vị phát hành Let's Encrypt nên chúng tôi sẽ nhận được cảnh báo "Kết nối của bạn tới trang web này không an toàn".
Triển khai Ingress với ProductionIssuer.
Bây giờ, hãy xóa Ingress bằng cách sử dụng Staging và tạo một Ingress mới trỏ tới đơn vị phát hành Production.
Mã:
kubectl delete -f sample-app/4-tls-ingress.yaml
Mã:
kubectl apply -f sample-app/5-tls-ingress-prod-issuer.yaml
Mã:
kubectl get ingress
Mã:
kubectl describe ingress ingress-resource-3
Lần này nếu bạn thử truy cập ứng dụng, bạn sẽ không nhận được bất kỳ cảnh báo nào như "Kết nối đến trang web này không an toàn".