Cert-Manager là gì và cách thiết lập Cert-Manager cho chứng chỉ SSL trong Kubernetes Cluster trên AWS bằng Helm

theanh

Administrator
Nhân viên
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.
  1. 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ý.
  2. 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.
  3. 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.
  4. 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
  5. 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.
  6. 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.
  7. CA Injectorr: Giúp cấu hình chứng chỉ cho Validating Webhooks, Mutating Webhooks và Conversion Webhooks.
Trong bài viết này, chúng ta sẽ thiết lập Cert-Manager với đơn vị phát hành Let's Encrypt. Chúng ta sẽ bảo mật ứng dụng mẫu của mình bằng chứng chỉ TLS và có HTTPS trong Tên máy chủ để truy cập ứng dụng bằng Ingress. Để thực hiện việc này, chúng tôi sẽ thêm chú thích vào Ingress để tài nguyên chứng chỉ được tạo thay mặt cho chúng tô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.

Điều kiện tiên quyết​

  1. Tài khoản AWS (Tạonếu bạn chưa có).
  2. 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.)
  3. 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)
  4. 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)
  5. Gầu S3 (Nhấp vào đây để tìm hiểu cách tạo Gầu S3 trên AWS).
  6. Tên miền (Clickheređể tìm hiểu cách đăng ký Miền trên AWS).
  7. 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ì?​

  1. Kiểm tra Bộ điều khiển Ingress trong Cụm
  2. Thiết lập Cert-Manager
  3. Tạo tệp định nghĩa Object cho ứng dụng mẫu
  4. Thiết lập Trình phân đoạn và Sản xuất Let's Encrypt Issuer
  5. Triển khai ứng dụng mẫu
  6. 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.
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.
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 1

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: 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
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.
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
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.
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
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.
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
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.
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
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.

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".


Kết luận​

Trong bài viết này, chúng ta đã thấy các bước để thiết lập Cert-Manager trên Kubernetes Cluster. Chúng tôi đã triển khai một ứng dụng mẫu và định tuyến lưu lượng truy cập qua ingress dựa trên đường dẫn và bảo mật kết nối bằng HTTPS bằng cách sử dụng chứng chỉ do đơn vị phát hành cụm Let's Encrypt cấp. Đầu tiên, chúng tôi đã cấp chứng chỉ bằng môi trường Let's Encrypt Staging và sau đó sử dụng môi trường Let's Encryptproduction
 
Back
Bên trên