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. Использование продуктов Cloud Marketplace
  3. Настройка Gateway API

Настройка Gateway API

Статья создана
Yandex Cloud
  • Перед началом работы
  • Создайте ресурсы Managed Service for Kubernetes
  • Установите Gateway API и настройте доменные зоны
  • Подготовьте тестовые приложения
    • Настройте приложение для среды dev
    • Настройте приложение для среды prod
    • Создайте тестовые приложения
  • Проверьте работу Gateway API
  • Удалите созданные ресурсы

Gateway API — набор ресурсов API, моделирующих сетевое взаимодействие в кластере Kubernetes.

Из этой статьи вы узнаете, как организовать доступ к приложениям, находящимся в двух тестовых средах dev и prod, с помощью Yandex Application Load Balancer через Gateway API. Для этого потребуется создать публичную доменную зону и делегировать домен сервису Yandex Cloud DNS.

Чтобы интегрировать Gateway API и Application Load Balancer:

  1. Создайте ресурсы Managed Service for Kubernetes.
  2. Установите Gateway API и настройте доменные зоны.
  3. Подготовьте тестовые приложения.
  4. Создайте тестовые приложения.
  5. Проверьте работу Gateway API.

Если созданные ресурсы вам больше не нужны, удалите их.

Перед началом работы

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

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

  2. Зарегистрируйте публичную доменную зону и делегируйте домен.

Создайте ресурсы Managed Service for Kubernetes

  1. Создайте кластер и группу узлов Kubernetes.

    Вручную
    С помощью Terraform
    1. Если у вас еще нет сети, создайте ее.
    2. Если у вас еще нет подсетей, создайте их в зонах доступности, где будут созданы кластер Kubernetes и группа узлов.
    3. Создайте кластер Kubernetes и группу узлов любой подходящей конфигурации.
    4. Создайте правило для подключения к сервисам из интернета и примените его к группе узлов кластера.
    1. Если у вас еще нет Terraform, установите его.

    2. Скачайте файл с настройками провайдера. Поместите его в отдельную рабочую директорию и укажите значения параметров.

    3. Скачайте в ту же рабочую директорию файл конфигурации кластера k8s-gateway-api.tf. В файле описаны:

      • Сеть.
      • Подсеть.
      • Группа безопасности и правила, необходимые для работы кластера, группы узлов и инстанса Kubernetes:
        • Правила для служебного трафика.
        • Правила для доступа к API Kubernetes и управления кластером с помощью kubectl через порты 443 и 6443.
        • Правила для доступа к сервисам из интернета.
      • Кластер Kubernetes.
      • Сервисный аккаунт, необходимый для работы кластера и группы узлов Kubernetes.
    4. Укажите в файле конфигурации:

      • Идентификатор каталога.
      • Версию Kubernetes для кластера и групп узлов Kubernetes.
      • CIDR кластера Kubernetes.
    5. Выполните команду terraform init в директории с конфигурационными файлами. Эта команда инициализирует провайдер, указанный в конфигурационных файлах, и позволяет работать с ресурсами и источниками данных провайдера.

    6. Проверьте корректность файлов конфигурации Terraform с помощью команды:

      terraform validate
      

      Если в файлах конфигурации есть ошибки, Terraform на них укажет.

    7. Создайте необходимую инфраструктуру:

      1. Выполните команду для просмотра планируемых изменений:

        terraform plan
        

        Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.

      2. Если вас устраивают планируемые изменения, внесите их:

        1. Выполните команду:

          terraform apply
          
        2. Подтвердите изменение ресурсов.

        3. Дождитесь завершения операции.

      В указанном каталоге будут созданы все требуемые ресурсы. Проверить появление ресурсов и их настройки можно в консоли управления.

  2. Установите kubectl и настройте его на работу с созданным кластером.

  3. Создайте сервисный аккаунт, необходимый для работы Gateway API.

  4. Назначьте ему роли:

    • alb.editor — для создания необходимых ресурсов.
    • certificate-manager.admin — для работы с сертификатами, зарегистрированными в сервисе Yandex Certificate Manager.
    • compute.viewer — для использования узлов кластера Managed Service for Kubernetes в целевых группах балансировщика нагрузки.
    • vpc.publicAdmin — для управления внешней связностью.
  5. Создайте для него статический ключ и сохраните в файл sa-key.json:

    yc iam key create \
      --service-account-name <имя сервисного аккаунта для Gateway API> \
      --output sa-key.json
    

Установите Gateway API и настройте доменные зоны

  1. Установите приложение Gateway API с помощью инструкции. При установке используйте ключ сервисного аккаунта, созданный ранее.

  2. Зарезервируйте публичные IP-адреса для тестовых сред prod и dev:

    yc vpc address create \
      --name=prod \
      --labels reserved=true \
      --external-ipv4 \
      zone=<зона доступности> && \
    yc vpc address create \
      --name=dev \
      --labels reserved=true \
      --external-ipv4 \
      zone=<зона доступности>
    

    Где зона доступности — зона доступности, в которой расположен ваш кластер Kubernetes.

    Сохраните публичные IP-адреса — они понадобятся для дальнейшей настройки.

  3. Создайте ресурсные записи для вашей публичной DNS-зоны:

    yc dns zone add-records \
      --name <имя вашей DNS-зоны> \
      --record '*.prod.<имя вашей DNS-зоны> 60 A <IP-адрес для среды prod>' && \
    yc dns zone add-records \
      --name <имя вашей DNS-зоны> \
      --record '*.dev.<имя вашей DNS-зоны> 60 A <IP-адрес для среды dev>'
    

    Пример корректной команды:

    yc dns zone add-records \
     --name my-test-domain.com \
     --record '*.dev.my-test-domain.com 60 A 171.154.241.41'
    
  4. Создайте пространство имен для TLS-секретов:

    kubectl create namespace gateway-api-tls-secrets
    
  5. Создайте сертификаты OpenSSL:

    openssl req -x509 \
      -newkey rsa:4096 \
      -keyout gateway-key-prod.pem \
      -out gateway-cert-prod.pem \
      -nodes \
      -days 365 \
      -subj '/CN=*.prod.<имя вашей DNS-зоны>' && \
    openssl req -x509 \
       -newkey rsa:4096 \
       -keyout gateway-key-dev.pem \
       -out gateway-cert-dev.pem \
       -nodes \
       -days 365 \
       -subj '/CN=*.dev.<имя вашей DNS-зоны>'
    

    На основании этих сертификатов в кластере Kubernetes будут созданы секреты для тестовых сред prod и dev.

  6. Создайте секреты:

    kubectl create -n gateway-api-tls-secrets secret tls gateway-prod-tls \
      --cert=gateway-cert-prod.pem \
      --key=gateway-key-prod.pem && \
    kubectl create -n gateway-api-tls-secrets secret tls gateway-dev-tls \
      --cert=gateway-cert-dev.pem \
      --key=gateway-key-dev.pem
    

Подготовьте тестовые приложения

Для проверки работы Gateway API будут созданы два приложения (tutum/hello-world и nginxdemos/hello). Для каждого приложения понадобится настройка и выполнение трех YAML-файлов:

  • dev-gw.yaml и prod-gw.yaml — настройки Gateway. В этих манифестах нужно указать:
    • Группу безопасности, в которой развернут ваш кластер Kubernetes, в параметре metadata.annotations.gateway.alb.yc.io/security-groups.
    • Имя вашей DNS-зоны с префиксами *.dev и *.prod в параметрах hostname.
    • IP-адреса для сред dev и prod в параметре spec.addresses.value.
  • dev-route.yaml и prod-route.yaml — настройка маршрутизации для приложений. В этих манифестах нужно указать имя вашей DNS-зоны с префиксами app.dev и app.prod в параметре spec.hostnames.
  • dev-app.yaml и prod-app.yaml — настройки приложений. С помощью этих манифестов будут созданы:
    • Пространство имен (уникальное для каждого приложения).
    • Deployment приложения.
    • Сервис.

Настройте приложение для среды dev

  1. Создайте манифест dev-gw.yaml:

    dev-gw.yaml
    ---
    apiVersion: gateway.networking.k8s.io/v1alpha2
    kind: Gateway
    metadata:
      name: gateway-api-dev
      annotations:
        gateway.alb.yc.io/security-groups: <группа безопасности кластера>
     spec:
      gatewayClassName: yc-df-class
      listeners:
      - name: gateway-api-dev
        protocol: HTTP
        port: 80
        hostname: "*.dev.<имя вашей DNS-зоны>"
        allowedRoutes:
          namespaces:
            from: Selector
            selector:
              matchExpressions:
              - key: kubernetes.io/metadata.name
                operator: In
                values:
                - dev-app
      - name: gateway-api-dev-tls
        protocol: HTTPS
        port: 443
        hostname: "*.dev.<имя вашей DNS-зоны>"
        allowedRoutes:
          namespaces:
            from: Selector
            selector:
              matchExpressions:
              - key: kubernetes.io/metadata.name
                operator: In
                values:
                - dev-app
        tls:
          certificateRefs:
          - group: ""
            kind: Secret
            name: gateway-dev-tls
            namespace: gateway-api-tls-secrets
          mode: Terminate
      addresses:
       - type: IPAddress
          value: <IP-адрес для среды dev>
    
  2. Создайте файл dev-route.yaml:

    dev-route.yaml
    ---
    apiVersion: gateway.networking.k8s.io/v1alpha2
    kind: HTTPRoute
    metadata:
      name: dev-app-http-route
      namespace: dev-app
    spec:
      hostnames:
      - "app.dev.<имя вашей DNS-зоны>"
      parentRefs:
      - name: gateway-api-dev
        namespace: default
      rules:
      - matches:
        - path:
            value: /
        backendRefs:
        - name: app
          port: 80
    
  3. Создайте манифест dev-app.yaml:

    dev-app.yaml
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: dev-app
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app
      namespace: dev-app
    spec:
      selector:
        matchLabels:
          app: app
      template:
        metadata:
          labels:
            app: app
        spec:
          containers:
          - name: app
            image: tutum/hello-world
            resources:
              limits:
                memory: "128Mi"
                cpu: "500m"
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: app
      namespace: dev-app
    spec:
      type: NodePort
      selector:
        app: app
      ports:
      - port: 80
        targetPort: 80
    

Настройте приложение для среды prod

  1. Создайте манифест prod-gw.yaml:

    prod-gw.yaml
    ---
    apiVersion: gateway.networking.k8s.io/v1alpha2
    kind: Gateway
    metadata:
      name: gateway-api-prod
      annotations:
        gateway.alb.yc.io/security-groups: <группа безопасности кластера>
    spec:
      gatewayClassName: yc-df-class
      listeners:
      - name: gateway-api-prod
        protocol: HTTP
        port: 80
        hostname: "*.prod.<имя вашей DNS-зоны>"
        allowedRoutes:
          namespaces:
            from: Selector
            selector:
              matchExpressions:
              - key: kubernetes.io/metadata.name
                operator: In
                values:
                - prod-app
      - name: gateway-api-prod-tls
        protocol: HTTPS
        port: 443
        hostname: "*.prod.<имя вашей DNS-зоны>"
        allowedRoutes:
          namespaces:
            from: Selector
            selector:
              matchExpressions:
              - key: kubernetes.io/metadata.name
                operator: In
                values:
                - prod-app
        tls:
          certificateRefs:
          - group: ""
            kind: Secret
            name: gateway-prod-tls
            namespace: gateway-api-tls-secrets
          mode: Terminate
      addresses:
        - type: IPAddress
          value: <IP-адрес для среды prod>
    
  2. Создайте манифест prod-route.yaml:

    prod-route.yaml
    ---
    apiVersion: gateway.networking.k8s.io/v1alpha2
    kind: HTTPRoute
    metadata:
      name: prod-app-http-route
      namespace: prod-app
    spec:
      hostnames:
      - "app.prod.<имя вашей DNS-зоны>"
      parentRefs:
      - name: gateway-api-prod
        namespace: default
      rules:
      - matches:
        - path:
            value: /
        backendRefs:
        - name: app
          port: 80
    
  3. Создайте манифест prod-app.yaml:

    prod-app.yaml
    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: prod-app
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: app
      namespace: prod-app
    spec:
      selector:
        matchLabels:
          app: app
      template:
        metadata:
          labels:
            app: app
        spec:
          containers:
          - name: app
            image: tutum/hello-world
            resources:
              limits:
                memory: "128Mi"
                cpu: "500m"
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: app
      namespace: prod-app
    spec:
      type: NodePort
      selector:
        app: app
      ports:
      - port: 80
        targetPort: 80
    

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

  1. Для установки приложений выполните команду:

    kubectl apply -f prod-gw.yaml && \
    kubectl apply -f prod-app.yaml && \
    kubectl apply -f prod-route.yaml && \
    kubectl apply -f dev-gw.yaml && \
    kubectl apply -f dev-app.yaml && \
    kubectl apply -f dev-route.yaml
    
  2. Убедитесь, что поды приложений перешли в состояние Running:

    kubectl get pods --namespace dev-app && \
    kubectl get pods --namespace prod-app
    
  3. Убедитесь, что для Gateway API создан балансировщик нагрузки:

    yc application-load-balancer load-balancer list
    

    Примечание

    Создание балансировщика нагрузки может занять несколько минут.

Проверьте работу Gateway API

Для проверки работы Gateway API перейдите по ссылкам в браузере:

  • app.prod.<имя вашей DNS-зоны>.
  • dev.prod.<имя вашей DNS-зоны>.

Удалите созданные ресурсы

Если созданные ресурсы вам больше не нужны, удалите их:

Вручную
С помощью Terraform
  1. Удалите кластер Kubernetes.
  2. Удалите созданные подсети и сети.
  3. Удалите созданный сервисный аккаунт.
  1. В командной строке перейдите в директорию, в которой расположен актуальный конфигурационный файл Terraform с планом инфраструктуры.

  2. Удалите конфигурационный файл k8s-gateway-api.tf.

  3. Проверьте корректность файлов конфигурации Terraform с помощью команды:

    terraform validate
    

    Если в файлах конфигурации есть ошибки, Terraform на них укажет.

  4. Подтвердите изменение ресурсов.

    1. Выполните команду для просмотра планируемых изменений:

      terraform plan
      

      Если конфигурации ресурсов описаны верно, в терминале отобразится список изменяемых ресурсов и их параметров. Это проверочный этап: ресурсы не будут изменены.

    2. Если вас устраивают планируемые изменения, внесите их:

      1. Выполните команду:

        terraform apply
        
      2. Подтвердите изменение ресурсов.

      3. Дождитесь завершения операции.

    Все ресурсы, которые были описаны в конфигурационном файле k8s-gateway-api.tf, будут удалены.

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

Language / Region
Проект Яндекса
© 2023 ООО «Яндекс.Облако»
В этой статье:
  • Перед началом работы
  • Создайте ресурсы Managed Service for Kubernetes
  • Установите Gateway API и настройте доменные зоны
  • Подготовьте тестовые приложения
  • Настройте приложение для среды dev
  • Настройте приложение для среды prod
  • Создайте тестовые приложения
  • Проверьте работу Gateway API
  • Удалите созданные ресурсы