Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Yandex Certificate Manager
  • Начало работы
  • Пошаговые инструкции
    • Все инструкции
    • Сертификат от Let's Encrypt
      • Создание сертификата
      • Получение содержимого сертификата
      • Прохождение процедуры проверки прав на домен
      • Обновление сертификата
      • Изменение сертификата
      • Удаление сертификата
    • Пользовательский сертификат
      • Создание сертификата
      • Получение содержимого сертификата
      • Обновление сертификата
      • Изменение сертификата
      • Удаление сертификата
    • Домен
      • Создание домена
      • Обновление сертификата у домена
      • Изменение домена
      • Удаление домена
    • Резервное копирование
    • Добавление алерта для сертификата
  • Практические руководства
    • Установка Ingress-контроллера NGINX в Managed Service for Kubernetes
  • Концепции
    • Обзор
    • Сертификат от Let's Encrypt
    • Пользовательский сертификат
    • Проверка прав на домен
    • Интеграция с сервисами Yandex Cloud
    • Квоты и лимиты
    • Домен
      • Обзор
      • Интеграция с сервисами Yandex Cloud
  • Управление доступом
  • Правила тарификации
  • Справочник API
    • Аутентификация в API
    • gRPC (англ.)
      • Overview
      • CertificateContentService
      • CertificateService
      • OperationService
    • REST (англ.)
      • Overview
      • CertificateContent
        • Overview
        • get
      • Certificate
        • Overview
        • create
        • delete
        • get
        • list
        • listAccessBindings
        • listOperations
        • listVersions
        • requestNew
        • setAccessBindings
        • update
        • updateAccessBindings
  • Вопросы и ответы
  1. Практические руководства
  2. Установка Ingress-контроллера NGINX в Managed Service for Kubernetes

Установка Ingress-контроллера NGINX с сертификатом из Yandex Certificate Manager

Статья создана
Yandex Cloud
,
улучшена
Artem B.
  • Перед началом работы
    • Необходимые платные ресурсы
  • Создайте сертификат в Certificate Manager
  • Установите External Secrets Operator
  • Настройте кластер Kubernetes
  • Создайте ExternalSecret
  • Установите Ingress-контроллер NGINX
  • Создайте веб-ресурс в вашем кластере
  • Настройте DNS-запись для Ingress-контроллера
  • Создайте ресурс Ingress
  • Проверьте доступность ресурса
  • Удалите созданные ресурсы

Управляйте TLS-сертификатом для Ingress-контроллера NGINX через Certificate Manager.

External Secrets Operator синхронизирует сертификат с секретом Kubernetes. Это позволяет управлять сертификатом развернутого приложения через Certificate Manager: загрузить самоподписанный сертификат и обновлять его самостоятельно или выпустить сертификат от Let's Encrypt®, который будет обновляться автоматически.

Перед началом работы

  1. Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.

    По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

  2. Установите менеджер пакетов Helm.

  3. Установите утилиту jq:

    sudo apt update && sudo apt install jq
    
  4. Создайте сервисный аккаунт с именем eso-service-account, необходимый для работы External Secrets Operator.

  5. Создайте авторизованный ключ для сервисного аккаунта и сохраните его в файл authorized-key.json:

    yc iam key create \
      --service-account-name eso-service-account \
      --output authorized-key.json
    
  6. Создайте кластер Managed Service for Kubernetes и группу узлов любой подходящей конфигурации.

  7. Установите kubectl и настройте его на работу с созданным кластером.

Необходимые платные ресурсы

В стоимость поддержки инфраструктуры входит:

  • использование мастера и исходящий трафик Managed Service for Kubernetes (см. тарифы Managed Service for Kubernetes);
  • использование узлов кластера Managed Service for Kubernetes (см. тарифы Compute Cloud);
  • использование публичных IP-адресов (см. тарифы Virtual Private Cloud);
  • входящий трафик, обработанный балансировщиком, и использование сетевого балансировщика (см. тарифы Network Load Balancer).

Создайте сертификат в Certificate Manager

  1. Создайте сертификат Let's Encrypt® или загрузите собственный сертификат.

  2. Для сертификата Let's Encrypt® пройдите проверку прав на домен, который указан в сертификате.

  3. Назначьте роль certificate-manager.certificates.downloader сервисному аккаунту eso-service-account, чтобы он мог читать содержимое сертификата:

    yc cm certificate add-access-binding \
      --id <идентификатор_сертификата> \
      --service-account-name eso-service-account \
      --role certificate-manager.certificates.downloader
    
  4. Проверьте, что права назначены:

    yc cm certificate list-access-bindings --id <идентификатор_сертификата>
    

    Результат выполнения команды:

    +---------------------------------------------+----------------+-------------------------------------+
    |                   ROLE ID                   |  SUBJECT TYPE  |              SUBJECT ID             |
    +---------------------------------------------+----------------+-------------------------------------+
    | certificate-manager.certificates.downloader | serviceAccount | <идентификатор_сервисного_аккаунта> |
    +---------------------------------------------+----------------+-------------------------------------+
    

Установите External Secrets Operator

  1. Добавьте Helm-репозиторий external-secrets:

    helm repo add external-secrets https://charts.external-secrets.io
    
  2. Установите External Secrets Operator в кластер Kubernetes:

    helm install external-secrets \
      external-secrets/external-secrets \
      --namespace external-secrets \
      --create-namespace
    

    Эта команда создаст новое пространство имен external-secrets, необходимое для работы External Secrets Operator.

    Результат выполнения команды:

    NAME: external-secrets
    LAST DEPLOYED: Sun Sep 19 11:20:58 2021
    NAMESPACE: external-secrets
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    external-secrets has been deployed successfully!
    ...
    

Настройте кластер Kubernetes

  1. Создайте пространство имен ns для объектов External Secrets Operator:

    kubectl create namespace ns
    
  2. Создайте секрет yc-auth, содержащий в себе ключ сервисного аккаунта eso-service-account:

    kubectl --namespace ns create secret generic yc-auth \
      --from-file=authorized-key=authorized-key.json
    
  3. Создайте хранилище секретов (SecretStore) secret-store, содержащее секрет yc-auth:

    kubectl --namespace ns apply -f - <<< '
    apiVersion: external-secrets.io/v1beta1
    kind: SecretStore
    metadata:
      name: secret-store
    spec:
      provider:
        yandexcertificatemanager:
          auth:
            authorizedKeySecretRef:
              name: yc-auth
              key: authorized-key'
    

Создайте ExternalSecret

  1. Создайте объект ExternalSecret external-secret, указывающий на сертификат из Certificate Manager:

    kubectl --namespace ns apply -f - <<< '
    apiVersion: external-secrets.io/v1beta1
    kind: ExternalSecret
    metadata:
      name: external-secret
    spec:
      refreshInterval: 1h
      secretStoreRef:
        name: secret-store
        kind: SecretStore
      target:
        name: k8s-secret
        template:
          type: kubernetes.io/tls
      data:
      - secretKey: tls.crt
        remoteRef:
          key: <идентификатор_сертификата>
          property: chain
      - secretKey: tls.key
        remoteRef:
          key: <идентификатор_сертификата>
          property: privateKey'
    

    Где:

    • k8s-secret — имя секрета, в который External Secret Operator поместит сертификат из Certificate Manager.
    • tls.crt — параметр секрета k8s-secret, который будет содержать сертификат.
    • tls.key — параметр секрета k8s-secret, который будет содержать закрытый ключ сертификата.

    Доступны следующие значения параметра property:

    • chain — получить цепочку сертификатов в формате PEM.
    • privateKey — получить закрытый ключ в формате PEM.
    • chainAndPrivateKey или пустое значение — получить и цепочку сертификатов, и закрытый ключ.

    External Secrets Operator получит сертификат из Certificate Manager и поместит его в секрет k8s-secret.

  2. Проверьте, что сертификат попал в секрет k8s-secret:

    kubectl -n ns get secret k8s-secret -ojson \
      | jq '."data"."tls.crt"' -r \
      | base64 --decode
    

    Пример результата:

    -----BEGIN CERTIFICATE-----
    MIIFKTCCBBGgAwIBAgISBAlQtxTUnXa75N1TnPYRWbSLMA0GCSqGSIb3DQEBCwUA
    MDIxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MQswCQYDVQQD
    EwJSMzAeFw0yMjA3MTMxNDMxNTVaFw0yMjEwMTExNDMxNTRaMB0xGzAZBgNVBAMT
    EmRkb3Mtd2ViLm5yay5tZS51azCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC…
    

Чтобы просмотреть сертификат в человекочитаемом виде, выполните команды:

kubectl -n ns get secret k8s-secret -ojson | jq '."data"."tls.crt"' -r \
  | base64 --decode > cert.pem
openssl x509 -in cert.pem -text

Пример результата:

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            04:09:50:b7:14:d4:9d:76:bb:e4:dd:53:9c:f6:11:59:b4:8b
        Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, O = Let's Encrypt, CN = R3
        Validity
            Not Before: Jul 13 14:31:55 2022 GMT
            Not After : Oct 11 14:31:54 2022 GMT
        Subject: CN = example.com
...

Установите Ingress-контроллер NGINX

  1. Добавьте в Helm репозиторий для NGINX:

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    

    Результат выполнения команды:

    "ingress-nginx" has been added to your repositories
    
  2. Обновите набор данных для создания экземпляра приложения в кластере Kubernetes:

    helm repo update
    

    Результат выполнения команды:

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "ingress-nginx" chart repository
    Update Complete. ⎈Happy Helming!⎈
    
  3. Установите контроллер в стандартной конфигурации. Контроллер будет установлен вместе с Yandex Network Load Balancer:

    helm install ingress-nginx ingress-nginx/ingress-nginx
    

    Результат выполнения команды:

    NAME: ingress-nginx
    LAST DEPLOYED: Sun Jul 18 22:35:37 2021
    NAMESPACE: default
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    The ingress-nginx controller has been installed.
    It may take a few minutes for the LoadBalancer IP to be available.
    You can watch the status by running 'kubectl --namespace default get services -o wide -w ingress-nginx-controller'
    ...
    

Чтобы настроить контроллер самостоятельно, обратитесь к документации Helm и отредактируйте файл values.yaml.

Создайте веб-ресурс в вашем кластере

Создайте объект Deployment с NGINX и сервис для него:

kubectl --namespace ns apply -f - <<< '
apiVersion: v1
kind: Service
metadata:
  name: app
spec:
  selector:
    app: app
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-deployment
  labels:
    app: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
      - name: app
        image: nginx:latest
        ports:
        - containerPort: 80'

Настройте DNS-запись для Ingress-контроллера

  1. Узнайте IP-адрес Ingress-контроллера (значение в колонке EXTERNAL-IP):

    kubectl get svc
    

    Результат выполнения команды:

    NAME                      TYPE          CLUSTER-IP     EXTERNAL-IP     PORT(S)                     AGE
    ...
    ingress-nginx-controller  LoadBalancer  10.96.164.252  84.201.153.122  80:31248/TCP,443:31151/TCP  2m19s
    ...
    
  2. Разместите у своего DNS-провайдера или на собственном DNS-сервере A-запись, указывающую на публичный IP-адрес Ingress-контроллера:

    <имя_домена> IN A 84.201.153.122
    

Примечание

Регистрация сертификата Let's Encrypt® и A-записи может занять несколько минут.

Создайте ресурс Ingress

Создайте ресурс Ingress, который использует сертификат из k8s-secret для HTTPS:

kubectl --namespace ns apply -f - <<< '
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: nginx-test
  namespace: ns
spec:
  tls:
    - hosts:
      - <имя_домена>
      secretName: k8s-secret
  ingressClassName: nginx
  rules:
    - host: <имя_домена>
      http:
        paths:
        - path: /
          pathType: Prefix
          backend:
            service:
              name: app
              port:
                number: 80'

Где <имя_домена> — доменное имя, для которого выпущен сертификат.

Проверьте доступность ресурса

Выполните GET-запрос к ресурсу по HTTPS, например командой:

```bash
curl <имя_домена> -vv
```

Пример результата:

```text
*   Trying 51.250.64.86:443...
* Connected to <имя_домена> (51.250.64.86) port 443 (#0)
...
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
*  subject: CN=<имя_домена>
*  start date: Jul 13 14:31:55 2022 GMT
*  expire date: Oct 11 14:31:54 2022 GMT
*  subjectAltName: host "<имя_домена>" matched cert's "<имя_домена>"
...
*  SSL certificate verify ok.
```

Сертификат от Let's Encrypt® должен обновляться автоматически вслед за обновлением сертификата в Certificate Manager.

Вы можете задать таймаут синхронизации в параметре refreshInterval объекта ExternalSecret.

Удалите созданные ресурсы

Если созданные ресурсы вам больше не нужны, удалите их:

  1. Удалите кластер Kubernetes.
  2. Удалите Network Load Balancer.
  3. Удалите сертификат.
  4. Если для доступа к кластеру или узлам использовались статические публичные IP-адреса, освободите и удалите их.

Была ли статья полезна?

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Перед началом работы
  • Необходимые платные ресурсы
  • Создайте сертификат в Certificate Manager
  • Установите External Secrets Operator
  • Настройте кластер Kubernetes
  • Создайте ExternalSecret
  • Установите Ingress-контроллер NGINX
  • Создайте веб-ресурс в вашем кластере
  • Настройте DNS-запись для Ingress-контроллера
  • Создайте ресурс Ingress
  • Проверьте доступность ресурса
  • Удалите созданные ресурсы