Что такое Cert-Manager и как настроить Cert-Manager для сертификатов SSL в кластере Kubernetes на AWS с помощью Helm
На этой странице
- Предварительные условия
- Что будем делать?
- Проверьте контроллер входящего трафика в кластере
- Настройка диспетчера сертификатов
- Создайте файлы определения объектов для примера приложения и издателей.
- Настройка промежуточной и рабочей среды позволяет зашифровать эмитента
- Развертывание примера приложения
- Развертывание Ingress
- Заключение
Cert-Manager — это контроллер, используемый для управления сертификатами. Cert-Manager может помочь в выпуске сертификатов от разных эмитентов, таких как Let’s Encrypt, HashiCorp Vault, Venafi, простой пары ключей подписи или самоподписанных. Cert-Manager проверяет сертификаты, обеспечивает их актуальность и продлевает до истечения срока действия. Cert-Manager состоит из нескольких компонентов, как указано ниже.
- Издатель. Издатели и ClusterIssuers — это объекты в Kubernetes, представляющие центры сертификации (ЦС), которые могут генерировать подписанные сертификаты.
- Сертификат. Сертификат – это ресурс с пространством имен, который ссылается на Issuer или ClusterIssuer и будет обновляться и поддерживаться в актуальном состоянии.
- CertificateRequest. CertificateRequest – это ресурс с пространством имен, который используется для запроса сертификата у эмитента или кластера.
- Заказы ACME. Заказ представляет собой запрос сертификата, который будет создан после создания нового ресурса CertificateRequest, ссылающегося на эмитента ACME.
- Вызовы ACME. При создании ресурса заказа ресурсы запроса для каждого DNS-имени, которое авторизуется на сервере ACME, будут созданы контроллером заказа.
- Веб-перехватчик: он развертывается как еще один модуль вместе с основными модулями Cert-Manager и выполняет 3 функции: ValidatingAdmissionWebhook, MutatingAdmissionWebhook и CustomResourceConversionWebhook.
- CA Injector: помогает настроить сертификаты для проверки веб-перехватчиков, изменения веб-перехватчиков и перехватчиков преобразования.
В этой статье мы настроим Cert-Manager с эмитентом Lets Encrypt. Мы защитим наш пример приложения с помощью сертификатов TLS и укажем HTTPS в имени хоста для доступа к приложению с помощью Ingress. Для этого мы добавим аннотации к Ingress, чтобы ресурс сертификата создавался от нашего имени.
Чтобы узнать подробнее о Cert-Manager, посетите официальную документацию здесь. В этой статье основное внимание уделяется настройке Cert-Manager с помощью Helm, и предполагается, что вы знакомы с понятиями, связанными с Cert-Manager.
Предпосылки
- Аккаунт AWS (создайте, если у вас его нет).
- Кластер Kubernetes (нажмите здесь, чтобы узнать, как создать кластер Kubernetes с помощью Kops, и получить дополнительные сведения об этом.)
- Контроллер Nginx Ingress в кластере K8S (поищите «Что такое Ingress Controller и как развернуть Nginx Ingress Controller в кластере Kubernetes на AWS с помощью Helm», чтобы научиться настраивать Nginx Ingress Controller)
- Helm v3.5.3 (нажмите здесь, чтобы узнать, как установить Helm на Ubuntu Server)
- Корзина S3 (нажмите здесь, чтобы узнать, как создать корзину S3 на AWS).
- Доменное имя (нажмите здесь, чтобы узнать, как зарегистрировать домен на AWS).
- Роль IAM с правами администратора (нажмите здесь, чтобы узнать, как создать роль IAM в AWS).
Что мы будем делать?
- Проверьте контроллер входящего трафика в кластере
- Настройка диспетчера сертификатов
- Создайте файлы определения объектов для примера приложения.
- Настройка промежуточной и рабочей среды позволяет зашифровать эмитента
- Развертывание примера приложения
- Развертывание входящего объекта с помощью TLS
Проверьте контроллер входящего трафика в кластере
Прежде чем продолжить, проверьте, запущен ли в кластере Nginx Ingress Controller.
kubectl get pods
kubectl get svc
Настройка диспетчера сертификатов
Note: I have used Helm binary present at my current location, hence you can see ./helm in screenshots.
Используйте Helm v3.5.3 и выполните следующие команды, это установит Helm Chart для 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
На приведенном выше снимке экрана видно, что Helm Chart для Cert-Manager установлен.
Проверьте модули, которые были созданы как часть Cert-Manager.
kubectl get pods -A
Вы можете увидеть 3 новых модуля в пространстве имен «cert-manager».
Создайте файлы определения объекта для примера приложения и эмитентов.
Создайте 1-nginx-main-app.yaml для приложения 1.
Ссылка на Github: нажмите здесь, чтобы скопировать файл из моего репозитория Github.
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
Создайте 2-nginx-green-app.yaml для приложения 2.
Ссылка на Github: нажмите здесь, чтобы скопировать файл из моего репозитория Github.
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
Создайте 3-nginx-blue-app.yaml для приложения 3.
Ссылка на Github: нажмите здесь, чтобы скопировать файл из моего репозитория Github.
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
Создайте 4-tls-ingress.yaml для создания правил Ingress на основе путей с помощью Staging Issuer.
Ссылка на Github: нажмите здесь, чтобы скопировать файл из моего репозитория Github.
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
Создайте 5-tls-ingress-prod-issuer.yaml для создания правил Ingress на основе пути с помощью Production Issuer.
Ссылка на Github: нажмите здесь, чтобы скопировать файл из моего репозитория Github.
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
Создайте staging_issuer.yaml для Lets Encrypt Staging Issuer.
Ссылка на Github: нажмите здесь, чтобы скопировать файл из моего репозитория Github.
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
Создайте production_issuer.yaml для Lets Encrypt Production Issuer
Ссылка на Github: нажмите здесь, чтобы скопировать файл из моего репозитория Github.
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
Вы можете найти все эти файлы в моем репозитории Github здесь.
Настройка подготовки и производства позволяет зашифровать эмитента
Мы установим как Staging, так и Production Cluster Issuer.
Постановка:
У промежуточной версии есть «сервер: 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
Это создает секрет с именем «letsencrypt-staging-private-key».
kubectl get secret letsencrypt-staging-private-key -n cert-manager -o json
Производство:
Производство имеет «сервер: 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
Это создает секрет с именем «letsencrypt-production-private-key».
kubectl get secret letsencrypt-production-private-key -n cert-manager -o json
Разверните пример приложения
Давайте развернем наши 3 примера приложений.
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
Развернуть вход
Во-первых, давайте развернем Ingress с Staging Issuer.
kubectl apply -f sample-app/4-tls-ingress.yaml
kubectl get ingress
kubectl describe ingress ingress-resource-3
После создания ресурса Ingress вы можете увидеть, что происходило в фоновом режиме для выдачи сертификата для раздела TLS 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
Теперь к приложению можно получить доступ через HTTPS, но, поскольку мы использовали тестовую среду эмитента Lets Encrypt, мы получим предупреждение «Ваше подключение к этому сайту не защищено».
Разверните Ingress с помощью Production Issuer.
Теперь давайте удалим Ingress с помощью Staging и создадим новый Ingress, указывающий на производственный эмитент.
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
На этот раз, если вы попытаетесь получить доступ к приложению, вы не получите никакого предупреждения, поскольку «Соединение с этим сайтом не защищено».
Заключение
В этой статье мы рассмотрели шаги по настройке Cert-Manager в кластере Kubernetes. Мы развернули образец приложения и перенаправили входящий трафик на основе пути, а также защитили соединение с помощью HTTPS с помощью сертификата, выданного эмитентом кластера Lets Encrypt. Сначала мы выпустили сертификат с помощью тестовой среды Lets Encrypt, а затем использовали производственную среду Lets Encrypt.