Установка Ingress-контроллера NGINX с менеджером для сертификатов Let's Encrypt®
Чтобы с помощью Kubernetes
- Установите Ingress-контроллер NGINX.
- Настройте DNS-запись для Ingress-контроллера.
- Установите менеджер сертификатов.
- Создайте ClusterIssuer.
- Создайте объекты для проверки работы cert-manager.
- Проверьте работоспособность TLS.
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
-
Создайте сервисный аккаунт с ролями
editor
,container-registry.images.puller
иload-balancer.admin
на каталог. Рольload-balancer.admin
нужна для создания сетевого балансировщика нагрузки. -
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер Managed Service for Kubernetes и группу узлов любой подходящей конфигурации. В настройках кластера укажите сервисный аккаунт и группы безопасности, созданные ранее.
-
Установите kubectl
и настройте его на работу с созданным кластером. -
Зарегистрируйте публичную доменную зону и делегируйте домен.
-
(Опционально) Установите ExternalDNS c плагином для Yandex Cloud DNS, чтобы автоматически создать DNS-запись в Yandex Cloud DNS при создании Ingress-контроллера.
Установите Ingress-контроллер NGINX
Установите приложение Ingress NGINX из Cloud Marketplace по инструкции.
-
Для установки Helm-чарта
с Ingress-контроллером NGINX выполните команду:helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx && \ helm repo update && \ helm install ingress-nginx ingress-nginx/ingress-nginx
Созданный контроллер будет установлен за Yandex Network Load Balancer.
Чтобы настроить конфигурацию контроллера самостоятельно, обратитесь к документации Helm
Чтобы пробросить определенные порты при установке Ingress-контроллера NGINX, следуйте инструкции.
Настройте DNS-запись для Ingress-контроллера
Если вы используете ExternalDNS c плагином для Cloud DNS, настраивать DNS-запись не нужно — она создается автоматически. В противном случае:
-
Узнайте 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 ...
-
Разместите у своего DNS-провайдера или на собственном DNS-сервере A-запись, указывающую на публичный IP-адрес Ingress-контроллера:
<ваш_домен> IN A <IP-адрес_Ingress-контроллера>
Установите менеджер сертификатов
Вы можете установить менеджер сертификатов одним из способов:
-
С помощью Yandex Cloud Marketplace: будет установлен cert-manager, интегрированный с сервисом Cloud DNS.
В кластере будет создан объект
ClusterIssuer
, настроенный на прохождение проверки DNS-01 с помощью Cloud DNS.При необходимости можно вручную создать и настроить другие объекты:
Issuer
илиClusterIssuer
. Подробнее об этих объектах см. в документации cert-manager . -
Вручную: будет установлен cert-manager без дополнительных интеграций.
Любые объекты
Issuer
иClusterIssuer
потребуется создать и настроить вручную.
Установите приложение cert-manager c плагином Cloud DNS ACME webhook по инструкции.
-
Установите актуальную версию
cert-manager. Например, для версии 1.21.1 выполните команду:kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.12.1/cert-manager.yaml
-
Убедитесь, что в пространстве имен
cert-manager
создано три пода с готовностью1/1
и статусомRunning
:kubectl get pods -n cert-manager --watch
Результат:
NAME READY STATUS RESTARTS AGE cert-manager-69********-ghw6s 1/1 Running 0 54s cert-manager-cainjector-76********-gnrzz 1/1 Running 0 55s cert-manager-webhook-77********-wz9bh 1/1 Running 0 54s
Создайте ClusterIssuer
Создайте объект ClusterIssuer
Сертификаты будут выпускаться после прохождения проверки HTTP-01
Создайте объект с нужными параметрами:
-
Создайте YAML-файл
http01-clusterissuer.yaml
с манифестом объекта:apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: http01-clusterissuer spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: <ваш_email> privateKeySecretRef: name: http01-clusterissuer-secret solvers: - http01: ingress: class: nginx
-
Создайте объект в кластере Managed Service for Kubernetes:
kubectl apply -f http01-clusterissuer.yaml
Создайте объекты для проверки работы cert-manager
Чтобы протестировать работу менеджера сертификатов, создайте объекты Ingress
, Service
и Deployment
:
-
Создайте YAML-файл
app.yaml
с манифестами объектовIngress
,Service
иDeployment
:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: minimal-ingress annotations: cert-manager.io/cluster-issuer: "http01-clusterissuer" spec: ingressClassName: nginx tls: - hosts: - <URL_адрес_вашего_домена> secretName: domain-name-secret rules: - host: <URL_адрес_вашего_домена> http: paths: - path: / pathType: Prefix backend: service: name: app port: number: 80 --- 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
-
Создайте объекты в кластере Managed Service for Kubernetes:
kubectl apply -f app.yaml
Проверьте работоспособность TLS
-
Убедитесь, что проверка прав на домен завершилась успешно и сертификат перешел в статус
Issued
:kubectl describe certificate domain-name-secret
В выводе команды будут содержаться подобные события (events):
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Issuing ... cert-manager-certificates-trigger Issuing certificate as Secret does not exist Normal Generated ... cert-manager-certificates-key-manager Stored new private key in temporary Secret resource...
Сертификаты используются в связке с соответствующими им секретами Kubernetes
, которые хранят пары ключей и служебную информацию. В случае отсутствия секрета сертификат перевыпускается автоматически с созданием нового секрета, о чем и сообщается в событиях. Подробнее о причинах, которые могут привести к перевыпуску сертификата, см. в документации cert-manager .Поскольку сертификат выпускается впервые, то соответствующий ему секрет отсутствует. Наличие событий, сообщающих об этом, не является ошибкой.
Примечание
Проверка прав на домен сертификата Let's Encrypt® может занять несколько часов.
-
Выполните команду:
curl https://<ваш_домен>
Результат:
<!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> html { color-scheme: light dark; } body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/">nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/">nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
Примечание
Если ресурс недоступен по указанному URL, то убедитесь, что группы безопасности для кластера Managed Service for Kubernetes и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.
Удалите созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать: