• Русский
  • Развертывание приложения Bookinfo

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

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

    Приложение bookinfo служит инструментом для изучения возможностей сервисной сетки. Оно позволяет легко проверить, что запросы из веб-браузера корректно маршрутизируются через 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 для пространства имён 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.28.3   47h
      2. Пометьте пространство имён с помощью имени ревизии для включения инъекции sidecar:

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

      Пример метки селектора обнаружения: 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

      Успешная инъекция прокси sidecar подтверждается, когда в столбце Ready отображается 2/2. Убедитесь, что в столбце 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 через шлюз

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

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

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

    Метод инъекции шлюза использует тот же механизм, что и инъекция sidecar Istio. Он создаёт шлюз из ресурса 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 для использования созданного шлюза, выполнив команду:

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

      В этом примере используется файл конфигурации шлюза для настройки инъекции шлюза для приложения 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 через только что созданный шлюз. Для доступа к шлюзу используйте команду kubectl port-forward:

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

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

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

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

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

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

    Процедура

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

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

      В этом примере используется файл конфигурации шлюза для настройки шлюза для приложения 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}')
      echo "INGRESS_HOST=$INGRESS_HOST"
    4. Получите порт с помощью команды:

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

      INFO

      Если $INGRESS_HOST — это IPv6-адрес, заключите его в квадратные скобки при формировании URL. Например:

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

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

    Проверка

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

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

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

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

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

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