Обеспечение доступа к приложению, запущенному в кластере Kubernetes
Для предоставления доступа к приложению, запущенному в кластере Kubernetes, вы можете использовать публичные и внутренние сервисы различных типов.
Чтобы опубликовать приложение, воспользуйтесь сервисом типа LoadBalancer
. Возможны следующие варианты:
-
Публичный доступ по IP-адресу с сетевым балансировщиком нагрузки.
-
Доступ из внутренних сетей по IP-адресу с внутренним сетевым балансировщиком нагрузки.
Приложение будет доступно:
-
из подсетей Yandex Virtual Private Cloud;
-
внутренних подсетей организации, подключенных к Yandex Cloud с помощью сервиса Yandex Cloud Interconnect;
-
через VPN.
-
Чтобы использовать защиту от DDoS, зарезервируйте публичный IP-адрес и укажите его с помощью опции loadBalancerIP
.
Примечание
В отличие от IP-адреса пода или узла, который может меняться в случае обновления ресурсов группы узлов, IP-адрес сервиса типа LoadBalancer
не изменяется.
Подготовьте и запустите в кластере Kubernetes приложение, к которому необходимо предоставить доступ с помощью сервиса типа LoadBalancer
. В качестве примера используйте простое приложение, которое отвечает на HTTP-запросы на порт 8080.
- Создайте простое приложение.
- Создайте сервис типа LoadBalancer с публичным IP-адресом.
- Создайте сервис типа LoadBalancer с внутренним IP-адресом.
- Параметры loadBalancerIP и externalTrafficPolicy.
- (Опционально) Создайте объект NetworkPolicy.
Создайте простое приложение
-
Сохраните следующую спецификацию для создания приложения в 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/crpab12cdef353nl11i9/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-74c9c1b238 (2/2 replicas created) Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal ScalingReplicaSet 10s deployment-controller Scaled up replica set hello-74c9c1b238 to 2
Создайте сервис типа LoadBalancer с публичным IP-адресом
Когда вы создаете сервис типа LoadBalancer
, контроллер Yandex Cloud создает и настраивает для вас сетевой балансировщик нагрузки в вашем каталоге с публичным IP-адресом.
Важно
- Созданный сетевой балансировщик тарифицируется согласно установленным правилам тарификации.
- Не изменяйте и не удаляйте сетевой балансировщик нагрузки и целевые группы, которые будут автоматически созданы в вашем каталоге после создания сервиса с типом
LoadBalancer
.
-
Сохраните следующую спецификацию для создания сервиса типа
LoadBalancer
в YAML-файл с именемload-balancer.yaml
:apiVersion: v1 kind: Service metadata: name: hello spec: ports: # Порт сетевого балансировщика, на котором будут обслуживаться пользовательские запросы. - port: 80 name: plaintext # Порт контейнера, на котором доступно приложение. targetPort: 8080 # Метки селектора, использованные в шаблоне подов при создании объекта Deployment. selector: app: hello type: LoadBalancer
-
Создайте сетевой балансировщик нагрузки:
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: 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-74c9c1b238-c1rpa'
Создайте сервис типа LoadBalancer с внутренним IP-адресом
Примечание
Внутренний сетевой балансировщик нагрузки находится на стадии Preview.
Чтобы создать внутренний сетевой балансировщик нагрузки, укажите в YAML-спецификации сервиса в секции annotations
параметры yandex.cloud/load-balancer-type
и yandex.cloud/subnet-id
:
apiVersion: v1
kind: Service
metadata:
name: hello
annotations:
# Тип балансировщика: внутренний.
yandex.cloud/load-balancer-type: internal
# Идентификатор подсети, в которой необходимо выделить IP-адрес для
# внутреннего сетевого балансировщика нагрузки.
yandex.cloud/subnet-id: e1b23q26ab1c0dce8te9
spec:
type: LoadBalancer
ports:
# Порт внутреннего сетевого балансировщика, на котором будут
# обслуживаться пользовательские запросы.
- port: 80
name: plaintext
# Порт контейнера, на котором доступно приложение.
targetPort: 8080
# Метки селектора, использованные в шаблоне подов при создании
# объекта Deployment.
selector:
app: hello
Параметры loadBalancerIP и externalTrafficPolicy
В Managed Service for Kubernetes для сервиса типа LoadBalancer
доступны следующие дополнительные настройки:
-
Назначение заранее зарезервированного публичного IP-адреса с помощью параметра
loadBalancerIP
.Во время резервирования статического IP-адреса можно активировать защиту от DDoS-атак.
-
Управление трафиком с помощью параметра externalTrafficPolicy:
Cluster
— трафик попадает на любой из узлов кластера Kubernetes. При этом:- В случае отсутствия нужных подов на узле, трафик перенаправляется с помощью kube-proxy на другой узел.
Local
— трафик напрямую попадает на узлы, где запущены контейнеры приложений. При этом:- Сохраняется IP-адрес запроса пользователя.
- Используется меньше горизонтального трафика между виртуальными машинами.
Параметры loadBalancerIP
и externalTrafficPolicy
не обязательные. Если их не указывать, балансировщик будет создан с динамическим IP-адресом и параметром externalTrafficPolicy: Cluster
.
Пример YAML-спецификации сервиса типа LoadBalancer
с этими параметрами:
apiVersion: v1
kind: Service
metadata:
name: hello
spec:
ports:
- port: 80
name: plaintext
targetPort: 8080
selector:
app: hello
loadBalancerIP: <заранее зарезервированный IP-адрес>
type: LoadBalancer
externalTrafficPolicy: <Local или Cluster>
Параметры проверки состояния узлов
Сервисы типа LoadBalancer
в Managed Service for Kubernetes могут выполнять запросы проверки состояния целевой группы узлов Kubernetes. На основании полученных метрик Managed Service for Kubernetes принимает решение о доступности узлов.
Чтобы включить режим проверки состояния узлов, укажите набор параметров yandex.cloud/load-balancer-healthcheck
в спецификации сервиса, например:
apiVersion: v1
...
annotations:
yandex.cloud/load-balancer-healthcheck-healthy-threshold: "2"
yandex.cloud/load-balancer-healthcheck-interval: "2s"
yandex.cloud/load-balancer-healthcheck-timeout: "1s"
yandex.cloud/load-balancer-healthcheck-unhealthy-threshold: "2"
...
Где:
-
yandex.cloud/load-balancer-healthcheck-healthy-threshold
— число последовательных удачных проверок, по достижении которого узел будет считаться доступным.Минимальное значение —
2
, максимальное значение —10
. -
yandex.cloud/load-balancer-healthcheck-interval
— интервал выполнения проверок (в секундах).Минимальное значение —
2s
, максимальное значение —300s
. -
yandex.cloud/load-balancer-healthcheck-timeout
— таймаут выполнения проверки (в секундах). Узел считается недоступным, если он не ответил за отведенное время.Минимальное значение —
1s
, максимальное значение —60s
. -
yandex.cloud/load-balancer-healthcheck-unhealthy-threshold
— число последовательных неудачных проверок, по достижении которого узел будет считаться недоступным.Минимальное значение —
2
, максимальное значение —10
.
Подробнее см. в документации Yandex Network Load Balancer.
Создайте объект NetworkPolicy
Для подключения к сервисам, опубликованным через Network Load Balancer, с определенных IP-адресов, в кластере должны быть включены сетевые политики. Для настройки доступа через балансировщик создайте объект NetworkPolicy с политикой типа Ingress
:
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: <имя политики>
namespace: <пространство имен>
spec:
podSelector:
<правила фильтрации подов>
policyTypes:
- Ingress
ingress:
- from:
- ipBlock:
cidr: 198.18.235.0/24
- ipBlock:
cidr: 198.18.248.0/24
- ipBlock:
cidr: <диапазон адресов, с которых разрешен доступ к балансировщику>
...
- ipBlock:
cidr: <диапазон адресов, с которых разрешен доступ к балансировщику>
Где:
-
metadata.name
— имя политики. -
metadata.namespace
— пространство имен. -
spec.podSelector
— правила фильтрации подов. -
spec.policyTypes
— тип политики. Укажите значениеIngress
. -
spec.ingress.from.ipBlock.cidr
— диапазоны адресов, с которых разрешен доступ к балансировщику.Диапазоны
198.18.235.0/24
и198.19.248.0/24
зарезервированы Network Load Balancer для проверки состояния узлов. Их указание в настройках объекта 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