Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Yandex Managed Service for Kubernetes
  • Сопоставление с другими сервисами Yandex Cloud
  • Начало работы
  • Пошаговые инструкции
    • Все инструкции
    • Подключение к узлу по SSH
    • Обновление Kubernetes
    • Настройка автомасштабирования
    • Подключение к кластеру
      • Обзор способов подключения
      • Настройка групп безопасности
      • Создание статического файла конфигурации
    • Установка приложений из Cloud Marketplace
      • Основы работы с Cloud Marketplace
      • Установка Argo CD
      • Установка Container Storage Interface для S3
      • Установка Crossplane
      • Установка External Secrets Operator
      • Установка Falco
      • Установка Filebeat
      • Установка Fluent Bit
      • Установка Gateway API
      • Установка GitLab Agent
      • Установка GitLab Runner
      • Установка HashiCorp Vault
      • Установка Ingress-контроллера Application Load Balancer
      • Установка Jaeger
      • Установка Kyverno & Kyverno Policies
      • Установка Loki
      • Установка Metrics Provider
      • Установка NodeLocal DNS
      • Установка Policy Reporter
      • Установка Thumbor
    • Сетевые сценарии
      • Обеспечение доступа к приложению, запущенному в кластере Kubernetes
      • Настройка контроллера сетевых политик Calico
      • Настройка контроллера сетевых политик Cilium
      • Настройка NodeLocal DNS для контроллера сетевых политик Cilium
    • Работа с постоянными томами
      • Динамическая подготовка тома
      • Статическая подготовка тома
      • Управление классами хранилищ
      • Увеличение размера тома для подов
      • Увеличение размера тома для контроллера StatefulSet
      • Подключение тома в блочном режиме
      • Интеграция с Object Storage
    • Управление кластером Kubernetes
      • Получение информации о кластере Kubernetes
      • Создание кластера Kubernetes
      • Изменение кластера Kubernetes
      • Создание пространства имен в кластере Kubernetes
      • Удаление кластера Kubernetes
    • Управление группой узлов
      • Информация об имеющихся группах узлов
      • Создание группы узлов
      • Подключение к узлу по SSH
      • Настройка автомасштабирования
      • Изменение группы узлов
      • Управление метками узлов кластера Kubernetes
      • Удаление группы узлов
    • Подключение внешних узлов к кластеру
  • Практические руководства
    • Все руководства
    • Создание нового Kubernetes-проекта в Yandex Cloud
    • Интеграция с Container Registry
    • Подпись и проверка Docker-образов Container Registry
    • Сканирование уязвимостей Container Registry при непрерывном развертывании приложений с помощью GitLab
    • Запуск рабочих нагрузок с GPU
    • Установка Ingress-контроллера NGINX с Let's Encrypt®
    • Установка Ingress-контроллера NGINX с сертификатом из Certificate Manager
    • Резервное копирование в Object Storage
    • Горизонтальное масштабирование приложения в кластере
    • Вертикальное масштабирование приложения в кластере
    • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием
    • Работа со снапшотами
    • Интеграция с корпоративной зоной DNS
    • Автоматическое масштабирование DNS по размеру кластера
    • Настройка локального кеширования DNS
    • Проверка DNS Challenge для сертификатов Let's Encrypt®
    • Мониторинг кластера с помощью Prometheus и Grafana
    • Непрерывное развертывание контейнеризованных приложений с помощью GitLab
    • Изменение параметров сервера метрик (Metrics Server)
    • Использование продуктов Cloud Marketplace
      • Интеграция с Argo CD
      • Интеграция с Crossplane
      • Синхронизация с секретами Yandex Lockbox
      • Настройка Fluent Bit для работы с Cloud Logging
      • Настройка Gateway API
      • Настройка Application Load Balancer Ingress-контроллера
      • Использование Jaeger для трассировки запросов в Managed Service for YDB
      • Настройка Kyverno & Kyverno Policies
      • Использование Metrics Provider для трансляции метрик
  • Концепции
    • Взаимосвязь ресурсов сервиса
    • Релизные каналы и обновления
    • Шифрование секретов
    • Использование объектов API Kubernetes
      • Том
      • Сервис
    • Группа узлов
      • Автоматическое масштабирование группы узлов
      • Расселение подов с узла
      • Динамическое резервирование ресурсов для узла
      • Группы узлов с GPU
    • Сеть в Managed Service for Kubernetes
    • Внешние узлы кластера
    • Сетевые настройки и политики кластера
    • Автоматическое масштабирование
    • Квоты и лимиты
    • Рекомендации по использованию Managed Service for Kubernetes
  • Управление доступом
  • Правила тарификации
  • Справочник API
    • Аутентификация в API
    • gRPC (англ.)
      • Overview
      • ClusterService
      • NodeGroupService
      • VersionService
      • OperationService
    • REST (англ.)
      • Overview
      • Cluster
        • Overview
        • create
        • delete
        • get
        • list
        • listNodeGroups
        • listNodes
        • listOperations
        • start
        • stop
        • update
      • NodeGroup
        • Overview
        • create
        • delete
        • get
        • list
        • listNodes
        • listOperations
        • update
      • Version
        • Overview
        • list
  • Вопросы и ответы
    • Общие вопросы
    • Хранилище данных
    • Настройка и обновление
    • Автоматическое масштабирование
    • Ресурсы
    • Логи
    • Все вопросы на одной странице
  1. Практические руководства
  2. Установка Ingress-контроллера NGINX с сертификатом из Certificate Manager

Установка 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
  • Проверьте доступность ресурса
  • Удалите созданные ресурсы