Развертывание приложения Bookinfo

Содержание

Обзор приложения Bookinfo

Для установки примерного приложения bookinfo требуется выполнить два основных шага: сначала развернуть само приложение, а затем настроить gateway, чтобы сделать его доступным извне кластера.

Приложение bookinfo служит инструментом для изучения возможностей service mesh. Оно позволяет легко проверить, что запросы из веб-браузера корректно маршрутизируются через mesh к приложению.

Приложение bookinfo отображает информацию о книге, подобно одной записи в каталоге интернет-магазина книг. Оно показывает страницу с описанием книги, её деталями (например, ISBN и количеством страниц) и отзывами клиентов.

При экспонировании через mesh поведение микросервисов приложения bookinfo регулируется конфигурацией mesh. Данные отзывов поступают из одного из трёх сервисов: reviews-v1, reviews-v2 или reviews-v3. Если вы развернете bookinfo без определения виртуального сервиса reviews, mesh по умолчанию будет использовать политику round-robin для маршрутизации запросов к этим сервисам.

Создавая виртуальный сервис reviews, вы можете задать собственные правила маршрутизации. Например, можно настроить mesh так, чтобы запросы от вошедших в систему пользователей направлялись к сервису reviews-v2, который отображает отзывы с чёрными звёздами. Для пользователей, не вошедших в систему, mesh может направлять запросы к reviews-v3, показывая отзывы с красными звёздами.

Дополнительную информацию можно найти в исходной документации Istio по приложению Bookinfo.

Развертывание приложения Bookinfo

Предварительные требования

  • Установлен Alauda Service Mesh v2 Operator.
  • Развернут Istio CNI.
  • Развернута управляющая плоскость Istio.

Процедура

  1. Создайте новое пространство имён с именем bookinfo командой:

    kubectl create namespace bookinfo
  2. Включите sidecar injection для пространства имён bookinfo. Если в вашей конфигурации используется стратегия обновления InPlace, выполните команду:

    kubectl label namespace bookinfo istio-injection=enabled
    NOTE

    Если вы используете стратегию обновления RevisionBased, выполните следующие команды:

    1. Чтобы узнать ваш <revision-name>, выполните:

      kubectl get istiorevisions.sailoperator.io

      Пример вывода:

      NAME      NAMESPACE      PROFILE   READY   STATUS    IN USE   VERSION   AGE
      default   istio-system             True    Healthy   True     v1.26.3   47h
    2. Пометьте пространство имён с помощью имени ревизии для включения sidecar injection:

      kubectl label namespace bookinfo istio.io/rev=default
  3. Опционально: Если вы уже настроили discoverySelectors, примените Istio discovery selector к пространству имён bookinfo командой:

    Пример метки discovery selector: istio-discovery=enabled

    kubectl label namespace bookinfo istio-discovery=enabled
  4. Разверните приложение bookinfo, применив его YAML-файл командой:

    kubectl -n bookinfo apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/platform/kube/bookinfo.yaml

Проверка

  1. Чтобы убедиться, что сервис bookinfo доступен, выполните:

    kubectl get services -n bookinfo

    Пример вывода

    NAME          TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)    AGE
    details       ClusterIP   10.4.153.200   <none>        9080/TCP   4m44s
    productpage   ClusterIP   10.4.132.101   <none>        9080/TCP   4m43s
    ratings       ClusterIP   10.4.76.104    <none>        9080/TCP   4m44s
    reviews       ClusterIP   10.4.48.38     <none>        9080/TCP   4m44s
  2. Чтобы проверить доступность подов bookinfo, выполните:

    kubectl get pods -n bookinfo

    Пример вывода

    NAME                              READY   STATUS    RESTARTS   AGE
    details-v1-c66556f6d-bbqjx        2/2     Running   0          5m56s
    productpage-v1-5f568ff46d-r886k   2/2     Running   0          5m56s
    ratings-v1-74bcfcb96d-7bm8s       2/2     Running   0          5m56s
    reviews-v1-549bfb5f44-xwh4z       2/2     Running   0          5m56s
    reviews-v2-6486bc9868-snch4       2/2     Running   0          5m56s
    reviews-v3-6c66dc6cdd-87jgd       2/2     Running   0          5m56s

    Успешная инъекция proxy sidecar подтверждается значением 2/2 в столбце Ready. Убедитесь, что в столбце Status для каждого пода отображается Running.

  3. Подтвердите, что приложение bookinfo работает, отправив запрос к его product page. Выполните команду:

    kubectl exec "$(kubectl get pod -l app=ratings -n bookinfo -o jsonpath='{.items[0].metadata.name}')" -c ratings -n bookinfo -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"

    Пример вывода

    <title>Simple Bookstore App</title>

Доступ к приложению Bookinfo через Gateway

Gateway не развертываются оператором Alauda Service Mesh v2, так как они не считаются частью управляющей плоскости. В целях безопасности рекомендуется развертывать Ingress и Egress gateway в отдельном пространстве имён от управляющей плоскости.

Существует два способа развертывания gateway: с использованием Gateway API или с помощью техники инъекции gateway.

Доступ к приложению Bookinfo с помощью инъекции Istio Gateway

Техника инъекции gateway использует тот же механизм, что и инъекция sidecar Istio. Она создаёт gateway из ресурса Deployment, связанного с ресурсом Service. Этот Service затем можно экспонировать за пределы кластера Alauda Container Platform.

Предварительные требования

  • Установлен Alauda Service Mesh v2 Operator.
  • Развернута управляющая плоскость Istio.

Процедура

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

    kubectl -n bookinfo apply -f https://raw.githubusercontent.com/alauda-mesh/sail-operator/refs/heads/main/chart/samples/ingress-gateway.yaml
  2. Настройте приложение bookinfo для использования созданного gateway, выполнив:

    kubectl -n bookinfo apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/networking/bookinfo-gateway.yaml
    NOTE

    В этом примере используется файл конфигурации gateway для настройки инъекции gateway для приложения bookinfo. Файл должен быть применён в том же пространстве имён, где установлено приложение.

  3. Опционально: Измените YAML-файл для автоматического масштабирования подов на основе входящего трафика.

    Пример конфигурации

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      labels:
        istio: ingressgateway
        release: istio
      name: ingressgatewayhpa
      namespace: bookinfo
    spec:
      minReplicas: 2
      maxReplicas: 5
      metrics:
        - resource:
            name: cpu
            target:
              averageUtilization: 80
              type: Utilization
          type: Resource
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: istio-ingressgateway
    1. В этом примере максимальное количество реплик установлено в 5, минимальное — в 2. Новая реплика создаётся при достижении загрузки CPU 80%.
  4. Опционально: Определите минимальное количество подов, которые должны работать на узле.

    Пример конфигурации

    apiVersion: policy/v1
    kind: PodDisruptionBudget
    metadata:
      labels:
        istio: ingressgateway
        release: istio
      name: ingressgatewaypdb
      namespace: bookinfo
    spec:
      minAvailable: 1
      selector:
        matchLabels:
          istio: ingressgateway
    1. Эта конфигурация гарантирует, что как минимум одна реплика будет работать, если под перезапускается на другом узле.

Проверка

Вы подключитесь к сервису Bookinfo productpage через только что созданный gateway. Для доступа к gateway используйте команду kubectl port-forward:

kubectl -n bookinfo port-forward svc/istio-ingressgateway 9080:80
  • Если вы запускаете команду локально на своей рабочей станции, откройте в браузере http://localhost:9080/productpage.
  • Если команда была выполнена на удалённом хосте с параметром --address 0.0.0.0, замените localhost на IP-адрес или имя удалённого хоста (например, http://<REMOTE_HOST_IP>:9080/productpage).

При обновлении страницы несколько раз вы увидите разные версии отзывов на productpage, отображаемые поочерёдно (красные звёзды, чёрные звёзды, без звёзд), так как мы ещё не использовали Istio для управления маршрутизацией версий.

Доступ к приложению Bookinfo с помощью Gateway API

С помощью Kubernetes Gateway API gateway разворачивается через создание ресурса Gateway.

Предварительные требования

  • Установлен Alauda Service Mesh v2 Operator.
  • Развернута управляющая плоскость Istio.
  • Ваш Kubernetes кластер поддерживает внешние балансировщики нагрузки (то есть сервисы типа LoadBalancer).

Процедура

  1. Создайте и настройте gateway с помощью ресурсов Gateway и HTTPRoute, выполнив команду:

    kubectl -n bookinfo apply -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/bookinfo/gateway-api/bookinfo-gateway.yaml 
    NOTE

    В этом примере используется файл конфигурации gateway для настройки gateway приложения bookinfo через Gateway API. Файл должен быть применён в пространстве имён приложения.

  2. Убедитесь, что сервис Gateway API готов и имеет адрес, выполнив:

    kubectl wait --for=condition=programmed gtw bookinfo-gateway -n bookinfo
  3. Получите хост с помощью команды:

    export INGRESS_HOST=$(kubectl get gtw bookinfo-gateway -n bookinfo -o jsonpath='{.status.addresses[0].value}')
  4. Получите порт с помощью команды:

    export INGRESS_PORT=$(kubectl get gtw bookinfo-gateway -n bookinfo -o jsonpath='{.spec.listeners[?(@.name=="http")].port}')
  5. Получите URL gateway с помощью команды:

    export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT
  6. Получите полный URL для страницы продукта командой:

    echo "http://${GATEWAY_URL}/productpage"

Проверка

  • Убедитесь, что productpage доступна с помощью команды curl:

    curl -s "http://${GATEWAY_URL}/productpage" | grep -o "<title>.*</title>"

    Пример вывода

    <title>Simple Bookstore App</title>
  • Убедитесь, что productpage доступна в веб-браузере.

    Откройте в браузере http://${GATEWAY_URL}/productpage, чтобы просмотреть веб-страницу Bookinfo.

    При обновлении страницы несколько раз вы увидите разные версии отзывов на productpage, отображаемые поочерёдно (красные звёзды, чёрные звёзды, без звёзд), так как мы ещё не использовали Istio для управления маршрутизацией версий.