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

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

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

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

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

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

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

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

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

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

    • Установлен Alauda Service Mesh v2 Operator.
    • Развернут Istio CNI.
    • Развернута control plane Istio.

    Процедура

    1. Используйте следующую команду, чтобы создать новый namespace с именем bookinfo:

      kubectl create namespace bookinfo
    2. Включите внедрение sidecar для namespace 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.6   47h
      2. Пометьте namespace с использованием имени revision, чтобы включить внедрение sidecar:

        kubectl label namespace bookinfo istio.io/rev=default
    3. Необязательно: если вы уже настроили discoverySelectors, используйте следующую команду, чтобы применить discovery selector Istio к namespace 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/alauda-mesh/istio/refs/heads/istio-1.28/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. Чтобы проверить, что pod 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 определяется по столбцу Ready, в котором должно отображаться значение 2/2. Убедитесь, что в столбце Status для каждого pod указано 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 Operator, поскольку они не считаются частью control plane. Из соображений безопасности рекомендуется развертывать gateways Ingress и Egress в отдельном namespace, отличном от control plane.

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

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

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

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

    • Установлен Alauda Service Mesh v2 Operator.
    • Развернута control plane Istio.

    Процедура

    1. Выполните следующую команду, чтобы создать istio-ingressgateway deployment и service:

      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/alauda-mesh/istio/refs/heads/istio-1.28/samples/bookinfo/networking/bookinfo-gateway.yaml
      NOTE

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

    3. Необязательно: измените YAML-файл для автоматического масштабирования pod на основе ingress-трафика.

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

      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. Необязательно: задайте минимальное количество pod, которые должны быть запущены на узле.

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

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

    Проверка

    Вы подключитесь к сервису Bookinfo productpage через только что предоставленный gateway. Чтобы получить доступ к gateway, необходимо использовать команду 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 в стиле round robin (красные звезды, черные звезды, без звезд), поскольку мы еще не использовали Istio для управления маршрутизацией версий.

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

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

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

    • Установлен Alauda Service Mesh v2 Operator.
    • Развернута control plane Istio.
    • Ваш кластер Kubernetes поддерживает внешние load balancer’ы (то есть Services типа LoadBalancer)

    Процедура

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

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

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

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

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

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

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

      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 доступна в web browser.

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

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