Поиск по сайту:

Что такое Cert-Manager и как настроить Cert-Manager для сертификатов SSL в кластере Kubernetes на AWS с помощью Helm


На этой странице

  1. Предварительные условия
  2. Что будем делать?
  3. Проверьте контроллер входящего трафика в кластере
  4. Настройка диспетчера сертификатов
  5. Создайте файлы определения объектов для примера приложения и издателей.
  6. Настройка промежуточной и рабочей среды позволяет зашифровать эмитента
  7. Развертывание примера приложения
  8. Развертывание Ingress
  9. Заключение

Cert-Manager — это контроллер, используемый для управления сертификатами. Cert-Manager может помочь в выпуске сертификатов от разных эмитентов, таких как Let’s Encrypt, HashiCorp Vault, Venafi, простой пары ключей подписи или самоподписанных. Cert-Manager проверяет сертификаты, обеспечивает их актуальность и продлевает до истечения срока действия. Cert-Manager состоит из нескольких компонентов, как указано ниже.

  1. Издатель. Издатели и ClusterIssuers — это объекты в Kubernetes, представляющие центры сертификации (ЦС), которые могут генерировать подписанные сертификаты.
  2. Сертификат. Сертификат – это ресурс с пространством имен, который ссылается на Issuer или ClusterIssuer и будет обновляться и поддерживаться в актуальном состоянии.
  3. CertificateRequest. CertificateRequest – это ресурс с пространством имен, который используется для запроса сертификата у эмитента или кластера.
  4. Заказы ACME. Заказ представляет собой запрос сертификата, который будет создан после создания нового ресурса CertificateRequest, ссылающегося на эмитента ACME.
  5. Вызовы ACME. При создании ресурса заказа ресурсы запроса для каждого DNS-имени, которое авторизуется на сервере ACME, будут созданы контроллером заказа.
  6. Веб-перехватчик: он развертывается как еще один модуль вместе с основными модулями Cert-Manager и выполняет 3 функции: ValidatingAdmissionWebhook, MutatingAdmissionWebhook и CustomResourceConversionWebhook.
  7. CA Injector: помогает настроить сертификаты для проверки веб-перехватчиков, изменения веб-перехватчиков и перехватчиков преобразования.

В этой статье мы настроим Cert-Manager с эмитентом Lets Encrypt. Мы защитим наш пример приложения с помощью сертификатов TLS и укажем HTTPS в имени хоста для доступа к приложению с помощью Ingress. Для этого мы добавим аннотации к Ingress, чтобы ресурс сертификата создавался от нашего имени.

Чтобы узнать подробнее о Cert-Manager, посетите официальную документацию здесь. В этой статье основное внимание уделяется настройке Cert-Manager с помощью Helm, и предполагается, что вы знакомы с понятиями, связанными с Cert-Manager.

Предпосылки

  1. Аккаунт AWS (создайте, если у вас его нет).
  2. Кластер Kubernetes (нажмите здесь, чтобы узнать, как создать кластер Kubernetes с помощью Kops, и получить дополнительные сведения об этом.)
  3. Контроллер Nginx Ingress в кластере K8S (поищите «Что такое Ingress Controller и как развернуть Nginx Ingress Controller в кластере Kubernetes на AWS с помощью Helm», чтобы научиться настраивать Nginx Ingress Controller)
  4. Helm v3.5.3 (нажмите здесь, чтобы узнать, как установить Helm на Ubuntu Server)
  5. Корзина S3 (нажмите здесь, чтобы узнать, как создать корзину S3 на AWS).
  6. Доменное имя (нажмите здесь, чтобы узнать, как зарегистрировать домен на AWS).
  7. Роль IAM с правами администратора (нажмите здесь, чтобы узнать, как создать роль IAM в AWS).

Что мы будем делать?

  1. Проверьте контроллер входящего трафика в кластере
  2. Настройка диспетчера сертификатов
  3. Создайте файлы определения объектов для примера приложения.
  4. Настройка промежуточной и рабочей среды позволяет зашифровать эмитента
  5. Развертывание примера приложения
  6. Развертывание входящего объекта с помощью 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.