• Русский
  • Развертывание приложения 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 для управления маршрутизацией версий.