Yandex Cloud
  • Сервисы
  • Решения
  • Почему Yandex Cloud
  • Сообщество
  • Тарифы
  • Документация
  • Связаться с нами
Подключиться
Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
Yandex Managed Service for Kubernetes
  • Сопоставление с другими сервисами Yandex Cloud
  • Начало работы
  • Пошаговые инструкции
    • Все инструкции
    • Подключение к узлу по SSH
    • Обновление Kubernetes
    • Настройка автомасштабирования
    • Подключение к кластеру
      • Обзор способов подключения
      • Настройка групп безопасности
      • Создание статического файла конфигурации
    • Установка приложений из Cloud Marketplace
      • Основы работы с Cloud Marketplace
      • Установка Argo CD
      • Установка Container Storage Interface для S3
      • Установка Crossplane
      • Установка External Secrets Operator
      • Установка Falco
      • Установка Filebeat
      • Установка Fluent Bit
      • Установка Gateway API
      • Установка GitLab Agent
      • Установка GitLab Runner
      • Установка HashiCorp Vault
      • Установка Ingress-контроллера Application Load Balancer
      • Установка Jaeger
      • Установка Kyverno & Kyverno Policies
      • Установка Loki
      • Установка Metrics Provider
      • Установка NodeLocal DNS
      • Установка Policy Reporter
      • Установка Thumbor
    • Сетевые сценарии
      • Обеспечение доступа к приложению, запущенному в кластере Kubernetes
      • Настройка контроллера сетевых политик Calico
      • Настройка контроллера сетевых политик Cilium
      • Настройка NodeLocal DNS для контроллера сетевых политик Cilium
    • Работа с постоянными томами
      • Динамическая подготовка тома
      • Статическая подготовка тома
      • Управление классами хранилищ
      • Увеличение размера тома для подов
      • Увеличение размера тома для контроллера StatefulSet
      • Подключение тома в блочном режиме
      • Интеграция с Object Storage
    • Управление кластером Kubernetes
      • Получение информации о кластере Kubernetes
      • Создание кластера Kubernetes
      • Изменение кластера Kubernetes
      • Создание пространства имен в кластере Kubernetes
      • Удаление кластера Kubernetes
    • Управление группой узлов
      • Информация об имеющихся группах узлов
      • Создание группы узлов
      • Подключение к узлу по SSH
      • Настройка автомасштабирования
      • Изменение группы узлов
      • Управление метками узлов кластера Kubernetes
      • Удаление группы узлов
    • Подключение внешних узлов к кластеру
  • Практические руководства
    • Все руководства
    • Создание нового Kubernetes-проекта в Yandex Cloud
    • Интеграция с Container Registry
    • Подпись и проверка Docker-образов Container Registry
    • Сканирование уязвимостей Container Registry при непрерывном развертывании приложений с помощью GitLab
    • Запуск рабочих нагрузок с GPU
    • Установка Ingress-контроллера NGINX с Let's Encrypt®
    • Установка Ingress-контроллера NGINX с сертификатом из Certificate Manager
    • Резервное копирование в Object Storage
    • Горизонтальное масштабирование приложения в кластере
    • Вертикальное масштабирование приложения в кластере
    • Развертывание и нагрузочное тестирование gRPC-сервиса с масштабированием
    • Работа со снапшотами
    • Интеграция с корпоративной зоной DNS
    • Автоматическое масштабирование DNS по размеру кластера
    • Настройка локального кеширования DNS
    • Проверка DNS Challenge для сертификатов Let's Encrypt®
    • Мониторинг кластера с помощью Prometheus и Grafana
    • Непрерывное развертывание контейнеризованных приложений с помощью GitLab
    • Изменение параметров сервера метрик (Metrics Server)
    • Использование продуктов Cloud Marketplace
      • Интеграция с Argo CD
      • Интеграция с Crossplane
      • Синхронизация с секретами Yandex Lockbox
      • Настройка Fluent Bit для работы с Cloud Logging
      • Настройка Gateway API
      • Настройка Application Load Balancer Ingress-контроллера
      • Использование Jaeger для трассировки запросов в Managed Service for YDB
      • Настройка Kyverno & Kyverno Policies
      • Использование Metrics Provider для трансляции метрик
  • Концепции
    • Взаимосвязь ресурсов сервиса
    • Релизные каналы и обновления
    • Шифрование секретов
    • Использование объектов API Kubernetes
      • Том
      • Сервис
    • Группа узлов
      • Автоматическое масштабирование группы узлов
      • Расселение подов с узла
      • Динамическое резервирование ресурсов для узла
      • Группы узлов с GPU
    • Сеть в Managed Service for Kubernetes
    • Внешние узлы кластера
    • Сетевые настройки и политики кластера
    • Автоматическое масштабирование
    • Квоты и лимиты
    • Рекомендации по использованию Managed Service for Kubernetes
  • Управление доступом
  • Правила тарификации
  • Справочник API
    • Аутентификация в API
    • gRPC (англ.)
      • Overview
      • ClusterService
      • NodeGroupService
      • VersionService
      • OperationService
    • REST (англ.)
      • Overview
      • Cluster
        • Overview
        • create
        • delete
        • get
        • list
        • listNodeGroups
        • listNodes
        • listOperations
        • start
        • stop
        • update
      • NodeGroup
        • Overview
        • create
        • delete
        • get
        • list
        • listNodes
        • listOperations
        • update
      • Version
        • Overview
        • list
  • Вопросы и ответы
    • Общие вопросы
    • Хранилище данных
    • Настройка и обновление
    • Автоматическое масштабирование
    • Ресурсы
    • Логи
    • Все вопросы на одной странице
  1. Пошаговые инструкции
  2. Сетевые сценарии
  3. Обеспечение доступа к приложению, запущенному в кластере Kubernetes

Обеспечение доступа к приложению, запущенному в кластере Kubernetes

Статья создана
Yandex Cloud
  • Создайте простое приложение
  • Создайте сервис типа LoadBalancer с публичным IP-адресом
  • Создайте сервис типа LoadBalancer с внутренним IP-адресом
  • Параметры loadBalancerIP и externalTrafficPolicy
  • Параметры проверки состояния узлов
  • Создайте объект NetworkPolicy

Для предоставления доступа к приложению, запущенному в кластере 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.

Создайте простое приложение

  1. Сохраните следующую спецификацию для создания приложения в 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
    
  2. Создайте приложение:

    CLI

    Если у вас еще нет интерфейса командной строки Yandex Cloud, установите и инициализируйте его.

    По умолчанию используется каталог, указанный в профиле CLI. Вы можете указать другой каталог с помощью параметра --folder-name или --folder-id.

    kubectl apply -f hello.yaml
    

    Результат:

    deployment.apps/hello created
    
  3. Посмотрите информацию о созданном приложении:

    CLI
    kubectl 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.
  1. Сохраните следующую спецификацию для создания сервиса типа 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
    
  2. Создайте сетевой балансировщик нагрузки:

    CLI
    kubectl apply -f load-balancer.yaml
    

    Результат:

    service/hello created
    
  3. Посмотрите информацию о созданном сетевом балансировщике нагрузки:

    Консоль управления
    CLI
    1. В консоли управления выберите ваш каталог по умолчанию.
    2. Выберите сервис Network Load Balancer.
    3. На вкладке Балансировщики отображен сетевой балансировщик нагрузки с префиксом 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
    
  4. Убедитесь, что приложение доступно из интернета:

    CLI
    curl 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 обязательно.

Пример настройки объекта 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

Была ли статья полезна?

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Создайте простое приложение
  • Создайте сервис типа LoadBalancer с публичным IP-адресом
  • Создайте сервис типа LoadBalancer с внутренним IP-адресом
  • Параметры loadBalancerIP и externalTrafficPolicy
  • Параметры проверки состояния узлов
  • Создайте объект NetworkPolicy