Обеспечение доступа к приложению, запущенному в кластере Kubernetes
Для предоставления доступа к приложению, запущенному в кластере Kubernetes, вы можете использовать публичные и внутренние сервисы различных типов.
Чтобы опубликовать приложение, воспользуйтесь сервисом типа LoadBalancer
. Возможны следующие варианты:
-
Публичный доступ по IP-адресу с сетевым балансировщиком нагрузки.
-
Доступ из внутренних сетей по IP-адресу с внутренним сетевым балансировщиком нагрузки.
Приложение будет доступно:
- Из подсетей Yandex Virtual Private Cloud.
- Из внутренних подсетей организации, подключенных к Yandex Cloud с помощью сервиса Yandex Cloud Interconnect.
- Через VPN.
При использовании внешнего балансировщика нагрузки в поле loadBalancerIP
можно указать статический публичный IP-адрес. Такой адрес необходимо зарезервировать заранее. Во время резервирования публичного IP-адреса можно активировать защиту от DDoS-атак.
Если не указывать статический IP-адрес, то сетевому балансировщику нагрузки будет назначен динамический IP-адрес.
Примечание
В отличие от IP-адреса пода или узла, который может меняться в случае обновления ресурсов группы узлов, статический IP-адрес сервиса типа LoadBalancer
не изменяется.
Подготовьте и запустите в кластере Kubernetes приложение, к которому необходимо предоставить доступ с помощью сервиса типа LoadBalancer
. В качестве примера используйте приложение, которое отвечает на HTTP-запросы на порт 8080.
- Создайте простое приложение.
- Создайте сервис типа LoadBalancer с публичным IP-адресом.
- Создайте сервис типа LoadBalancer с внутренним IP-адресом.
- Укажите дополнительные параметры сервиса.
- Укажите параметры проверки состояния узлов.
- (Опционально) Создайте объект NetworkPolicy.
Как обеспечить доступ к приложению с помощью HTTPS?
См. документацию:
- Создание нового Kubernetes-проекта в Yandex Cloud
- Настройка L7-балансировщика Yandex Application Load Balancer с помощью Ingress-контроллера
- Установка Ingress-контроллера NGINX с менеджером для сертификатов Let's Encrypt®
- Установка Ingress-контроллера NGINX с сертификатом из Yandex Certificate Manager
Если созданные ресурсы вам больше не нужны, удалите их.
Перед началом работы
Подготовьте необходимую инфраструктуру:
-
Создайте облачную сеть и подсеть.
-
Создайте сервисный аккаунт с ролью
editor
. -
Создайте группы безопасности для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
Создайте кластер Managed Service for Kubernetes и группу узлов с публичным доступом в интернет и с группами безопасности, подготовленными ранее.
-
Если у вас еще нет Terraform, установите его.
-
Получите данные для аутентификации. Вы можете добавить их в переменные окружения или указать далее в файле с настройками провайдера.
-
Настройте и инициализируйте провайдер. Чтобы не создавать конфигурационный файл с настройками провайдера вручную, скачайте его
. -
Поместите конфигурационный файл в отдельную рабочую директорию и укажите значения параметров. Если данные для аутентификации не были добавлены в переменные окружения, укажите их в конфигурационном файле.
-
Скачайте в ту же рабочую директорию файл конфигурации кластера Managed Service for Kubernetes k8s-load-balancer.tf
. В файле описаны:-
Сеть.
-
Кластер Managed Service for Kubernetes.
-
Сервисный аккаунт, необходимый для работы кластера и группы узлов Managed Service for Kubernetes.
-
Группы безопасности, которые содержат необходимые правила для кластера Managed Service for Kubernetes и входящих в него групп узлов.
Важно
От настройки групп безопасности зависит работоспособность и доступность кластера, а также запущенных в нем сервисов и приложений.
-
-
Укажите в файле конфигурации:
- Идентификатор каталога.
- Версию Kubernetes для кластера и групп узлов Managed Service for Kubernetes.
- Имя сервисного аккаунта кластера Managed Service for Kubernetes.
-
Проверьте корректность файлов конфигурации Terraform с помощью команды:
terraform validate
Если в файлах конфигурации есть ошибки, Terraform на них укажет.
-
Создайте необходимую инфраструктуру:
-
Выполните команду для просмотра планируемых изменений:
terraform plan
Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.
-
Если вас устраивают планируемые изменения, внесите их:
-
Выполните команду:
terraform apply
-
Подтвердите изменение ресурсов.
-
Дождитесь завершения операции.
-
В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления
. -
Создайте простое приложение
-
Сохраните следующую спецификацию для создания приложения в YAML-файл с именем
hello.yaml
.Deployment
— объект API Kubernetes, который управляет реплицированным приложением.apiVersion: apps/v1 kind: Deployment metadata: name: hello spec: replicas: 2 selector: matchLabels: app: hello template: metadata: labels: app: hello spec: containers: - name: hello-app image: cr.yandex/crpjd37scfv653nl11i9/hello:1.1
-
Создайте приложение:
CLIЕсли у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.
По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра
--folder-name
или--folder-id
.kubectl apply -f hello.yaml
Результат:
deployment.apps/hello created
-
Посмотрите информацию о созданном приложении:
CLIkubectl describe deployment hello
Результат:
Name: hello Namespace: default CreationTimestamp: Wed, 28 Oct 2020 23:15:25 +0300 Labels: <none> Annotations: deployment.kubernetes.io/revision: 1 Selector: app=hello Replicas: 2 desired | 2 updated | 2 total | 1 available | 1 unavailable StrategyType: RollingUpdate MinReadySeconds: 0 RollingUpdateStrategy: 25% max unavailable, 25% max surge Pod Template: Labels: app=hello Containers: hello-app: Image: cr.yandex/crpjd37scfv653nl11i9/hello:1.1 Port: <none> Host Port: <none> Environment: <none> Mounts: <none> Volumes: <none> Conditions: Type Status Reason ---- ------ ------ Available False MinimumReplicasUnavailable Progressing True ReplicaSetUpdated OldReplicaSets: <none> NewReplicaSet: hello-******** (2/2 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 10s deployment-controller Scaled up replica set hello-******** to 2
Создайте сервис типа LoadBalancer с публичным IP-адресом
Когда вы создаете сервис типа LoadBalancer
, контроллер Yandex Cloud создает в вашем каталоге и настраивает для вас сетевой балансировщик нагрузки с публичным IP-адресом.
Важно
- Созданный сетевой балансировщик тарифицируется согласно установленным правилам тарификации.
- Не изменяйте и не удаляйте сетевой балансировщик нагрузки и целевые группы, которые будут автоматически созданы в вашем каталоге после создания сервиса с типом
LoadBalancer
.
-
Сохраните следующую спецификацию для создания сервиса типа
LoadBalancer
в YAML-файл с именемload-balancer.yaml
:apiVersion: v1 kind: Service metadata: name: hello spec: type: LoadBalancer ports: - port: 80 name: plaintext targetPort: 8080 # Kubernetes-метки селектора, использованные в шаблоне подов при создании объекта Deployment. selector: app: hello
Подробнее см. в справочнике ресурса
Service
для Yandex Network Load Balancer. -
Создайте сетевой балансировщик нагрузки:
CLIkubectl apply -f load-balancer.yaml
Результат:
service/hello created
-
Посмотрите информацию о созданном сетевом балансировщике нагрузки:
Консоль управленияCLI- В консоли управления
выберите ваш каталог по умолчанию. - Выберите сервис Network Load Balancer.
- На вкладке Балансировщики отображен сетевой балансировщик нагрузки с префиксом
k8s
в имени и уникальным идентификатором вашего кластера Kubernetes в описании.
kubectl describe service hello
Результат:
Name: hello Namespace: default Labels: <none> Annotations: <none> Selector: app=hello Type: LoadBalancer IP: 172.20.169.7 LoadBalancer Ingress: 130.193.50.111 Port: plaintext 80/TCP TargetPort: 8080/TCP NodePort: plaintext 32302/TCP Endpoints: 10.1.130.4:8080 Session Affinity: None External Traffic Policy: Cluster Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal EnsuringLoadBalancer 2m43s service-controller Ensuring load balancer Normal EnsuredLoadBalancer 2m17s service-controller Ensured load balancer
- В консоли управления
-
Убедитесь, что приложение доступно из интернета:
CLIcurl http://130.193.50.111
Где
130.193.50.111
— публичный IP-адрес из поляLoadBalancer Ingress
.Результат:
Hello, world! Running in 'hello-********'
Примечание
Если ресурс недоступен по указанному URL, то убедитесь, что группы безопасности для кластера Managed Service for Kubernetes и его групп узлов настроены корректно. Если отсутствует какое-либо из правил — добавьте его.
Создайте сервис типа LoadBalancer с внутренним IP-адресом
-
Измените спецификацию в файле
load-balancer.yaml
:apiVersion: v1 kind: Service metadata: name: hello annotations: # Тип балансировщика. yandex.cloud/load-balancer-type: internal # Идентификатор подсети для внутреннего сетевого балансировщика нагрузки. yandex.cloud/subnet-id: e1b23q26ab1c******** spec: type: LoadBalancer ports: - port: 80 name: plaintext targetPort: 8080 # Kubernetes-метки селектора, использованные в шаблоне подов при создании объекта Deployment. selector: app: hello
Подробнее см. в справочнике ресурса
Service
для Yandex Network Load Balancer. -
Удалите созданный ранее внешний сетевой балансировщик нагрузки:
CLIkubectl delete service hello
Результат:
service "hello" deleted
-
Создайте внутренний сетевой балансировщик нагрузки:
CLIkubectl apply -f load-balancer.yaml
Результат:
service/hello created
Укажите дополнительные параметры сервиса
В Managed Service for Kubernetes для сервиса типа LoadBalancer
можно указать дополнительные параметры:
loadBalancerIP
— заранее зарезервированный (статический) публичный IP-адрес.externalTrafficPolicy
— политика управления трафиком .
Пример
apiVersion: v1
kind: Service
metadata:
name: hello
spec:
type: LoadBalancer
ports:
- port: 80
name: plaintext
targetPort: 8080
selector:
app: hello
loadBalancerIP: 159.161.32.22
externalTrafficPolicy: Cluster
Подробнее см. в справочнике ресурса Service
для Yandex Network Load Balancer.
Укажите параметры проверки состояния узлов
Сервисы типа LoadBalancer
в Managed Service for Kubernetes могут выполнять запросы проверки состояния целевой группы узлов Kubernetes. На основании полученных метрик Managed Service for Kubernetes принимает решение о доступности узлов.
Чтобы включить режим проверки состояния узлов, укажите аннотации yandex.cloud/load-balancer-healthcheck-*
в спецификации сервиса, например:
apiVersion: v1
kind: Service
metadata:
name: hello
annotations:
# Параметры проверки состояния узлов
yandex.cloud/load-balancer-healthcheck-healthy-threshold: "2"
yandex.cloud/load-balancer-healthcheck-interval: "2s"
Подробнее см. в справочнике ресурса Service
для Yandex Network Load Balancer.
Создайте объект NetworkPolicy
Для подключения к сервисам, опубликованным через Network Load Balancer, с определенных IP-адресов, в кластере должны быть включены сетевые политики. Для настройки доступа через балансировщик создайте объект NetworkPolicyIngress
.
Пример настройки объекта NetworkPolicy
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: whitelist-netpol
namespace: ns-example
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
ingress:
- from:
# Диапазоны адресов, используемые балансировщиком для проверки состояния узлов.
- ipBlock:
cidr: 198.18.235.0/24
- ipBlock:
cidr: 198.18.248.0/24
# Диапазоны адресов подов.
- ipBlock:
cidr: 172.16.1.0/12
- ipBlock:
cidr: 172.16.2.0/12
Подробнее см. в справочнике ресурса NetworkPolicy
для Yandex Network Load Balancer.
Удалите созданные ресурсы
Удалите ресурсы, которые вы больше не будете использовать, чтобы за них не списывалась плата:
-
Удалите ресурсы в зависимости от способа их создания:
ВручнуюTerraform-
В терминале перейдите в директорию с планом инфраструктуры.
Важно
Убедитесь, что в директории нет Terraform-манифестов с ресурсами, которые вы хотите сохранить. Terraform удаляет все ресурсы, которые были созданы с помощью манифестов в текущей директории.
-
Удалите ресурсы:
-
Выполните команду:
terraform destroy
-
Подтвердите удаление ресурсов и дождитесь завершения операции.
Все ресурсы, которые были описаны в Terraform-манифестах, будут удалены.
-
-
-
Если для доступа к кластеру Managed Service for Kubernetes или узлам использовались статические публичные IP-адреса, освободите и удалите их.