Облачная платформаEvolution

Публикация приложения с помощью Istio и Gateway API


Istio поддерживает Kubernetes Gateway API для управления трафиком. В инструкции рассмотрим пример настройки Istio в кластере Managed Kubernetes для предоставления доступа к приложению извне с использованием Gateway API.

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

  1. Создайте кластер Managed Kubernetes и хотя бы одну группу узлов.

    Минимальные параметры для группы узлов:

    • Гарантированная доля vCPU, %10.

    • CPU, шт.4.

    • RAM, ГБ8.

    • Объем хранилища, ГБ40.

    • Количество узлов1.

  2. Убедитесь, что в зоне доступности, которая выбрана для группы узлов, создан SNAT-шлюз .

  3. Подключитесь к кластеру Managed Kubernetes.

1. Установите CRD для Gateway API

  1. Установите CRD для Gateway API:

    kubectl apply -f https://github.com/kubernetes-sigs/gateway-api/releases/download/v1.5.1/standard-install.yaml
  2. Проверьте, что CRD установлен:

    kubectl get crd | grep gateway

    Примерный результат:

    backendtlspolicies.gateway.networking.k8s.io
    gatewayclasses.gateway.networking.k8s.io
    gateways.gateway.networking.k8s.io
    grpcroutes.gateway.networking.k8s.io
    httproutes.gateway.networking.k8s.io
    listenersets.gateway.networking.k8s.io
    referencegrants.gateway.networking.k8s.io
    tlsroutes.gateway.networking.k8s.io

2. Установите Istio

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

  2. В списке плагинов выберите Istio и нажмите Установить.

  3. (Опционально) Выберите версию плагина.

  4. Нажмите Установить.

    Дождитесь, когда состояние плагина изменится на «Установлен».

  5. Убедитесь, что все поды Istio в статусе Running:

    kubectl get pods -n istio-system

    Результат:

    NAME READY STATUS RESTARTS AGE
    istio-ingressgateway-58d8bc5c94-pz8gm 1/1 Running 0 25m
    istiod-5586bcd5b-288bp 1/1 Running 0 25m
  6. Проверьте, что Istio распознает Gateway API:

    kubectl logs deploy/istiod -n istio-system | grep "gateway"

    Вы должны увидеть сообщения о запуске контроллеров Gateway API.

3. Проверьте создание GatewayClass

GatewayClass определяет, какой контроллер реализует Gateway. Istio автоматически создает GatewayClass с названием istio.

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

kubectl get gatewayclass

Результат:

NAME CONTROLLER ACCEPTED AGE
istio istio.io/gateway-controller True 9m25s
istio-remote istio.io/unmanaged-gateway True 9m25s

4. Разверните приложение

  1. Создайте nginx-deployment.yaml и сохраните манифест:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
    name: nginx-deployment
    labels:
    app: nginx
    spec:
    replicas: 1
    selector:
    matchLabels:
    app: nginx
    template:
    metadata:
    labels:
    app: nginx
    spec:
    containers:
    - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80
  2. Создайте nginx-service.yaml и сохраните манифест:

    apiVersion: v1
    kind: Service
    metadata:
    name: nginx-service
    labels:
    app: nginx
    spec:
    type: ClusterIP
    ports:
    - port: 80
    targetPort: 80
    selector:
    app: nginx
  3. Примените манифесты:

    kubectl apply -f nginx-deployment.yaml
    kubectl apply -f nginx-service.yaml

    Результат:

    deployment.apps/nginx-deployment created
    service/nginx-service created

5. Создайте Gateway и HTTPRoute

Теперь создадим Gateway и HTTPRoute для доступа к приложению через внешний IP-адрес.

  1. Создайте cloudru-gateway.yaml и сохраните манифест:

    apiVersion: gateway.networking.k8s.io/v1
    kind: Gateway
    metadata:
    name: cloudru-gateway
    spec:
    gatewayClassName: istio
    listeners:
    - name: http
    protocol: HTTP
    port: 80
    allowedRoutes:
    namespaces:
    from: All
  2. Создайте cloudru-gateway-http.yaml и сохраните манифест:

    apiVersion: gateway.networking.k8s.io/v1
    kind: HTTPRoute
    metadata:
    name: cloudru-gateway-http
    spec:
    parentRefs:
    - name: cloudru-gateway
    hostnames:
    - "console.example.ru"
    rules:
    - backendRefs:
    - name: nginx-service
    port: 80
    weight: 100
  3. Примените манифесты:

    kubectl apply -f cloudru-gateway.yaml
    kubectl apply -f cloudru-gateway-http.yaml

    Результат:

    gateway.gateway.networking.k8s.io/cloudru-gateway created
    httproute.gateway.networking.k8s.io/cloudru-gateway-http created

6. Проверьте работу приложения

  1. Получите внешний IP-адрес Gateway:

    kubectl get gateway -o wide

    Вы получите примерно такой вывод:

    NAME CLASS ADDRESS PROGRAMMED AGE
    cloudru-gateway istio <external-ip> True 13m

    Где <external-ip> — назначенный IP-адрес.

  2. Пропишите в hosts:

    <external-ip> console.example.ru
  3. Откройте браузер и в адресную строку введите: http://console.example.ru.

    В результате вы увидите стандартную страницу приветствия Nginx.

См.также

Kubernetes Gateway API