• Русский
  • Функции уровня 7 в ambient режиме

    Ambient режим обеспечивает стабильные возможности L7 через ресурс Gateway API HTTPRoute и ресурс Istio AuthorizationPolicy.

    Ресурс AuthorizationPolicy работает как в sidecar, так и в ambient режиме. В ambient режиме политики авторизации могут быть нацелены на применение через ZTunnel или прикреплены к waypoint для применения на waypoint. Чтобы прикрепить политику к waypoint, включите targetRef, который ссылается либо на сам waypoint, либо на Service, настроенный на использование этого waypoint.

    Вы можете прикреплять политики L4 или L7 к прокси waypoint для применения на основе идентичности. Как только waypoint становится частью пути трафика, конечный ZTunnel идентифицирует трафик по идентичности waypoint.

    Политики Istio peer authentication, которые настраивают режимы mTLS, поддерживаются ZTunnel. В ambient режиме политики, устанавливающие режим в DISABLE, игнорируются, так как ZTunnel и HBONE всегда обеспечивают mTLS. Подробнее см. в разделе Peer authentication (документация Istio).

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

    • Активная сессия ACP CLI (kubectl) от имени администратора кластера с ролью cluster-admin.
    • Istio развернут в ambient режиме.
    • Пример приложения Bookinfo развернут (для следующего примера).
    • Прокси waypoint развернут (для следующего примера).

    Маршрутизация трафика с использованием прокси waypoint

    С развернутым прокси waypoint вы можете разделять трафик между разными версиями сервиса Bookinfo reviews для тестирования функций или A/B тестирования.

    Процедура

    1. Создайте конфигурацию маршрутизации трафика. Сохраните следующий файл как traffic-route.yaml:

      apiVersion: gateway.networking.k8s.io/v1
      kind: HTTPRoute
      metadata:
        name: reviews
        namespace: bookinfo
      spec:
        parentRefs:
          - group: ""
            kind: Service
            name: reviews
            port: 9080
        rules:
          - backendRefs:
              - name: reviews-v1
                port: 9080
                weight: 80
              - name: reviews-v2
                port: 9080
                weight: 20
    2. Примените конфигурацию маршрутизации трафика:

      kubectl apply -f traffic-route.yaml

    Проверка

    Доступ к сервису productpage из пода ratings:

    kubectl exec "$(kubectl get pod -l app=ratings -n bookinfo -o jsonpath='{.items[0].metadata.name}')" \
      -c ratings -n bookinfo \
      -- bash -lc '\
         for i in {0..19}; do \
           curl -sS productpage:9080/productpage | grep -om1 "reviews-v[12]"; \
         done'

    Большинство ответов (80%) будут содержать вывод reviews-v1, а меньшая часть (20%) — reviews-v2.

    Пример вывода
    reviews-v1
    reviews-v2
    reviews-v1
    reviews-v1
    reviews-v1
    reviews-v2
    reviews-v1
    reviews-v1
    reviews-v1
    reviews-v1
    reviews-v1
    reviews-v1
    reviews-v1
    reviews-v1
    reviews-v1
    reviews-v1
    reviews-v1
    reviews-v2
    reviews-v1
    reviews-v1

    Очистка конфигурации маршрутизации

    kubectl delete -n bookinfo httproute reviews

    Добавление политики авторизации

    Используйте политику авторизации L7, чтобы явно разрешить сервису curl отправлять GET-запросы к сервису productpage, блокируя все остальные операции.

    Процедура

    1. Создайте политику авторизации. Сохраните следующий файл как authorization-policy.yaml:

      apiVersion: security.istio.io/v1
      kind: AuthorizationPolicy
      metadata:
        name: productpage-waypoint
        namespace: bookinfo
      spec:
        targetRefs:
          - kind: Service
            group: ""
            name: productpage
        action: ALLOW
        rules:
          - from:
              - source:
                  principals:
                    - cluster.local/ns/curl/sa/curl
            to:
              - operation:
                  methods: ["GET"]
      1. Поле targetRefs указывает сервис, на который направлена политика авторизации прокси waypoint.
    2. Примените политику авторизации:

      kubectl apply -f authorization-policy.yaml

    Проверка

    1. Создайте namespace для клиента curl:

      kubectl create namespace curl
    2. Разверните клиента curl:

      kubectl apply -n curl -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/curl/curl.yaml
    3. Добавьте метку istio-discovery=enabled в namespace curl:

      kubectl label namespace curl istio-discovery=enabled
    4. Включите ambient режим для namespace curl:

      kubectl label namespace curl istio.io/dataplane-mode=ambient
    5. Проверьте, что GET-запрос к сервису productpage проходит успешно с ответом HTTP 200:

      kubectl -n curl exec deploy/curl -- sh -c '\
        curl -s -o /dev/null -w "HTTP %{http_code}\n" \
          -X GET \
          http://productpage.bookinfo.svc.cluster.local:9080/productpage'

      Ожидаемый вывод

      HTTP 200
    6. Проверьте, что POST-запрос к тому же сервису отклоняется с ответом HTTP 403:

      kubectl -n curl exec deploy/curl -- sh -c '\
        curl -s -o /dev/null -w "HTTP %{http_code}\n" \
          -X POST \
          http://productpage.bookinfo.svc.cluster.local:9080/productpage'

      Ожидаемый вывод

      HTTP 403
    7. Проверьте, что GET-запрос от другого сервиса (например, пода ratings в namespace bookinfo) также отклоняется с сообщением RBAC: access denied:

      kubectl exec "$(kubectl get pod -l app=ratings -n bookinfo \
        -o jsonpath='{.items[0].metadata.name}')" \
        -c ratings -n bookinfo \
        -- curl -X GET -sS productpage:9080/productpage

      Ожидаемый вывод

      RBAC: access denied

    Очистка ресурсов проверки

    # Удалить политику авторизации
    kubectl delete -n bookinfo authorizationpolicy productpage-waypoint
    # Удалить метку ambient режима из namespace curl
    kubectl label namespace curl istio.io/dataplane-mode-
    # Удалить развертывание Curl и namespace
    kubectl delete -n curl -f https://raw.githubusercontent.com/istio/istio/refs/heads/master/samples/curl/curl.yaml
    kubectl delete namespace curl

    Дополнительные ресурсы