Вступление
KubernetesIngresses позволяет гибко направлять трафик извне кластера Kubernetes на службы внутри кластера. Это достигается с помощью IngressResources, который определяет правила маршрутизации трафика HTTP и HTTPS к службам Kubernetes, и IngressControllers, которые реализуют правила путем балансировки нагрузки и маршрутизации трафика к соответствующим внутренним службам. Популярные контроллеры Ingress включаютNginx,Contour,HAProxy иTraefik. Ingresses обеспечивают более эффективную и гибкую альтернативу настройке нескольких сервисов LoadBalancer, каждый из которых использует свой собственный выделенный балансировщик нагрузки.
В этом руководстве мы настроим поддерживаемые KubernetesNginx Ingress Controller и создадим некоторые ресурсы Ingress для маршрутизации трафика к нескольким фиктивным серверным службам. После настройки Ingress мы установимcert-manager в наш кластер для управления и предоставления сертификатов TLS для шифрования HTTP-трафика на Ingress.
Предпосылки
Прежде чем вы начнете с этим руководством, у вас должно быть следующее:
-
Кластер Kubernetes 1.10+ с включеннымrole-based access control (RBAC)
-
Инструмент командной строки
kubectl
, установленный на вашем локальном компьютере и настроенный для подключения к вашему кластеру. Вы можете узнать больше об установкеkubectl
in the official documentation. -
Имя домена и DNS A записи, которые вы можете указать на балансировщик нагрузки DigitalOcean, используемый Ingress. Если вы используете DigitalOcean для управления записями DNS своего домена, обратитесь кHow to Manage DNS Records, чтобы узнать, как создавать записи A.
-
Менеджер пакетов Helm, установленный на вашем локальном компьютере, и Tiller установлен в вашем кластере, как подробно описано вHow To Install Software on Kubernetes Clusters with the Helm Package Manager. Убедитесь, что вы используете Helm v2.12.1 или новее, иначе у вас могут возникнуть проблемы с установкой диаграммы Helt cert-manager. Чтобы проверить версию Helm, которую вы установили, запустите
helm version
на локальном компьютере. -
Утилита командной строки
wget
, установленная на вашем локальном компьютере. Вы можете установитьwget
с помощью диспетчера пакетов, встроенного в вашу операционную систему.
После того, как вы настроите эти компоненты, вы готовы начать с этого руководства.
[[step-1 -—- setting-up-dummy-backend-services]] == Шаг 1. Настройка фиктивных серверных служб
Прежде чем мы развернем Ingress Controller, мы сначала создадим и развернем две фиктивные эхо-службы, на которые будем направлять внешний трафик с использованием Ingress. Службы echo запускают контейнер веб-сервераhashicorp/http-echo
, который возвращает страницу, содержащую текстовую строку, переданную при запуске веб-сервера. Чтобы узнать больше оhttp-echo
, обратитесь к егоGitHub Repo, а чтобы узнать больше о сервисах Kubernetes, обратитесь кServices из официальных документов Kubernetes.
На локальном компьютере создайте и отредактируйте файл с именемecho1.yaml
с помощьюnano
или вашего любимого редактора:
nano echo1.yaml
Вставьте следующий манифест службы и развертывания:
echo1.yaml
apiVersion: v1
kind: Service
metadata:
name: echo1
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo1
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo1
spec:
selector:
matchLabels:
app: echo1
replicas: 2
template:
metadata:
labels:
app: echo1
spec:
containers:
- name: echo1
image: hashicorp/http-echo
args:
- "-text=echo1"
ports:
- containerPort: 5678
В этом файле мы определяем службу с именемecho1
, которая направляет трафик в модули с помощью селектора меткиapp: echo1
. Он принимает TCP-трафик на порт80
и направляет его на порт5678
, порт по умолчаниюhttp-echo
.
Затем мы определяем развертывание, также называемоеecho1
, которое управляет подами с помощьюapp: echo1
Label Selector. Мы указываем, что в Deployment должно быть 2 реплики Pod, и что Pods должны запускать контейнер с именемecho1
, запускающий образhashicorp/http-echo
. Мы передаем параметрtext
и устанавливаем его равнымecho1
, чтобы веб-серверhttp-echo
возвращалecho1
. Наконец, мы открываем порт5678
на контейнере Pod.
После того, как вы будете удовлетворены фиктивным манифестом Service and Deployment, сохраните и закройте файл.
Затем создайте ресурсы Kubernetes, используяkubectl create
с флагом-f
, указав файл, который вы только что сохранили, в качестве параметра:
kubectl create -f echo1.yaml
Вы должны увидеть следующий вывод:
Outputservice/echo1 created
deployment.apps/echo1 created
Убедитесь, что Сервис запущен правильно, подтвердив, что у него есть ClusterIP, внутренний IP-адрес, на котором предоставляется Сервис:
kubectl get svc echo1
Вы должны увидеть следующий вывод:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echo1 ClusterIP 10.245.222.129 80/TCP 60s
Это указывает на то, что службаecho1
теперь доступна для внутреннего пользования на10.245.222.129
на порту80
. Он будет перенаправлять трафик на containerPort5678
на выбранных им модулях.
Теперь, когда службаecho1
запущена и работает, повторите этот процесс для службыecho2
.
Создайте и откройте файл с именемecho2.yaml
:
echo2.yaml
apiVersion: v1
kind: Service
metadata:
name: echo2
spec:
ports:
- port: 80
targetPort: 5678
selector:
app: echo2
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: echo2
spec:
selector:
matchLabels:
app: echo2
replicas: 1
template:
metadata:
labels:
app: echo2
spec:
containers:
- name: echo2
image: hashicorp/http-echo
args:
- "-text=echo2"
ports:
- containerPort: 5678
Здесь мы, по сути, используем тот же манифест службы и развертывания, что и выше, но называем и переименовываем службу и развертываниеecho2
. Кроме того, чтобы обеспечить некоторое разнообразие, мы создаем только 1 Pod реплику. Мы гарантируем, что установили для параметраtext
значениеecho2
, чтобы веб-сервер возвращал текстecho2
.
Сохраните и закройте файл и создайте ресурсы Kubernetes, используяkubectl
:
kubectl create -f echo2.yaml
Вы должны увидеть следующий вывод:
Outputservice/echo2 created
deployment.apps/echo2 created
Еще раз проверьте, что Сервис запущен и работает:
kubectl get svc
Вы должны увидеть службыecho1
иecho2
с назначенными IP-адресами ClusterIP:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
echo1 ClusterIP 10.245.222.129 80/TCP 6m6s
echo2 ClusterIP 10.245.128.224 80/TCP 6m3s
kubernetes ClusterIP 10.245.0.1 443/TCP 4d21h
Теперь, когда наши фиктивные веб-сервисы работают, мы можем перейти к развертыванию Nginx Ingress Controller.
[[step-2 -—- setting-up-the-kubernetes-nginx-ingress-controller]] == Шаг 2 - Настройка входящего контроллера Kubernetes Nginx
На этом этапе мы развернемv0.24.1
из поддерживаемых KubernetesNginx Ingress Controller. Обратите внимание, что существуют контроллеры входа Nginxseveral; сообщество Kubernetes поддерживает тот, который используется в этом руководстве, а Nginx Inc. поддерживаетkubernetes-ingress. Инструкции в этом руководстве основаны на инструкциях официального Kubernetes Nginx Ingress ControllerInstallation Guide.
Контроллер входа Nginx состоит из модуля, который запускает веб-сервер Nginx и следит за плоскостью управления Kubernetes для поиска новых и обновленных объектов ресурса входа. Входящий ресурс - это, по сути, список правил маршрутизации трафика для внутренних служб. Например, правило Ingress может указывать, что HTTP-трафик, поступающий по пути/web1
, должен быть направлен на внутренний веб-серверweb1
. Используя Ingress Resources, вы также можете выполнять маршрутизацию на основе хоста: например, запросы маршрутизации, которые попадают вweb1.your_domain.com
, в серверную службу Kubernetesweb1
.
В этом случае, поскольку мы развертываем контроллер входа в кластер DigitalOcean Kubernetes, он создает службу LoadBalancer, которая запускает балансировщик нагрузки DigitalOcean, на который будет направляться весь внешний трафик. Этот балансировщик нагрузки направляет внешний трафик на модуль Ingress Controller, на котором запущен Nginx, который затем перенаправляет трафик в соответствующие внутренние службы.
Мы начнем с создания ресурсов Kubernetes, необходимых для Nginx Ingress Controller. Сюда входят ConfigMaps, содержащие конфигурацию контроллера, роли управления доступом на основе ролей (RBAC) для предоставления контроллеру доступа к Kubernetes API и фактическое развертывание контроллера входящего трафика, которое используетv0.24.1 образа контроллера входа Nginx. Чтобы увидеть полный список этих необходимых ресурсов, обратитесь кmanifest из репозитория Kubernetes Nginx Ingress Controller на GitHub.
Чтобы создать эти обязательные ресурсы, используйтеkubectl apply
и флаг-f
, чтобы указать файл манифеста, размещенный на GitHub:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/mandatory.yaml
Здесь мы используемapply
вместоcreate
, чтобы в будущем мы могли постепенно изменятьapply
в объектах Ingress Controller вместо их полной перезаписи. Чтобы узнать больше оapply
, обратитесь кManaging Resources в официальной документации Kubernetes.
Вы должны увидеть следующий вывод:
Outputnamespace/ingress-nginx created
configmap/nginx-configuration created
configmap/tcp-services created
configmap/udp-services created
serviceaccount/nginx-ingress-serviceaccount created
clusterrole.rbac.authorization.k8s.io/nginx-ingress-clusterrole created
role.rbac.authorization.k8s.io/nginx-ingress-role created
rolebinding.rbac.authorization.k8s.io/nginx-ingress-role-nisa-binding created
clusterrolebinding.rbac.authorization.k8s.io/nginx-ingress-clusterrole-nisa-binding created
deployment.extensions/nginx-ingress-controller created
Этот вывод также служит удобной сводкой всех объектов Ingress Controller, созданных из манифестаmandatory.yaml
.
Далее мы создадим службу Ingress Controller LoadBalancer, которая создаст балансировщик нагрузки DigitalOcean, который будет балансировать нагрузку и направлять трафик HTTP и HTTPS на модуль Ingress Controller, развернутый в предыдущей команде.
Чтобы создать службу LoadBalancer, сноваkubectl apply
файл манифеста, содержащий определение службы:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/provider/cloud-generic.yaml
Вы должны увидеть следующий вывод:
Outputservice/ingress-nginx created
Теперь убедитесь, что балансировщик нагрузки DigitalOcean был успешно создан путем получения сведений о Службе с помощьюkubectl
:
kubectl get svc --namespace=ingress-nginx
Вы должны увидеть внешний IP-адрес, соответствующий IP-адресу устройства балансировки нагрузки DigitalOcean:
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
ingress-nginx LoadBalancer 10.245.247.67 203.0.113.0 80:32486/TCP,443:32096/TCP 20h
Запишите внешний IP-адрес балансировщика нагрузки, так как он понадобится вам позже.
[.note] #Note: По умолчанию служба Nginx Ingress LoadBalancer имеет дляservice.spec.externalTrafficPolicy
значениеLocal
, которое направляет весь трафик балансировщика нагрузки на узлы, на которых работают модули Nginx Ingress. Другие узлы намеренно не проходят проверки работоспособности балансировщика нагрузки, чтобы входящий трафик не направлялся на них. Политики внешнего трафика выходят за рамки этого руководства, но чтобы узнать больше, вы можете обратиться кA Deep Dive into Kubernetes External Traffic Policies иSource IP for Services with Type=LoadBalancer из официальных документов Kubernetes.
#
Этот балансировщик нагрузки получает трафик через порты HTTP и HTTPS 80 и 443 и перенаправляет его в модуль Ingress Controller. Затем Ingress Controller направит трафик в соответствующую внутреннюю службу.
Теперь мы можем направить наши записи DNS на этот внешний балансировщик нагрузки и создать некоторые входящие ресурсы для реализации правил маршрутизации трафика.
[[step-3 -—- created-the-ingress-resource]] == Шаг 3 - Создание Ingress-ресурса
Давайте начнем с создания минимального входного ресурса для маршрутизации трафика, направленного на данный поддомен, к соответствующей внутренней службе.
В этом руководстве мы будем использовать тестовый доменexample.com. Вы должны заменить это доменным именем, которым вы владеете.
Сначала мы создадим простое правило для маршрутизации трафика, направленного наecho1.example.com, на серверную службуecho1
, а трафика, направленного наecho2.example.com, на серверную службуecho2
.
Начните с открытия файла с именемecho_ingress.yaml
в вашем любимом редакторе:
nano echo_ingress.yaml
Вставьте следующее определение входа:
echo_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo-ingress
spec:
rules:
- host: echo1.example.com
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.example.com
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
Когда вы закончите редактировать свои правила Ingress, сохраните и закройте файл.
Здесь мы указали, что хотим создать ресурс Ingress с именемecho-ingress
и маршрутизировать трафик на основе заголовка Host. Заголовок узла HTTP-запроса указывает имя домена целевого сервера. Чтобы узнать больше о заголовках запросов хоста, обратитесь к Mozilla Developer Networkdefinition page. Запросы с хостомecho1.example.com будут направлены на бэкэндecho1
, настроенный на шаге 1, а запросы с хостомecho2.example.com будут направлены на бэкэндecho2
.
Теперь вы можете создать Ingress, используяkubectl
:
kubectl apply -f echo_ingress.yaml
Вы увидите следующий вывод, подтверждающий создание Ingress:
Outputingress.extensions/echo-ingress created
Чтобы протестировать Ingress, перейдите к своей службе управления DNS и создайте записи A дляecho1.example.com
иecho2.example.com
, указывающие на внешний IP-адрес DigitalOcean Load Balancer. Внешний IP-адрес балансировщика нагрузки - это внешний IP-адрес службыingress-nginx
, который мы получили на предыдущем шаге. Если вы используете DigitalOcean для управления записями DNS своего домена, обратитесь кHow to Manage DNS Records, чтобы узнать, как создавать записи A.
Создав необходимые записи DNSecho1.example.com
иecho2.example.com
, вы можете протестировать созданный вами контроллер Ingress и ресурс с помощью утилиты командной строкиcurl
.
С вашего локального компьютераcurl
сервисecho1
:
curl echo1.example.com
Вы должны получить следующий ответ от службыecho1
:
Outputecho1
Это подтверждает, что ваш запрос кecho1.example.com
правильно маршрутизируется через вход Nginx в серверную службуecho1
.
Теперь выполните тот же тест для службыecho2
:
curl echo2.example.com
Вы должны получить следующий ответ от службыecho2
:
Outputecho2
Это подтверждает, что ваш запрос кecho2.example.com
правильно маршрутизируется через вход Nginx в серверную службуecho2
.
К этому моменту вы успешно настроили базовый Nginx Ingress для выполнения маршрутизации на основе виртуального хоста. На следующем этапе мы установимcert-manager с помощью Helm, чтобы предоставить сертификаты TLS для нашего Ingress и включить более безопасный протокол HTTPS.
[[step-4 -—- install-and-configuring-cert-manager]] == Шаг 4 - Установка и настройка Cert-Manager
На этом этапе мы будем использовать Helm для установки cert-manager в наш кластер. cert-manager - это сервис Kubernetes, который предоставляет сертификаты TLS отLet’s Encrypt и других центров сертификации и управляет их жизненными циклами. Сертификаты могут быть запрошены и настроены путем аннотирования ресурсов Ingress аннотациейcertmanager.k8s.io/issuer
, добавления разделаtls
к спецификации Ingress и настройки одного или несколькихIssuers для указания предпочитаемого центра сертификации. Чтобы узнать больше об объектах Issuer, обратитесь к официальной документации cert-manager наIssuers.
[.note] #Note: Перед установкой cert-manager убедитесь, что вы используете Helm v2.12.1 или новее. Чтобы проверить версию Helm, которую вы установили, запуститеhelm version
на локальном компьютере.
#
Прежде чем использовать Helm для установки cert-manager в наш кластер, нам нужно создать cert-managerCustom Resource Definitions (CRD). Создайте их, `применив` прямо из диспетчера сертификатовGitHub repository:
kubectl apply \
-f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.8/deploy/manifests/00-crds.yaml
Вы должны увидеть следующий вывод:
Outputcustomresourcedefinition.apiextensions.k8s.io/certificates.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/issuers.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/clusterissuers.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/orders.certmanager.k8s.io created
customresourcedefinition.apiextensions.k8s.io/challenges.certmanager.k8s.io created
Затем мы добавим метку в пространство именkube-system
, где мы установим cert-manager, чтобы включить расширенную проверку ресурсов с помощьюwebhook:
kubectl label namespace kube-system certmanager.k8s.io/disable-validation="true"
Теперь мы добавимJetstack Helm repository в Helm. Этот репозиторий содержит диспетчер сертификатовHelm chart.
helm repo add jetstack https://charts.jetstack.io
Наконец, мы можем установить диаграмму в пространство именkube-system
:
helm install --name cert-manager --namespace kube-system jetstack/cert-manager --version v0.8.0
Вы должны увидеть следующий вывод:
Output. . .
NOTES:
cert-manager has been deployed successfully!
In order to begin issuing certificates, you will need to set up a ClusterIssuer
or Issuer resource (for example, by creating a 'letsencrypt-staging' issuer).
More information on the different types of issuers and how to configure them
can be found in our documentation:
https://cert-manager.readthedocs.io/en/latest/reference/issuers.html
For information on how to configure cert-manager to automatically provision
Certificates for Ingress resources, take a look at the `ingress-shim`
documentation:
https://cert-manager.readthedocs.io/en/latest/reference/ingress-shim.html
Это указывает на то, что установка cert-manager прошла успешно.
Прежде чем мы начнем выпускать сертификаты для наших узлов Ingress, нам нужно создать Issuer, который указывает центр сертификации, из которого можно получить подписанные сертификаты x509. В этом руководстве мы будем использовать центр сертификации Let Encrypt, который предоставляет бесплатные сертификаты TLS и предлагает как промежуточный сервер для тестирования конфигурации вашего сертификата, так и рабочий сервер для развертывания проверяемых сертификатов TLS.
Давайте создадим тестового эмитента, чтобы убедиться, что механизм предоставления сертификатов работает правильно. Откройте файл с именемstaging_issuer.yaml
в вашем любимом текстовом редакторе:
nano staging_issuer.yaml
Вставьте следующий манифест ClusterIssuer:
staging_issuer.yaml
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-staging
spec:
acme:
# The ACME server URL
server: https://acme-staging-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: your_email_address_here
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-staging
# Enable the HTTP-01 challenge provider
http01: {}
Здесь мы указываем, что хотим создать объект ClusterIssuer с именемletsencrypt-staging
и использовать промежуточный сервер Let’s Encrypt. Позже мы будем использовать производственный сервер для развертывания наших сертификатов, но рабочий сервер может ограничивать количество запросов на него, поэтому для целей тестирования лучше использовать промежуточный URL.
Затем мы указываем адрес электронной почты для регистрации сертификата и создаем KubernetesSecret с именемletsencrypt-staging
для хранения закрытого ключа учетной записи ACME. Мы также включаем механизм запросаHTTP-01
. Чтобы узнать больше об этих параметрах, обратитесь к официальной документации Cert-Manager наIssuers.
Разверните ClusterIssuer, используяkubectl
:
kubectl create -f staging_issuer.yaml
Вы должны увидеть следующий вывод:
Outputclusterissuer.certmanager.k8s.io/letsencrypt-staging created
Теперь, когда мы создали нашего промежуточного эмитента Let's Encrypt, мы готовы изменить созданный нами ранее ресурс Ingress и включить шифрование TLS для путейecho1.example.com
иecho2.example.com
.
Снова откройтеecho_ingress.yaml
в своем любимом редакторе:
nano echo_ingress.yaml
Добавьте в манифест входящего ресурса следующее:
echo_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo-ingress
annotations:
kubernetes.io/ingress.class: nginx
certmanager.k8s.io/cluster-issuer: letsencrypt-staging
spec:
tls:
- hosts:
- echo1.example.com
- echo2.example.com
secretName: letsencrypt-staging
rules:
- host: echo1.example.com
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.example.com
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
Здесь мы добавляем некоторые аннотации, чтобы указатьingress.class
, который определяет контроллер входа, который должен использоваться для реализации правил входа. Кроме того, мы определяемcluster-issuer
какletsencrypt-staging
, только что созданного эмитента сертификата.
Наконец, мы добавляем блокtls
, чтобы указать хосты, для которых мы хотим получить сертификаты, и указываемsecretName
. Этот секрет будет содержать закрытый ключ TLS и выданный сертификат.
Когда вы закончите вносить изменения, сохраните и закройте файл.
Теперь мы обновим существующий ресурс Ingress, используяkubectl apply
:
kubectl apply -f echo_ingress.yaml
Вы должны увидеть следующий вывод:
Outputingress.extensions/echo-ingress configured
Вы можете использоватьkubectl describe
для отслеживания состояния только что примененных вами изменений Ingress:
kubectl describe ingress
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal CREATE 14m nginx-ingress-controller Ingress default/echo-ingress
Normal UPDATE 1m (x2 over 13m) nginx-ingress-controller Ingress default/echo-ingress
Normal CreateCertificate 1m cert-manager Successfully created Certificate "letsencrypt-staging"
После успешного создания сертификата вы можете запустить на нем дополнительныйdescribe
, чтобы еще раз подтвердить его успешное создание:
kubectl describe certificate
Вы должны увидеть следующий вывод в разделеEvents
:
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Generated 63s cert-manager Generated new private key
Normal OrderCreated 63s cert-manager Created Order resource "letsencrypt-staging-147606226"
Normal OrderComplete 19s cert-manager Order "letsencrypt-staging-147606226" completed successfully
Normal CertIssued 18s cert-manager Certificate issued successfully
Это подтверждает, что сертификат TLS был успешно выдан и шифрование HTTPS теперь активно для двух настроенных доменов.
Теперь мы готовы отправить запрос на внутренний серверecho
, чтобы проверить правильность работы HTTPS.
Выполните следующую командуwget
, чтобы отправить запросecho1.example.com
и распечатать заголовки ответа вSTDOUT
:
wget --save-headers -O- echo1.example.com
Вы должны увидеть следующий вывод:
OutputURL transformed to HTTPS due to an HSTS policy
--2018-12-11 14:38:24-- https://echo1.example.com/
Resolving echo1.example.com (echo1.example.com)... 203.0.113.0
Connecting to echo1.example.com (echo1.example.net)|203.0.113.0|:443... connected.
ERROR: cannot verify echo1.example.com's certificate, issued by ‘CN=Fake LE Intermediate X1’:
Unable to locally verify the issuer's authority.
To connect to echo1.example.com insecurely, use `--no-check-certificate'.
Это указывает на то, что HTTPS был успешно включен, но сертификат не может быть проверен, поскольку это поддельный временный сертификат, выданный промежуточным сервером Let Encrypt.
Теперь, когда мы проверили, что все работает, используя этот временный поддельный сертификат, мы можем развернуть производственные сертификаты для двух хостовecho1.example.com
иecho2.example.com
.
[[step-5 -—- Rolling Out-Production-Issuer]] == Шаг 5 - Развертывание производственного эмитента
На этом этапе мы изменим процедуру, используемую для предоставления промежуточных сертификатов, и создадим действительный, проверяемый производственный сертификат для наших узлов Ingress.
Для начала мы создадим производственный сертификат ClusterIssuer.
Откройте файл с именемprod_issuer.yaml
в своем любимом редакторе:
nano prod_issuer.yaml
Вставьте в следующий манифест:
prod_issuer.yaml
apiVersion: certmanager.k8s.io/v1alpha1
kind: ClusterIssuer
metadata:
name: letsencrypt-prod
spec:
acme:
# The ACME server URL
server: https://acme-v02.api.letsencrypt.org/directory
# Email address used for ACME registration
email: your_email_address_here
# Name of a secret used to store the ACME account private key
privateKeySecretRef:
name: letsencrypt-prod
# Enable the HTTP-01 challenge provider
http01: {}
Обратите внимание на другой URL-адрес сервера ACME и имя секретного ключаletsencrypt-prod
.
Когда вы закончите редактирование, сохраните и закройте файл.
Теперь разверните этого эмитента, используяkubectl
:
kubectl create -f prod_issuer.yaml
Вы должны увидеть следующий вывод:
Outputclusterissuer.certmanager.k8s.io/letsencrypt-prod created
Обновитеecho_ingress.yaml
, чтобы использовать этого нового эмитента:
nano echo_ingress.yaml
Сделайте следующие изменения в файле:
echo_ingress.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: echo-ingress
annotations:
kubernetes.io/ingress.class: nginx
certmanager.k8s.io/cluster-issuer: letsencrypt-prod
spec:
tls:
- hosts:
- echo1.example.com
- echo2.example.com
secretName: letsencrypt-prod
rules:
- host: echo1.example.com
http:
paths:
- backend:
serviceName: echo1
servicePort: 80
- host: echo2.example.com
http:
paths:
- backend:
serviceName: echo2
servicePort: 80
Здесь мы обновляем как ClusterIssuer, так и секретное имя доletsencrypt-prod
.
Когда вы будете удовлетворены изменениями, сохраните и закройте файл.
Разверните изменения, используяkubectl apply
:
kubectl apply -f echo_ingress.yaml
Outputingress.extensions/echo-ingress configured
Подождите пару минут, пока производственный сервер Let Encrypt выдаст сертификат. Вы можете отслеживать его прогресс, используяkubectl describe
на объектеcertificate
:
kubectl describe certificate letsencrypt-prod
Как только вы увидите следующий вывод, сертификат был успешно выдан:
OutputEvents:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Generated 82s cert-manager Generated new private key
Normal OrderCreated 82s cert-manager Created Order resource "letsencrypt-prod-2626449824"
Normal OrderComplete 37s cert-manager Order "letsencrypt-prod-2626449824" completed successfully
Normal CertIssued 37s cert-manager Certificate issued successfully
Теперь мы проведем тест с использованиемcurl
, чтобы убедиться, что HTTPS работает правильно:
curl echo1.example.com
Вы должны увидеть следующее:
Output
308 Permanent Redirect
308 Permanent Redirect
nginx/1.15.9
Это указывает на то, что HTTP-запросы перенаправляются для использования HTTPS.
Запуститьcurl
наhttps://echo1.example.com
:
curl https://echo1.example.com
Теперь вы должны увидеть следующий вывод:
Outputecho1
Вы можете запустить предыдущую команду с подробным флагом-v
, чтобы глубже изучить рукопожатие сертификата и проверить информацию сертификата.
На этом этапе вы успешно настроили HTTPS, используя сертификат Let Encrypt для вашего Nginx Ingress.
Заключение
В этом руководстве вы настроите Nginx Ingress для балансировки нагрузки и маршрутизации внешних запросов к внутренним службам в вашем кластере Kubernetes. Вы также обезопасили Ingress, установив поставщик сертификатов cert-manager и настроив сертификат Let Encrypt для двух путей к хостам.
Есть много альтернатив для Nginx Ingress Controller. Чтобы узнать больше, обратитесь кIngress controllers в официальной документации Kubernetes.