Установка NGINX Ingress-контроллера с менеджером для сертификатов Let's Encrypt®
Чтобы с помощью Kubernetes создать NGINX Ingress-контроллер и защитить его сертификатом Let's Encrypt®, выполните следующие действия.
Перед началом работы
-
Установите kubectl и настройте его на работу с созданным кластером.
-
Установите менеджер пакетов Kubernetes Helm 3.
-
Добавьте в Helm репозиторий для NGINX:
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
Результат выполнения команды:
"ingress-nginx" has been added to your repositories
-
Обновите набор данных для создания экземпляра приложения в кластере 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!⎈
Установите NGINX Ingress Controller
Установите контроллер в стандартной конфигурации:
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'
...
Созданный контроллер будет установлен за Yandex Network Load Balancer.
Чтобы настроить конфигурацию контроллера самостоятельно, обратитесь к документации Helm и отредактируйте файл values.yaml.
Установите менеджер сертификатов
-
Установите менеджер сертификатов версии 1.6.1, настроенный для выпуска сертификатов от Let's Encrypt® (проверьте наличие более новой версии на странице проекта):
kubectl apply -f https://github.com/jetstack/cert-manager/releases/download/v1.6.1/cert-manager.yaml
Результат выполнения команды:
customresourcedefinition.apiextensions.k8s.io/certificaterequests.cert-manager.io created ... validatingwebhookconfiguration.admissionregistration.k8s.io/cert-manager-webhook created
-
Убедитесь, что в пространстве имен
cert-manager
создано три пода с готовностью1/1
и статусомRunning
:kubectl get pods -n cert-manager --watch
Результат выполнения команды:
NAME READY STATUS RESTARTS AGE cert-manager-69cf79df7f-ghw6s 1/1 Running 0 54s cert-manager-cainjector-7648dc6696-gnrzz 1/1 Running 0 55s cert-manager-webhook-7746f64877-wz9bh 1/1 Running 0 54s
Создайте объекты
Чтобы протестировать работу менеджера сертификатов, необходимо создать объекты ClusterIssuer, Ingress, Service и Deployment.
-
Создайте YAML-файл
acme-issuer.yaml
с манифестом объектаClusterIssuer
:apiVersion: cert-manager.io/v1 kind: ClusterIssuer metadata: name: letsencrypt namespace: cert-manager spec: acme: server: https://acme-v02.api.letsencrypt.org/directory email: <ваш email> privateKeySecretRef: name: letsencrypt solvers: - http01: ingress: class: nginx
-
Создайте YAML-файл
app.yaml
с манифестами объектовIngress
,Service
иDeployment
:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: minimal-ingress annotations: kubernetes.io/ingress.class: "nginx" cert-manager.io/cluster-issuer: "letsencrypt" spec: tls: - hosts: - <URL адрес вашего домена> secretName: letsencrypt 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
-
Создайте объекты в кластере Kubernetes:
kubectl apply -f acme-issuer.yaml && \ kubectl apply -f app.yaml
Настройте DNS-запись для Ingress-контроллера
-
Узнайте 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 84.201.153.122
Примечание
Регистрация сертификата Let's Encrypt® и A-записи может занять несколько минут.
Проверьте работоспособность TLS
curl https://<ваш домен>
Удалите созданные ресурсы
Если созданные ресурсы вам больше не нужны, удалите кластер Managed Service for Kubernetes.