Разное

Http istio com: Сервис работы с текстами онлайн

05.05.1985

Содержание

распознавание изображений/фотографий онлайн бесплатно (OCR online)

Сервис поможет преобразовать онлайн картинки формата: jpg, jpeg, png, bmp, pbm в текст. Это упростит работу с текстом: позволит скопировать его в удобный файл любого формата, проверить орфографию или провести SEO анализ. Конвертация изображений доступна на 30+ языках (список внизу страницы), проверка орфографии доступна на большинстве из них

Как это работает?

OCR – это оптическое распознавание изображений, которое работает онлайн на tesseract.js. Технология идентифицирует и преобразует отсканированные печатные символы в электронный формат. Он легче распознается компьютером и другими программами. Грубо говоря, технология распознает текст, изучая его и переводя символы в код для последующей обработки данных. То есть физический документ становится машиночитаемым.

Программа OCR преобразует ваш документ в ч/б или двухцветную версию. Растровое изображение затем анализируется на наличие темных областей (текста) и светлых (фона). Далее темные области оцениваются как символы, которые следующим этапом распознаются технологией на предмет цифр или букв.

Для чего может использоваться программа?

Сервис полезен для тех, кому нужно перенести текст со сканера в электронный вид или

распознать текст на фото, и получить его в виде текстового документа. Технологию часто используют специалисты, работающие с большим количеством литературы и физических документов. Набрать такой текст вручную бывает невозможно.

Отсканированный текст пользователь может редактировать и форматировать в обычном редакторе. Это упрощает обработку больших объемов текста, существующих изначально вне электронного формата.

Какой текст распознается лучше всего?

Чтобы сервис распознал текст без ошибок, он должен соответствовать таким требованиям:

  • отсканированная копия или четкое фото текста на камеру телефона;
  • все символы ровные;
  • контраст между фоном и буквами;
  • текст хорошо читается;
  • фон текста однотонный.

Сервис не распознает рукописный текст, капчу, а также текст с неоднотонным или зашумленным фоном.

Как оптимизировать фото, скриншот, изображение для лучшего качества преобразования?

Руководствуйтесь предыдущим пунктом и постарайтесь сделать максимальный контраст между фоном и символами, при этом фон должен быть максимально однотонным.

Как пользоваться сервисом?

Для вас технология работает просто:

  1. Сфотографируйте телефоном/фотоаппаратом или отсканируйте текст, который надо распознать. Поддерживаются форматы: jpg, jpeg, png, bmp, pbm.
  2. Жмите кнопку «Загрузить файл».
  3. Выберите файл на своем компьютере.
  4. Подождите, пока ваш документ обработается – занимает не больше 1 минуты.
  5. Скопируйте текст, и сохраните результат в удобном для себя формате:
    • Чистый текст (txt)
    • Adobe Acrobat (pdf)
    • Microsoft Word (docx)
    • OpenOffice (odf)
    • и др.

Скачивание с сайта файлов в готовом/выбранном формате будет реализовано позже.

Вы можете распознавать бесплатно любое количество файлов. Регистрация или оплата не нужны.

Что можно делать с распознанным текстом?

Теперь у вас есть большой выбор манипуляций с готовым текстом:

  • копируйте;
  • проверяйте орфографию;
  • редактируйте;
  • делайте SEO-анализ текста, чтобы посчитать слова и символы;
  • сохраняйте в файл для дальнейшей работы с ним на своем устройстве.

Преимущества сервиса

  1. В несколько кликов вы получите текст с картинки, готовый для редактирования и обработки.
  2. Все строго конфиденциально и защищено сертификатом SSL+.
  3. Ваши файлы и распознанные тексты не хранятся в сервисе и никак не оцениваются.
  4. Максимум 1 минута на распознавание любого файла.
  5. Пользуйтесь сервисом без регистрации.
  6. Не требуется установка на компьютер, вся работа выполняется в любом браузере онлайн.

Перевод текста на другие языки

Если вам нужны переводы большого количества обработанных текстов пишите нам на почту([email protected]), мы добавим эту функцию.

Список языков для конвертации

Aфрикаанс, Азербайджанский, Албанский, Английский, Английский (Старый), Арабский, Баскский язык, Белорусский, Бенгальский, Болгарский, Венгерский, Вьетнамский, Галисийский, Голландский, Греческий, Датский, Древнегреческий, Иврит, Индонезийский, Интернет-мем, Исландский, Испанский, Итальянский, Итальянский (Старый), Каннада, Каталанский, Китайский, Корейский, Латышский, Литовский, Македонский, Малайский, Малаялам, Мальтийский, Математика, Немецкий, Норвежский, Польский, Португальский, Румынский, Русский, Сербский (латиница), Словацкий, Словенский, Старый испанский, Суахили, Тагальский, Тайский, Тамильский, Телугу, Традиционный китайский, Турецкий, Украинский, Финский, Франкский, Французский, Французский (Старый), Хинди, Хорватский, Чероки, Чешский, Шведский, Эсперанто, Эсперанто альтернативный, Эстонский, Японский

Назад к микросервисам вместе с Istio.

Часть 1 / Хабр

Прим. перев.: Service mesh’и определённо стали актуальным решением в современной инфраструктуре для приложений, следующих микросервисной архитектуре. Хотя Istio может быть на слуху у многих DevOps-инженеров, это довольно новый продукт, который, будучи комплексным в смысле предоставляемых возможностей, может потребовать значительного времени для знакомства. Немецкий инженер Rinor Maloku, отвечающий за облачные вычисления для крупных клиентов в телекоммуникационной компании Orange Networks, написал замечательный цикл материалов, что позволяют достаточно быстро и глубоко погрузиться в Istio. Начинает же он свой рассказ с того, что вообще умеет Istio и как на это можно быстро посмотреть собственными глазами.

Istio — Open Source-проект, разработанный при сотрудничестве команд из Google, IBM и Lyft. Он решает сложности, возникающие в приложениях, основанных на микросервисах, например, такие как:

  • Управление трафиком: таймауты, повторные попытки, балансировка нагрузки;
  • Безопасность: аутентификация и авторизация конечного пользователя;
  • Наблюдаемость: трассировка, мониторинг, логирование.

Все они могут быть решены на уровне приложения, однако после этого ваши сервисы перестанут быть «микро». Все дополнительные усилия по решению этих проблем — лишний расход ресурсов компании, которые могли бы использоваться непосредственно для бизнес-ценностей. Рассмотрим пример:

Менеджер проектов: Как долго добавлять возможность обратной связи?
Разработчик: Два спринта.

МП: Что?.. Это ведь всего лишь CRUD!
Р: Сделать CRUD — простая часть задачи, но нам ещё потребуется аутентифицировать и авторизовывать пользователей и сервисы. Поскольку сеть ненадёжна, понадобится реализовать повторные запросы, а также паттерн circuit breaker в клиентах. Ещё, чтобы убедиться, что вся система не упала, понадобятся таймауты и bulkheads (подробнее об обоих упомянутых паттернах см. дальше в статье — прим. перев.), а для того, чтобы обнаруживать проблемы, потребуется мониторинг, трассировка, […]

МП: Ох, давайте тогда просто вставим эту фичу в сервис Product.

Думаю, идея понятна: объём шагов и усилий, которые требуются для добавления одного сервиса, огромен. В этой статье мы рассмотрим, как Istio устраняет все упомянутые выше сложности (не являющиеся целевыми для бизнес-логики) из сервисов.

Примечание: Статья предполагает, что у вас есть практические знания по Kubernetes. В ином случае рекомендую прочитать моё введение в Kubernetes и только после этого продолжить чтение данного материала.

Идея Istio

В мире без Istio один сервис делает прямые запросы к другому, а в случае сбоя сервис должен сам обработать его: предпринять новую попытку, предусмотреть таймаут, открыть circuit breaker и т.п.


Сетевой трафик в Kubernetes

Istio же предлагает специализированное решение, полностью отделённое от сервисов и функционирующее путём вмешательства в сетевое взаимодействие. И таким образом оно реализует:

  • Отказоустойчивость: опираясь на код статуса в ответе, оно понимает, произошёл ли сбой в запросе, и выполняет его повторно.
  • Канареечные выкаты
    : перенаправляет на новую версию сервиса лишь фиксированное процентом число запросов.
  • Мониторинг и метрики: за какое время сервис ответил?
  • Трассировка и наблюдаемость: добавляет специальные заголовки в каждый запрос и выполняет их трассировку в кластере.
  • Безопасность: извлекает JWT-токен, аутентифицирует и авторизует пользователей.

Это лишь некоторые из возможностей (действительно лишь некоторые!), чтобы заинтриговать вас. А теперь давайте погрузимся в технические подробности!

Архитектура Istio

Istio перехватывает весь сетевой трафик и применяет к нему набор правил, вставляя в каждый pod умный прокси в виде sidecar-контейнера. Прокси, которые активируют все возможности, образуют собой

Data Plane, и они могут динамически настраиваться с помощью Control Plane.

Data Plane

Вставляемые в pod’ы прокси позволяют Istio с лёгкостью добиться соответствия нужным нам требованиям. Например, проверим функции повторных попыток и circuit breaker.


Как retries и circuit breaking реализованы в Envoy

Подытожим:

  1. Envoy (речь про прокси, находящийся в sidecar-контейнере, который распространяется и как отдельный продукт — прим. перев.)
    отправляет запрос первому экземпляру сервиса B и происходит сбой.
  2. Envoy Sidecar предпринимает повторную попытку (retry). (1)
  3. Запрос со сбоем возвращается вызвавшему его прокси.
  4. Так открывается Circuit Breaker и происходит вызов следующего сервиса для последующих запросов. (2)

Это означает, что вам не придётся использовать очередную библиотеку Retry, не придётся делать свою реализацию Circuit Breaking и Service Discovery на языке программирования X, Y или Z. Всё это и многое другое доступно из коробки в Istio и не требует никаких

изменений в коде.

Отлично! Теперь вы можете захотеть отправиться в вояж с Istio, но всё ещё есть какие-то сомнения, открытые вопросы. Если это универсальное решение на все случаи в жизни, то у вас возникает закономерное подозрение: ведь все такие решения в действительности оказываются не подходящими ни для какого случая.

И вот наконец вы спросите: «Оно настраивается?»

Теперь вы готовы к морскому путешествию — и давайте же познакомимся с Control Plane.

Control Plane

Он состоит из трёх компонентов: Pilot, Mixer и Citadel, — которые совместными усилиями настраивают Envoy’и для маршрутизации трафика, применяют политики и собирают телеметрические данные. Схематично всё это выглядит так:


Взаимодействие Control Plane с Data Plane

Envoy’и (т.е. data plane) сконфигурированы с помощью Kubernetes CRD (Custom Resource Definitions), определёнными Istio и специально предназначенными для этой цели. Для вас это означает, что они представляются очередным ресурсом в Kubernetes со знакомым синтаксисом. После создания этот ресурс будет подобран control plane’ом и применён к Envoy’ям.

Отношение сервисов к Istio

Мы описали отношение Istio к сервисам, но не обратное: как же сервисы относятся к Istio?

Честно говоря, о присутствии Istio сервисам известно так же хорошо, как рыбам — о воде, когда они спрашивают себя: «Что вообще такое вода?».


Иллюстрация Victoria Dimitrakopoulos: — Как вам вода? — Что вообще такое вода?

Таким образом, вы можете взять рабочий кластер и после деплоя компонентов Istio сервисы, находящиеся в нём, продолжат работать, а после устранения этих компонентов — снова всё будет хорошо. Понятное дело, что при этом вы потеряете возможности, предоставляемые Istio.

Достаточно теории — давайте перенесём это знание в практику!

Istio на практике

Istio требует кластера Kubernetes, в котором как минимум доступны 4 vCPU и 8 Гб RAM. Чтобы быстро поднять кластер и следовать инструкциям из статьи, рекомендую воспользоваться Google Cloud Platform, которая предлагает новым пользователям бесплатные $300.

После создания кластера и настройки доступа к Kubernetes через консольную утилиту можно установить Istio через пакетный менеджер Helm.

Установка Helm

Установите клиент Helm на своём компьютере, как рассказывают в официальной документации. Его мы будем использовать для генерации шаблонов для установки Istio в следующем разделе.

Установка Istio

Скачайте ресурсы Istio из последнего релиза(оригинальная авторская ссылка на версию 1.0.5 изменена на актуальную, т.е. 1.0.6 — прим. перев.), извлеките содержимое в одну директорию, которую я буду в дальнейшем называть [istio-resources].

Для простоты идентификации ресурсов Istio создайте в кластере K8s пространство имён istio-system:

$ kubectl create namespace istio-system

Завершите установку, перейдя в каталог [istio-resources] и выполнив команду:

$ helm template install/kubernetes/helm/istio \
  --set global. mtls.enabled=false \
  --set tracing.enabled=true \
  --set kiali.enabled=true \
  --set grafana.enabled=true \
  --namespace istio-system > istio.yaml

Эта команда выведет ключевые компоненты Istio в файл istio.yaml. Мы изменили стандартный шаблон под себя, указав следующие параметры:

  • global.mtls.enabled установлено в false (т.е. mTLS-аутентификация отключена — прим перев.), чтобы упростить наш процесс знакомства;
  • tracing.enabled включает трассировку запросов с помощью Jaeger;
  • kiali.enabled устанавливает Kiali в кластер для визуализации сервисов и трафика;
  • grafana.enabled устанавливает Grafana для визуализации собранных метрик.

Применим сгенерированные ресурсы командой:

$ kubectl apply -f istio.yaml

Установка Istio в кластер завершена! Дождитесь, пока все pod’ы в пространстве имён istio-system окажутся в состоянии Running или Completed, выполнив команду ниже:

$ kubectl get pods -n istio-system

Теперь мы готовы продолжить в следующем разделе, где поднимем и запустим приложение.

Архитектура приложения Sentiment Analysis

Воспользуемся примером микросервисного приложения Sentiment Analysis, использованного в уже упомянутой статье-введении в Kubernetes. Оно достаточно сложное, чтобы показать возможности Istio на практике.

Приложение состоит из четырёх микросервисов:

  1. Сервис SA-Frontend, который обслуживает фронтенд приложения на Reactjs;
  2. Сервис SA-WebApp, который обслуживает запросы Sentiment Analysis;
  3. Сервис SA-Logic, который выполняет сам сентимент-анализ;
  4. Сервис SA-Feedback, который получает от пользователей обратную связь о точности проведённого анализа.

На этой схеме помимо сервисов мы видим также Ingress Controller, который в Kubernetes маршрутизирует входящие запросы на соответствующие сервисы. В Istio используется схожая концепция в рамках Ingress Gateway, подробности о котором последуют.

Запуск приложения с прокси от Istio

Для дальнейших операций, упоминаемых в статье, склонируйте себе репозиторий istio-mastery. В нём содержатся приложение и манифесты для Kubernetes и Istio.

Вставка sidecar’ов

Вставка может быть произведена автоматически или вручную. Для автоматической вставки sidecar-контейнеров потребуется выставить пространству имён лейбл istio-injection=enabled, что делается следующей командой:

$ kubectl label namespace default istio-injection=enabled
namespace/default labeled

Теперь каждый pod, который будет разворачиваться в пространстве имён по умолчанию (default) получит свой sidecar-контейнер. Чтобы убедиться в этом, давайте задеплоим тестовое приложение, перейдя в корневой каталог репозитория [istio-mastery] и выполнив следующую команду:

$ kubectl apply -f resource-manifests/kube
persistentvolumeclaim/sqlite-pvc created
deployment.extensions/sa-feedback created
service/sa-feedback created
deployment.extensions/sa-frontend created
service/sa-frontend created
deployment. extensions/sa-logic created
service/sa-logic created
deployment.extensions/sa-web-app created
service/sa-web-app created

Развернув сервисы, проверим, что у pod’ов по два контейнера (с самим сервисом и его sidecar’ом), выполнив команду kubectl get pods и убедившись, что под столбцом READY указано значение 2/2, символизирующее, что оба контейнера запущены:

$ kubectl get pods
NAME                           READY     STATUS    RESTARTS   AGE
sa-feedback-55f5dc4d9c-c9wfv   2/2       Running   0          12m
sa-frontend-558f8986-hhkj9     2/2       Running   0          12m
sa-logic-568498cb4d-2sjwj      2/2       Running   0          12m
sa-logic-568498cb4d-p4f8c      2/2       Running   0          12m
sa-web-app-599cf47c7c-s7cvd    2/2       Running   0          12m

Визуально это представляется так:


Прокси Envoy в одном из pod’ов

Теперь, когда приложение поднято и функционирует, нам потребуется разрешить входящему трафику приходить в приложение.

Ingress Gateway

Лучшая практика добиться этого (разрешить трафик в кластере) — через Ingress Gateway в Istio, что располагается у «границы» кластера и позволяет включать для входящего трафика такие функции Istio, как маршрутизация, балансировка нагрузки, безопасность и мониторинг.

Компонент Ingress Gateway и сервис, который пробрасывает его вовне, были установлены в кластер во время инсталляции Istio. Чтобы узнать внешний IP-адрес сервиса, выполните:

$ kubectl get svc -n istio-system -l istio=ingressgateway
NAME                   TYPE           CLUSTER-IP     EXTERNAL-IP
istio-ingressgateway   LoadBalancer   10.0.132.127   13.93.30.120

Мы будем обращаться к приложению по этому IP и дальше (я буду ссылаться на него как EXTERNAL-IP), поэтому для удобства запишем значение в переменную:

$ EXTERNAL_IP=$(kubectl get svc -n istio-system \
  -l app=istio-ingressgateway \
  -o jsonpath='{. items[0].status.loadBalancer.ingress[0].ip}')

Если попробуете сейчас зайти на этот IP через браузер, то получите ошибку Service Unavailable, т.к. по умолчанию Istio блокирует весь входящий трафик, пока не определён Gateway.

Ресурс Gateway

Gateway — это CRD (Custom Resource Definition) в Kubernetes, определяемый после установки Istio в кластере и активирующий возможность указывать порты, протокол и хосты, для которых мы хотим разрешить входящий трафик.

В нашем случае мы хотим разрешить HTTP-трафик на 80-й порт для всех хостов. Задача реализуется следующим определением (http-gateway.yaml):

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: http-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
- "*"

Такая конфигурация не нуждается в объяснениях за исключением селектора istio: ingressgateway. С помощью этого селектора мы можем указать, к какому Ingress Gateway применить конфигурацию. В нашем случае таковым является контроллер Ingress Gateway, что был по умолчанию установлен в Istio.

Конфигурация применяется вызовом следующей команды:

$ kubectl apply -f resource-manifests/istio/http-gateway.yaml gateway.networking.istio.io/http-gateway created

Теперь шлюз разрешает доступ к порту 80, но не имеет представления о том, куда маршрутизировать запросы. Для этого понадобятся Virtual Services.

Ресурс VirtualService

VirtualService указывает Ingress Gateway’ю, как маршрутизировать запросы, которые разрешены внутри кластера.

Запросы к нашему приложению, приходящие через http-gateway, должны быть отправлены в сервисы sa-frontend, sa-web-app и sa-feedback:


Маршруты, которые необходимо настроить с VirtualServices

Рассмотрим запросы, которые должны направляться на SA-Frontend:

  • Точное совпадение по пути / должно отправляться в SA-Frontend для получения index. .*\.(ico|png|jpg)$’ route: — destination: host: sa-frontend # 2 port: number: 80

    Важные моменты:

    1. Этот VirtualService относится к запросам, приходящим через http-gateway;
    2. В destination определяется сервис, куда отправляются запросы.

    Примечание: Конфигурация выше хранится в файле sa-virtualservice-external.yaml, который также содержит настройки для маршрутизации в SA-WebApp и SA-Feedback, но был сокращён здесь в статье для лаконичности.

    Применим VirtualService вызовом:

    $ kubectl apply -f resource-manifests/istio/sa-virtualservice-external.yaml
    virtualservice.networking.istio.io/sa-external-services created

    Примечание: Когда мы применяем ресурсы Istio, Kubernetes API Server создаёт событие, которое получает Istio Control Plane, и уже после этого новая конфигурация применяется к прокси-серверам Envoy каждого pod’а. А контроллер Ingress Gateway представляется очередным Envoy, сконфигурированным в Control Plane. Всё это на схеме выглядит так:


    Конфигурация Istio-IngressGateway для маршрутизации запросов

    Приложение Sentiment Analysis стало доступным по http://{EXTERNAL-IP}/. Не переживайте, если вы получаете статус Not Found: иногда требуется чуть больше времени для того, чтобы конфигурация вступила в силу и кэши Envoy обновились.

    Перед тем, как продолжить, поработайте немного с приложением, чтобы сгенерировать трафик (его наличие необходимо для наглядности в последующих действиях — прим. перев.).

    Kiali : наблюдаемость

    Чтобы попасть в административный интерфейс Kiali, выполните следующую команду:

    $ kubectl port-forward \
        $(kubectl get pod -n istio-system -l app=kiali \
        -o jsonpath='{.items[0].metadata.name}') \
        -n istio-system 20001

    … и откройте http://localhost:20001/, залогинившись под admin/admin. Здесь вы найдете множество полезных возможностей, например, для проверки конфигурации компонентов Istio, визуализации сервисов по информации, собранной при перехвате сетевых запросов, получения ответов на вопросы «Кто к кому обращается?», «У какой версии сервиса возникают сбои?» и т.п. В общем, изучите возможности Kiali перед тем, как двигаться дальше — к визуализации метрик с Grafana.

    Grafana: визуализация метрик

    Собранные в Istio метрики попадают в Prometheus и визуализируются с Grafana. Чтобы попасть в административный интерфейс Grafana, выполните команду ниже, после чего откройте http://localhost:3000/:

    $ kubectl -n istio-system port-forward \
        $(kubectl -n istio-system get pod -l app=grafana \
        -o jsonpath={.items[0].metadata.name}) 3000

    Кликнув на меню Home слева сверху и выбрав Istio Service Dashboard в левом верхнем углу, начните с сервиса sa-web-app, чтобы посмотреть на собранные метрики:

    Здесь нас ждёт пустое и совершенно скучное представление — руководство никогда такое не одобрит. Давайте же создадим небольшую нагрузку следующей командой:

    $ while true; do \
        curl -i http://$EXTERNAL_IP/sentiment \
        -H "Content-type: application/json" \
        -d '{"sentence": "I love yogobella"}'; \
        sleep .8; done

    Вот теперь у нас гораздо более симпатичные графики, а в дополнение к ним — замечательные инструменты Prometheus для мониторинга и Grafana для визуализации метрик, что позволят нам узнать о производительности, состоянии здоровья, улучшениях/деградации в работе сервисов на протяжении времени.

    Наконец, посмотрим на трассировку запросов в сервисах.

    Jaeger : трассировка

    Трассировка нам потребуется, потому что чем больше у нас сервисов, тем сложнее добраться до причины сбоя. Посмотрим на простой случай из картинки ниже:


    Типовой пример случайного неудачного запроса

    Запрос приходит, падает — в чём же причина? Первый сервис? Или второй? Исключения есть в обоих — давайте посмотрим на логи каждого. Как часто вы ловили себя за таким занятием? Наша работа больше похожа на детективов программного обеспечения, а не разработчиков…

    Это широко распространённая проблема в микросервисах и решается она распределёнными системами трассировки, в которых сервисы передают друг другу уникальный заголовок, после чего эта информация перенаправляется в систему трассировки, где она сопоставляется с данными запроса. Вот иллюстрация:


    Для идентификации запроса используется TraceId

    В Istio используется Jaeger Tracer, который реализует независимый от вендоров фреймворк OpenTracing API. Получить доступ к пользовательского интерфейсу Jaeger можно следующей командой:

    $ kubectl port-forward -n istio-system \
        $(kubectl get pod -n istio-system -l app=jaeger \
        -o jsonpath='{.items[0].metadata.name}') 16686

    Теперь зайдите на http://localhost:16686/ и выберите сервис sa-web-app. Если сервис не показан в выпадающем меню — проявите/сгенерируйте активность на странице и обновите интерфейс. После этого нажмите на кнопку Find Traces, которая покажет самые последние трейсы — выберите любой — покажется детализированная информация по всем трейсам:

    Этот трейс показывает:

    1. Запрос приходит в istio-ingressgateway (это первое взаимодействие с одним из сервисов, и для запроса генерируется Trace ID), после чего шлюз направляет запрос в сервис sa-web-app.
    2. В сервисе sa-web-app запрос подхватывается Envoy sidecar’ом, создаётся «ребёнок» в span’е (поэтому мы видим его в трейсах) и перенаправляется в контейнер sa-web-app. (Span — логическая единица работы в Jaeger, имеющая название, время начало операции и её продолжительность. Span’ы могут быть вложенными и упорядоченными. Ориентированный ациклический граф из span’ов образует trace. — прим. перев.)
    3. Здесь запрос обрабатывается методом sentimentAnalysis. Эти трейсы уже сгенерированы приложением, т.е. для них потребовались изменения в коде.
    4. С этого момента инициируется POST-запрос в sa-logic. Trace ID должен быть проброшен из sa-web-app.

    Примечание: На 4 шаге приложение должно увидеть заголовки, сгенерированные Istio, и передать их в последующие запросы, как показано на изображении ниже:


    (A) За проброс заголовков отвечает Istio; (B) За заголовки отвечают сервисы

    Istio делает основную работу, т.к. генерирует заголовки для входящих запросов, создаёт новые span’ы в каждом sidecare’е и пробрасывает их. Однако без работы с заголовками внутри сервисов полный путь трассировки запроса будет утерян.

    Необходимо учитывать (пробрасывать) следующие заголовки:

    x-request-id
    x-b3-traceid
    x-b3-spanid
    x-b3-parentspanid
    x-b3-sampled
    x-b3-flags
    x-ot-span-context

    Это несложная задача, однако для упрощения её реализации уже существует множество библиотек — например, в сервисе sa-web-app клиент RestTemplate пробрасывает эти заголовки, если просто добавить библиотеки Jaeger и OpenTracing в его зависимости.

    Заметьте, что приложение Sentiment Analysis демонстрирует реализации на Flask, Spring и ASP.NET Core.

    Теперь, когда стало ясно, что мы получаем из коробки (или почти «из коробки»), рассмотрим вопросы тонко настраиваемой маршрутизации, управления сетевым трафиком, безопасности и т.п.!

    Прим. перев.: об этом читайте в следующей части материалов по Istio от Rinor Maloku, переводы которых последуют в нашем блоге в ближайшее время. UPDATE (14 марта): Вторая часть уже опубликована.

    P.S. от переводчика

    Читайте также в нашем блоге:

    • «Назад к микросервисам вместе с Istio»: часть 2 (маршрутизация, управление трафиком), часть 3 (аутентификация и авторизация);
    • «Conduit — легковесный service mesh для Kubernetes»;
    • «Что такое service mesh и почему он мне нужен [для облачного приложения с микросервисами]?»;
    • «Иллюстрированное руководство по устройству сети в Kubernetes. Части 1 и 2»;
    • «Как этот sidecar-контейнер оказался здесь [в Kubernetes]?».

    обзор и запуск service mesh в Kubernetes

    Istio- одна из реализацией концепии Service Mesh, позволяющая реализовать Service Discovery, Load Balancing, контроль над трафиком, canary rollouts и blue-green deployments, мониторить трафик между приложениями.

    Мы будем использовать Istio в AWS Elastic Kubernetes Service для мониторинга трафика, в роли API gateway, разграничения трафика и, возможно, для реализации различных deployment strategies.

    В этом посте рассмотрим что такое Service mesh вообще, общую архитектуру и компоненты Istio, его установку и настройку тестового приложения.

    Перед тем, как рассматривать Istio – давайте разберёмся, что такое Service Mesh.

    Содержание

    По сути, это менеджер прокси-сервисов, таких как NGINX, HAProxy или Envoy, система, работающая на Layer 7 модели OSI и позволяющая динамически управлять трафиком и настраивать коммуникацию между приложениями.

    Service mesh занимается обнаружением новых сервисов/приложений, балансировкой нагрузки, аутентификацией и шифрованием трафика.

    Для контроля трафика в service mesh для каждого приложения, или в случае с Kubernetes – для каждого пода, запускается прокси-сервис называемый sidecar, и эти sidecar-сервисы проксируют и управляют трафиком.

    Вместе эти sidecar-контейнеры представляют собой Data Plane.

    Для их конфигурирования и управления существует другая группа процессов или сервисов, называемых Control Plane. Они занимаются обнаружением новых приложений, обеспечивают управление ключами шифрования, сбором метрик и т.д.

    Схематично сервис меш можно отобразить так:

    Среди Service mesh решений можно выделить:

    • AWS App Mesh
    • Hashicop Consul
    • Linkerd
    • Apache ServiceComb
    • Traefik Mesh
    • Istio

    Почитать по теме:

    • Что такое Service Mesh?
    • Service Mesh: что нужно знать каждому Software Engineer о самой хайповой технологии
    • Что такое service mesh и почему он мне нужен [для облачного приложения с микросервисами]?
    • Service mesh — это всё ещё сложно

    Итак, Istio как service mesh состоит из двух основных частей – Data plane и Control plane:

    • Data plane (“уровень данных”): состоит из набора прокси-сервисов, sidecar-контейнеров в каждом поде, для которых использует расширенную версию прокси-сервера Envoy. Эти сайдакры связывают и контролируют трафик между приложениями, собирают и отправляют метрики
    • Control plane (“уровень управления”): управляет и настраивает сайдкары, управляет метриками, TLS-сертификатами

    В целом схема Istio выглядит так:

    Или другая схема:

    Control Plane

    Istio включает в себя четыре основных компонента:

    • Pilot: центральный контроллер, отвечающий за коммуникацию с сайдкарами используя Envoy API. Он считывает правила, описанные в манифестах istio, и отправляет их в Envoy для настройки прокси-сервисов. Отвечает за service discovery, управление трафиком, роутинг, устойчивостью сети с помощью таймаутов и circuit breaking.
    • Citadel: Identity and Access management – шифрование трафика, аутентификация сервисов и пользователей, управление ключами шифрования. См. Istio Security.
    • Galley: управление конфигурацией – валдиация, обработка новых настроек, отправка их остальным компонентам системы
    • Mixer: мониторинг, метрики, логи, контроль трафика

    В версии 1. 9.1 все они, кроме Pilot, который работает в отдельном Docker-контейнере, объединены в отдельный бинарный файл istiod, плюс Ingress и Egress Controllers – контроллеры входящего и исходящего трафика

    Data Plane

    Состоит из sidecar-контейнеров, которые в Kubernetes запускаются внутри подов через kube-inject, см. Installing the Sidecar.

    Контейнеры являются инстансами Envoy-прокси, которые позволяют:

    • Dynamic service discovery
    • Load balancing
    • TLS termination
    • HTTP/2 and gRPC proxies
    • Circuit breakers
    • Health checks
    • Deployment staged rollouts
    • Rich metrics

    Почитать по теме:

    • Architecture
    • Istio Architecture

    Перед тем, как приступать к запуску и настройке приложения и Istio – кратко рассмотрим ресурсы, которые участвуют в управлении трафиком.

    При установке Istio создаёт ресурс Ingress Gateway (и Egress Gateway, если было определено при установке) – новый объект в Kubernetes, который описывается в Kubernetes CRD при установке Istio.

    В AWS при настройках по-умолчанию Ingress Gateway создаёт AWS Classic LoadBalancer, т.к. Ingress Gateway является Kubernetes-объектом Ingress с типом LoadBalancer.

    “За” Ingress Gateway создаётся ресурс Gateway, который также описывается в Kubernetes CRD во время установки Istio и описывает хосты и порты, на которые будет отправляться трафик через этот Gateway.

    Далее следует ещё один ресурс – VirtualService, который описывает маршрутизацию трафика, прошёдшего через Gateway, и отправляет его на Kubernetes Services следуя заданным Destination rules.

    Ingress Gateway состоит из двух компонентов – Kubernetes Pod с инстансом Envoy, который управляет входящим трафиком, и Kubernetes Ingress, который принимает подключения.

    В свою очередь Gateway и VirtualService управляют конфигурацией Envoy, который является Ingress Gateway controller.

    Т.е. в целом схема прохождения пакета выглядит так:

    1. пакет попадает на порт внешнего LoadBalancer, который шлёт его на порт Kubernetes WorkerNode
    2. там пакет попадает к Istio IngressGateway Service
    3. перенаправляется на Istio IngressGateway Pod
    4. этот под настраивается через Gateway и VirtualService
      1. Gateway описывает порты, протоколы, SSL-сертификаты
      2. VirtualService описывает роутинг пакета к нужному Kubernetes Service нашего приложения
    5. Istio IngressGateway Pod отправляет пакет на Service приложения
    6. сервис приложения отправляет пакет на под с приложением

    Почитать по теме:

    • Understanding Istio Ingress Gateway in Kubernetes
    • Traffic Management и Traffic Management

    Istio поддерживает различные Deployment models. В нашем случае используется один EKS-кластер, а поды в нём работают в общей VPC сети.

    Кроме того, Istio поддерживает различные Config Profiles, из которых нам может быть интересен default – установка istiod и istio-ingressgateway, demo – аналогично, но с запуском istio-egressgateway и preview – для исследования новых возможностей, не включенных пока в основной релиз Istio.

    Установить Istio можно разными способами – с помощью istioctl из манифест-файлов, из Helm-чарта, либо с помощью Ansible.

    Также, стоит обратить внимание на Mutual TLS (mTLS) – см. Permissive mode. Если кратко, то по-умолчанию Istio устанавливается в Permissive mode, что позволяет уже существующим приложениям продолжать коммуникацию используя plaintext-трафик. При этом новые подключения через Envoy-контейнеры, sidecars, уже будут выполняться с TLS-шированием.

    Пока выполним установку руками, а на Дев и Прод кластера Кубера скорее всего будем инсталить через Helm.

    См. Install with Istioctl и Installation Guides.

    Загружаем Istio:

    curl -L https://istio.io/downloadIstio | sh —

    cd istio-1.9.1/

    istioctl использует файл ~/.kube/config, который можно переопределить с помощью --kubeconfig или указать нужный контекст через --context.

    В загруженном только что каталоге он находится в папке bin – добавляем его в $PATH:

    export PATH=$PWD/bin:$PATH

    Проверяем:

    istioctl version

    no running Istio pods in «istio-system»

    1.9.1

    Генерируем kubeconfig для нового тестового кластера (для AWS EKS, если используется Minikube – он при старте сгенерирует конфиг сам):

    aws eks update-kubeconfig —name bttrm-eks-test-1-18 —alias [email protected]

    Added new context [email protected] to /home/setevoy/.kube/config

    Устанавливаем Istio с профилем default:

    istioctl install —set profile=default -y

    ✔ Istio core installed

    ✔ Istiod installed

    ✔ Ingress gateways installed

    ✔ Installation complete

    Проверяем версию ещё раз:

    istioctl version

    client version: 1. 9.1

    control plane version: 1.9.1

    data plane version: 1.9.1 (1 proxies)

    Поды Istio:

    kubectl -n istio-system get pod

    NAME                                   READY   STATUS    RESTARTS   AGE

    istio-ingressgateway-d45fb4b48-jsz9z   1/1     Running   0          64s

    istiod-7475457497-6xskm                1/1     Running   0          77s

    Далее задеплоим тестовое приложение, и настроим роутинг через Istio Ingress Gateway.

    Тестовое приложение

    Не будем использовать Bookinfo приложение из Istio Gettings Started, а напишем свой велосипед создадим свой Namespace, Deployment с одним подом с NGINX, и к нему Service – эмулируем миграцию уже имеющихся у нас приложений под управление Istio.

    Кроме того, сейчас специально не будем настраваить добавление sidecar-контейнеров в приложение – вернёмся к этому вопросу чуть позже.

    Манифест сейчас выглядит так:

    ---
    apiVersion: v1
    kind: Namespace
    metadata:
      name: test-namespace
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: test-deployment
      namespace: test-namespace
      labels:
        app: test
        version: v1
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: test
      template:
        metadata:
          labels:
            app: test
            version: v1
        spec:
          containers:
          - name: web
            image: nginx
            ports:
            - containerPort: 80
            resources:
              requests:
                cpu: 100m
                memory: 100Mi
            readinessProbe:
              httpGet:
                path: /
                port: 80
          nodeSelector:
            role: common-workers
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: test-svc
      namespace: test-namespace
    spec:
      selector:
        app: test
      ports:
        - name: http
          protocol: TCP
          port: 80
          targetPort: 80

    Рекомендуется использовать тег version в приложениях – позже это позволит использовать canary и blue-green deployment, см . How To Do Canary Deployments With Istio and Kubernetes и Traffic Management.

    Деплоим:

    kubectl apply -f test-istio.yaml

    namespace/test-namespace created

    deployment.apps/test-deployment created

    service/test-svc created

    Проверим контейнеры пода:

    kk -n tkk -n test-namespace get pod -o jsonpath={.items[*].spec.containers[*].name}

    web

    Один контейнер, как и описывали.

    Через kubectl port-forward подключимся к сервису:

    kubectl -n test-namespace port-forward services/test-svc 8080:80

    Forwarding from 127.0.0.1:8080 -> 80

    Forwarding from [::1]:8080 -> 80

    И проверим работу приложения в поде:

    curl localhost:8080

    <!DOCTYPE html>

    <html>

    <head>

    <title>Welcome to nginx!</title>

    Окей – тут всё, кроме Envoy-контейнеров, работает.

    Istio Ingress Gateway

    Итак, у нас есть Istio Ingress Gateway созданный во время установки Istio, который представляет собой AWS Classic LoadBalancer:

    Если обратиться к его URL сейчас – то получим ошибку подключения т. к. шлюз не знает, куда ему направлять трафик:

    curl a6f***037.eu-west-3.elb.amazonaws.com

    curl: (52) Empty reply from server

    Что бы разрешить трафик – опишем Istio Gateway.

    Gateway

    Gateway описывает настройки Istio Ingress Gateway – на какие порты и какой принимать трафик. Плюс тут же можно выполнить SSL termination (но в нашем случае это будет AWS LoadBalancer).

    Добавляем в наш файл test-istio.yaml ресурс Gateway:

    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: test-gateway
      namespace: test-namespace
    spec:
      selector:
        istio: ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"

    Тут в spec.selector.istio указываем Istio Ingress Gateway, к которому будет применён этот манифест.

    Обратите внимание, что наше приложение живёт в отдельном Namespace, поэтому и Gateway и VirtualService (см. ниже) создаём в нём.

    Создаём его:

    kubectl apply -f test-istio.yaml

    namespace/test-namespace unchanged

    deployment.apps/test-deployment unchanged

    service/test-svc unchanged

    gateway.networking.istio.io/test-gateway created

    Проверяем:

    kubectl -n test-namespace get gateways

    NAME           AGE

    test-gateway   17s

    VirtualService

    Теперь добавляем VirtualService, в котором опишем “бекенд”, на который требуется слать трафик.

    В роли бекенда тут выступает уже обычный Service нашего приложения – test-svc:

    kk -n test-namespace get svc

    NAME       TYPE       CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE

    test-svc   NodePort   172.20.195.107   <none>        80:31581/TCP   15h

    Описываем VirtualService в том же namespace, где ижвёт наше приложение и в котором создавали Gateway:

    ---
    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: test-virtualservice
      namespace: test-namespace
    spec:
      hosts:
      - "*"
      gateways:
      - test-gateway
      http:
      - match:
        - uri:
            prefix: /
        route:
        - destination:
            host: test-svc
            port:
              number: 80

    Создаём его:

    kubectl apply -f test-istio. yaml

    namespace/test-namespace unchanged

    deployment.apps/test-deployment unchanged

    service/test-svc unchanged

    gateway.networking.istio.io/test-gateway unchanged

    virtualservice.networking.istio.io/test-virtualservice created

    Проверяем:

    kubectl -n test-namespace get virtualservice

    NAME                  GATEWAYS         HOSTS   AGE

    test-virtualservice   [test-gateway]   [*]     42s

    И ещё раз выполняем запрос к URL лоад-балансера Istio Ingress Gateway:

    curl a6f***037.eu-west-3.elb.amazonaws.com

    <!DOCTYPE html>

    <html>

    <head>

    <title>Welcome to nginx!</title>

    Заметьте, что мы всё ещё работаем без Envoy-прокси в поде нашего приложения:

    kk -n tkk -n test-namespace get pod -o jsonpath={.items[*].spec.containers[*].name}

    web

    Чуть позже разберёмся почему всё работает.

    К Istio имеется множество аддонов – Prometheus для сбора метрик, Grafana для визуализации графиков, Jaeger для трассировки вызовов, и Kiali для построения карты сети и отображения карты трафика, см. Integrations.

    Устанавливаем все аддоны:

    kubectl apply -f samples/addons

    И выполняем istioctl dashboard kiali – Kiali откроется в дефолтном браузере:

    Но если мы перейдём в Applications, то увидим, что у нашего приложения в Details указано “Missing Sidecar“:

    А в Graph нет карты сервисов:

    Итак, у нас в поде нет контейнеров с Envoy, хотя сеть работает, т.к. сейчас Istio через цепочку правил iptables шлёт трафик напрямую в контейнер с NGINX, см. Traffic flow from application container to sidecar proxy.

    Правила iptalbes настраиваются дополнительным InitContainer – istio-init во время запуска пода, а сейчас они дефолтные, настроенные kube-proxy во время деплоя нашего тестового приложения, см. Kubernetes: Service, балансировка нагрузки, kube-proxy и iptables

    В следующем посте мы копнём поглубже в работу сети в Istio, а пока просто добавим автоматическую вставку sidecar в поды неймспейса и сравним цепочки iptables до и после.

    Istio и iptables

    Посмотрим правила iptables до вставки sidecar и istio-init.

    По SSH подключаемся на WorkerNode, находим контйнер с nginx:

    [[email protected] ec2-user]# docker ps | grep nginx

    22d64b132490        nginx                                                                   «/docker-entrypoint.…»   3 minutes ago       Up 3 minutes                            k8s_web_test-deployment-6864c5bf84-mk98r_test-namespace_8b88caf0-237a-4c94-ac71-186f8e701a7c_0

    Находим PID процесса в этом контейнере:

    [[email protected] ec2-user]# docker top k8s_web_test-deployment-6864c5bf84-mk98r_test-namespace_8b88caf0-237a-4c94-ac71-186f8e701a7c_0

    UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD

    root                31548               31517               0                   10:36               ?                   00:00:00            nginx: master process nginx -g daemon off;

    101                 31591               31548               0                   10:36               ?                   00:00:00            nginx: worker process

    Используя nsenter – проверяем правила iptables в network-неймспейсе процесса 31548 – пока тут ничего необычного, весь трафик идёт на наш контейнер:

    [[email protected] ec2-user]# nsenter -t 31548 -n iptables -t nat -L

    Chain PREROUTING (policy ACCEPT)

    target     prot opt source               destination

    Chain INPUT (policy ACCEPT)

    target     prot opt source               destination

    Chain OUTPUT (policy ACCEPT)

    target     prot opt source               destination

    Chain POSTROUTING (policy ACCEPT)

    target     prot opt source               destination

    Запуск Sidecar

    Документация – Installing the Sidecar.

    Для автоматической вставки Envoy-контейнеров – выполняем:

    kubectl label namespace test-namespace istio-injection=enabled

    namespace/test-namespace labeled

    Проверяем:

    kubectl get namespace test-namespace —show-labels

    NAME             STATUS   AGE   LABELS

    test-namespace   Active   11m   istio-injection=enabled

    Но контейнеры будут добавлены только для новых ресурсов в этом неймспейсе.

    Можем добавить сайдкар вручную в запущенный под, обновив его манифест с помощью kube-inject, либо просто пересоздать под:

    kubectl  -n test-namespace scale deployment test-deployment —replicas=0

    deployment.apps/test-deployment scaled

    kubectl  -n test-namespace scale deployment test-deployment —replicas=1

    deployment.apps/test-deployment scaled

    Проверяем контейнеры ещё раз:

    kubectl -n test-namespace get pod -o jsonpath={.items[*].spec.containers[*].name}

    web istio-proxy

    Тут istio-proxy – и есть sidecar-контейнер с Envoy.

    Проверяем initContainers нашего пода:

    kk -n test-namespace get pod -o jsonpath={.items[*].spec.initContainers[*].name}

    istio-init

    И проверим правила iptables снова – ещё раз находим контейнер и его PID, смотрим:

    [[email protected] ec2-user]# nsenter -t 4194 -n iptables -t nat -L

    Chain PREROUTING (policy ACCEPT)

    target     prot opt source               destination

    ISTIO_INBOUND  tcp  —  anywhere             anywhere

    Chain INPUT (policy ACCEPT)

    target     prot opt source               destination

    Chain OUTPUT (policy ACCEPT)

    target     prot opt source               destination

    ISTIO_OUTPUT  tcp  —  anywhere             anywhere

    Chain POSTROUTING (policy ACCEPT)

    target     prot opt source               destination

    Chain ISTIO_INBOUND (1 references)

    target     prot opt source               destination

    RETURN     tcp  —  anywhere             anywhere             tcp dpt:15008

    RETURN     tcp  —  anywhere             anywhere             tcp dpt:ssh

    RETURN     tcp  —  anywhere             anywhere             tcp dpt:15090

    RETURN     tcp  —  anywhere             anywhere             tcp dpt:15021

    RETURN     tcp  —  anywhere             anywhere             tcp dpt:15020

    ISTIO_IN_REDIRECT  tcp  —  anywhere             anywhere

    Chain ISTIO_IN_REDIRECT (3 references)

    target     prot opt source               destination

    REDIRECT   tcp  —  anywhere             anywhere             redir ports 15006

    Chain ISTIO_OUTPUT (1 references)

    target     prot opt source               destination

    RETURN     all  —  ip-127-0-0-6. eu-west-3.compute.internal  anywhere

    ISTIO_IN_REDIRECT  all  —  anywhere            !localhost            owner UID match 1337

    RETURN     all  —  anywhere             anywhere             ! owner UID match 1337

    RETURN     all  —  anywhere             anywhere             owner UID match 1337

    ISTIO_IN_REDIRECT  all  —  anywhere            !localhost            owner GID match 1337

    RETURN     all  —  anywhere             anywhere             ! owner GID match 1337

    RETURN     all  —  anywhere             anywhere             owner GID match 1337

    RETURN     all  —  anywhere             localhost

    ISTIO_REDIRECT  all  —  anywhere             anywhere

    Chain ISTIO_REDIRECT (1 references)

    target     prot opt source               destination

    REDIRECT   tcp  —  anywhere             anywhere             redir ports 15001

    Теперь тут появились дополнительные цепочки, созданные Istio, которые отправлят трафик в контейнер с Envoy и от него в контейнер с приложением, и обратно.

    Возвращаемся к Kiali, проверяем карту:

    И трассировку вызовов:

    Traces доступны через Jaeger, который тоже можно открыть через istioctl dashboard jaeger:

    Также с помощью istioctl dashboard prometheus можно запустить Prometheus, и посмотреть его метрики, см. Querying Metrics from Prometheus:

    Собственно, на этом пока всё.

    Далее будем знакомиться с интеграцией AWS Application LoadBalncer, деплоем и настройкой Istio в AWS Elastic Kubernetes Service, настройкой Gateway и VirtualServices.

      • Learn Istio using Interactive Browser-Based Scenarios – базовый курс знакомства с Istio на Katacoda
      • Istio Service Mesh Workshop – знакомство с Istio
      • Service Mesh with Istio – ещё один workshop, от AWS EKS
      • How Istio Works Behind the Scenes on Kubernetes – архитектура, компоненты
      • Debugging Envoy and Istiod – дебаг Istio с istioctl
      • Starting with Istio, см. также Istio, Part II и Istio, Part III, why use it? – обзор, архитектура, сеть Istio
      • North-South Traffic Management of Istio Gateways (with Answers from Service Mesh Experts) – сеть в Istio
      • A Crash Course For Running Istio – обзор Istio, Envoy, iptables, компоненты сети Istio, очень толковый пост
      • How to Make Istio Work with Your Apps – troubleshooting и примеры proxy-status
      • Reducing Istio proxy resource consumption with outbound traffic restrictions – ресурсы в Istio и тюнинг sidecars
      • Life of a Packet through Istio – вроде бы неплохой обзор работы сети в Istio, но видео не смотрел
      • Sidecar injection and transparent traffic hijacking process in Istio explained in detail – sidecards, iptables и роутинг пакетов, весьма занимательный материал
      • An in-depth intro to Istio Ingress – Ingress, Gateway и VirtualService, примеры
      • Understanding Istio Ingress Gateway in Kubernetes – аналогично
      • Istio Gateway – аналогично
      • Getting started with Istio и подолжение – Istio in Practice – Ingress Gateway, Istio in Practice – Routing with VirtualService
      • 4 Istio Gateway: getting traffic into your cluster – и ещё про Gateway и VirtualService

    Istio / HTTP-трафик

    В этом задании показано, как настроить политику авторизации Istio с действием РАЗРЕШИТЬ для HTTP-трафика в ячеистой сети Istio.

    Прежде чем приступить к работе

    Прежде чем приступить к выполнению этой задачи, выполните следующие действия:

    • Прочтите принципы авторизации Istio.

    • Следуйте инструкциям в руководстве по установке Istio, чтобы установить Istio с поддержкой взаимного TLS.

    • Разверните пример приложения Bookinfo.

    После развертывания приложения Bookinfo перейдите на страницу продукта Bookinfo по адресу http://$GATEWAY_URL/productpage . На На странице продукта вы можете увидеть следующие разделы:

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

    При обновлении страницы приложение показывает разные версии обзоров на странице продукта. Приложение представляет обзоры по круговой системе: красные звезды, черные звезды или отсутствие звезд.

    Если вы не видите ожидаемого вывода в браузере при выполнении задачи, повторите попытку через несколько секунд. поскольку возможна некоторая задержка из-за кэширования и других накладных расходов на распространение.

    Эта задача требует включения взаимного TLS, поскольку в следующих примерах используется основной и пространство имен в политиках.

    Настройка контроля доступа для рабочих нагрузок с использованием HTTP-трафика

    С помощью Istio можно легко настроить контроль доступа для бинарного файла, развернутого операторами для выполнения некоторых функций приложения Service Mesh. У рабочих нагрузок есть имена, пространства имен и уникальные идентификаторы. Эти свойства доступны в конфигурации политики и телеметрии. используя следующие атрибуты:

    • source.workload.name , source.workload.namespace , source.workload.uid
    • назначение.рабочая нагрузка.имя , назначение. рабочая нагрузка.пространство имен , назначение.рабочая нагрузка.uid

    В Kubernetes рабочая нагрузка обычно соответствует развертыванию Kubernetes, в то время как экземпляр рабочей нагрузки соответствует отдельному управляемому поду по развертыванию.

    ‘>рабочие нагрузки в вашей сетке. В этой задаче показано, как настроить контроль доступа с помощью авторизации Istio. Сначала вы настраиваете простой разрешать ничего политика, которая отклоняет все запросы к рабочей нагрузке, а затем постепенно и поэтапно предоставляйте больше доступа к рабочей нагрузке.
    1. Выполните следующую команду, чтобы создать политику "Ничего не разрешать" в пространстве имен по умолчанию . В политике нет поля селектора , которое применяет политику к каждой рабочей нагрузке в пространство имен по умолчанию . Спецификация : поле политики имеет пустое значение {} . Это значение означает, что трафик запрещен, что фактически запрещает все запросы.

       $ kubectl применить -f - <

      Откройте в браузере страницу Bookinfo productpage ( http://$GATEWAY_URL/productpage ). Вы должны увидеть «RBAC: доступ запрещен» . Ошибка показывает, что настроенная политика "запретить все " работает по назначению, и в Istio нет правил, разрешающих какой-либо доступ к нагрузки в сетке.

    2. Выполните следующую команду, чтобы создать политику productpage-viewer для разрешения доступа с методом GET к рабочей нагрузке productpage . Политика не устанавливает из поле в правилах , что означает, что все источники разрешены, что фактически позволяет все пользователи и рабочие нагрузки:

       $ kubectl apply -f - < istio.io/v1beta1
      вид: AuthorizationPolicy
      метаданные:
        имя: "Просмотр страницы продукта"
        пространство имен: по умолчанию
      спецификация:
        селектор:
          метки соответствия:
            приложение: страница продукта
        действие: РАЗРЕШИТЬ
        правила:
        - к:
          - операция:
              методы: ["ПОЛУЧИТЬ"]
      EOF
       

      Откройте в браузере страницу Bookinfo productpage ( http://$GATEWAY_URL/productpage ). Теперь вы должны увидеть страницу «Bookinfo Sample». Однако на странице можно увидеть следующие ошибки:

      • Ошибка при получении сведений о продукте
      • Ошибка при получении отзывов о продукте на странице.

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

    3. Выполните следующую команду, чтобы создать политику просмотра сведений , чтобы разрешить страницу продукта рабочая нагрузка, которая выдает запросы с использованием cluster. local/ns/default/sa/bookinfo-productpage сервисная учетная запись, чтобы получить доступ к деталям рабочей нагрузки через методы GET :

       $ kubectl apply -f - <
    4. Выполните следующую команду, чтобы создать политику Reviews-Viewer , чтобы разрешить рабочую нагрузку productpage , который выдает запросы, используя учетную запись службы cluster.local/ns/default/sa/bookinfo-productpage , для доступа к обзорам рабочей нагрузки через метода GET :

       $ kubectl apply -f - < istio.io/v1beta1
      вид: AuthorizationPolicy
      метаданные:
        name: "просмотрщик отзывов"
        пространство имен: по умолчанию
      спецификация:
        селектор:
          метки соответствия:
            приложение: отзывы
        действие: РАЗРЕШИТЬ
        правила:
        - из:
          - источник:
              принципалы: ["cluster.local/ns/default/sa/bookinfo-productpage"]
          к:
          - операция:
              методы: ["ПОЛУЧИТЬ"]
      EOF
       

      Откройте в браузере страницу Bookinfo productpage ( http://$GATEWAY_URL/productpage ). Теперь вы должны увидеть «Пример Bookinfo». страница с «Сведения о книге» в нижней левой части и «Обзоры книг» в нижней правой части. Однако в разделе «Рецензии на книги» есть ошибка Сервис рейтингов в данный момент недоступен .

      Это связано с тем, что рабочая нагрузка отзывов не имеет разрешения на доступ к рабочей нагрузке оценок . Чтобы решить эту проблему, вам нужно предоставить отзывов рабочих нагрузок доступ к рейтингам рабочих нагрузок. Затем мы настраиваем политику, чтобы предоставить доступ рабочей нагрузке отзывов .

    5. Выполните следующую команду, чтобы создать политику ratings-viewer , чтобы разрешить рабочую нагрузку обзоров , который отправляет запросы с использованием учетной записи службы cluster.local/ns/default/sa/bookinfo-reviews , для доступа к рейтингам рабочей нагрузки с помощью методов GET :

       $ kubectl применить -f - <

      Откройте в браузере страницу Bookinfo productpage ( http://$GATEWAY_URL/productpage ). Вы должны увидеть «черные» и «красные» рейтинги в разделе «Рецензии на книги».

      Поздравляем! Вы успешно применили политику авторизации для принудительного доступа контроль рабочих нагрузок с использованием HTTP-трафика.

    Очистка

    1. Удалить все политики авторизации из вашей конфигурации:

       $ kubectl удалить authorpolicy.security.istio.io/allow-nothing
      $ kubectl удалить авторизациюpolicy.security.istio.io/productpage-viewer
      $ kubectl удалить authorpolicy.security.istio.io/details-viewer
      $ kubectl удалить authorpolicy.security.istio.io/reviews-viewer
      $ kubectl удалить authorpolicy.security.istio.io/ratings-viewer
       

    Istio / Virtual Service

    32 минуты чтения

    Конфигурация, влияющая на маршрутизацию трафика. Вот несколько терминов, полезных для определения в контексте маршрутизации трафика.

    Служба единица поведения приложения, привязанная к уникальному имени в сервисный реестр. Службы состоят из нескольких сетевых конечных точек реализуется экземплярами рабочей нагрузки, работающими в модулях, контейнерах, виртуальных машинах и т. д.

    Версии службы (также известные как подмножества) - В непрерывном развертывании сценарий, для данной услуги могут быть отдельные подмножества экземпляры, выполняющие различные варианты двоичного файла приложения. Эти варианты не обязательно являются разными версиями API. Они могут быть итеративные изменения одного и того же сервиса, развернутого в разных среды (prod, staging, dev и т. д.). Общие сценарии, когда это включают в себя A/B-тестирование, канареечное развертывание и т. д. Выбор конкретная версия может быть определена на основе различных критериев (заголовки, url и т. д.) и/или по весам, присвоенным каждой версии. Каждая служба имеет версия по умолчанию, состоящая из всех его экземпляров.

    Источник — Нижестоящий клиент вызывает службу.

    Хост — Адрес, используемый клиентом при попытке подключения к оказание услуг.

    Модель доступа — Приложения обращаются только к службе назначения (Хост) без знания отдельных версий службы (подмножеств). фактический выбор версии определяется прокси/сайдкаром, что позволяет код приложения, чтобы отделить себя от эволюции зависимых Сервисы.

    VirtualService определяет набор правил маршрутизации трафика, которые применяются, когда хост адресованный. Каждое правило маршрутизации определяет критерии сопоставления трафика определенного протокол. Если трафик совпадает, то он отправляется в именованную службу назначения. (или его подмножество/версия), определенные в реестре.

    Источник трафика также можно сопоставить в правиле маршрутизации. Это позволяет маршрутизировать быть настроены для конкретных клиентских контекстов.

    В следующем примере в Kubernetes весь HTTP-трафик по умолчанию направляется на модули сервиса отзывов с пометкой «версия: v1». Кроме того, HTTP-запросы с путем, начинающимся с /wpcatalog/ или /consumercatalog/, будут быть переписаны в /newcatalog и отправлены в модули с меткой «версия: v2».

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: обзоры-маршрут
    спецификация:
      хосты:
      - отзывы.prod.svc.cluster.local
      http:
      - имя: "обзоры-v2-маршруты"
        соответствие:
        - ури:
            префикс: "/wpcatalog"
        - ури:
            префикс: "/consumercatalog"
        переписать:
          uri: "/ новый каталог"
        маршрут:
        - назначения:
            хост: обзоры.prod.svc.cluster.local
            подмножество: v2
      - имя: "отзывы-v1-маршрут"
        маршрут:
        - назначения:
            хост: обзоры.prod.svc.cluster.local
            подмножество: v1
     

    Подмножество/версия пункта назначения маршрута идентифицируется ссылкой к именованному подмножеству служб, которое должно быть объявлено в соответствующем Правило назначения .

     версия API: networking.istio.io/v1alpha3
    тип: DestinationRule
    метаданные:
      имя: обзоры-назначение
    спецификация:
      хост: обзоры.prod.svc.cluster.local
      подмножества:
      - название: v1
        этикетки:
          версия: v1
      - название: v2
        этикетки:
          версия: v2
     

    VirtualService

    Конфигурация, влияющая на маршрутизацию трафика.

    Field Type Description Required
    hosts string[]

    The destination hosts to which traffic is being sent. Мог быть DNS-именем с подстановочным префиксом или IP-адресом. В зависимости от платформе вместо полного доменного имени можно использовать короткие имена (т. е. не имеет точки в названии). В таком случае полное доменное имя хоста будет производные на основе базовой платформы.

    Один VirtualService может использоваться для описания всего трафика свойства соответствующих хостов, в том числе для нескольких HTTP- и TCP-порты. В качестве альтернативы, свойства трафика хоста может быть определен с использованием более чем одного VirtualService с определенным предостережения. Обратитесь к Руководство по эксплуатации для деталей.

    Примечание для пользователей Kubernetes : когда используются короткие имена (например, «обзоры» вместо «reviews. default.svc.cluster.local»), Istio интерпретирует короткое имя на основе пространства имен правила, а не службы. А правило в пространстве имен «по умолчанию», содержащее «отзывы» хоста, будет интерпретируется как «reviews.default.svc.cluster.local», независимо от фактическое пространство имен, связанное со службой отзывов. Во избежание потенциальных неправильных конфигураций, рекомендуется всегда использовать полностью квалифицированные доменные имена вместо коротких имен.

    Поле hosts применяется как к службам HTTP, так и к службам TCP. Сервис внутри меш, т. е. найденные в реестре сервисов, всегда должны быть упоминаются с использованием их буквенно-цифровых имен. IP-адреса разрешены только для услуг, определенных через шлюз.

    Примечание : для делегата VirtualService он должен быть пустым.

    шлюзы string[]

    Имена шлюзов и боковых станций, которые должны применять эти маршруты. На шлюзы в других пространствах имен можно ссылаться <пространство имен шлюза>/<имя шлюза> ; указание шлюза без квалификатор пространства имен аналогичен указанию виртуального сервиса. пространство имен. Один виртуальный сервис используется для сайдкаров внутри сетки, т.к. а также для одного или нескольких шлюзов. Условия отбора, налагаемые этим поле может быть переопределено с помощью исходного поля в условиях соответствия специфических для протокола маршрутов. Зарезервированное слово меш используется для обозначения все коляски в сетке. Если это поле опущено, по умолчанию будет использоваться шлюз ( mesh ), что применит правило ко всем коляски в сетке. Если указан список имен шлюзов, правила будут применяться только к шлюзам. Чтобы применить правила к обоим шлюзы и сайдкары, укажите mesh в качестве одного из имен шлюзов.

    http HTTPRoute[]

    Упорядоченный список правил маршрутизации для HTTP-трафика. HTTP-маршруты будут применяется к служебным портам платформы с именами «http-»/«http2-»/«grpc-*», шлюз порты с протоколом HTTP/HTTP2/GRPC/TLS-terminated-HTTPS и сервис входные порты с использованием протоколов HTTP/HTTP2/GRPC. Соответствие первому правилу используется входящий запрос.

    Нет
    tls TLSRoute[]

    Упорядоченный список правил маршрутизации для нетерминированных TLS и HTTPS движение. Маршрутизация обычно выполняется с использованием представленного значения SNI. сообщением ClientHello. Маршруты TLS будут применяться к платформе служебные порты с именем ‘https-», «tls-», нетерминированные порты шлюза с использованием Протоколы HTTPS/TLS (т. е. с «сквозным» режимом TLS) и сервис входные порты с использованием протоколов HTTPS/TLS. Первое правило, соответствующее используется входящий запрос. ПРИМЕЧАНИЕ. Передавайте порты https- или tls-. без связанной виртуальной службы будет рассматриваться как непрозрачный TCP движение.

    Нет
    tcp TCPRoute[]

    Упорядоченный список правил маршрутизации для непрозрачного трафика TCP. TCP-маршруты будут применяться к любому порту, который не является портом HTTP или TLS. Первое правило используется соответствие входящему запросу.

    Нет
    exportTo string[]

    Список пространств имен, в которые экспортируется эта виртуальная служба. Экспорт виртуальный сервис позволяет использовать его боковым машинам и шлюзам, определенным в другие пространства имен. Эта функция предоставляет механизм для владельцев услуг и администраторы сетки для контроля видимости виртуальных сервисов через границы пространства имен.

    Если пространства имен не указаны, виртуальная служба экспортируется во все пространства имен по умолчанию.

    Значение «.» зарезервирован и определяет экспорт в то же пространство имен, что и виртуальная служба объявлена ​​в. Точно так же зарезервировано значение «*» и определяет экспорт во все пространства имен.

    Пункт назначения

    Пункт назначения указывает сетевую адресную службу, к которой запрос/соединение будет отправлено после обработки правила маршрутизации. destination.host должен однозначно ссылаться на сервис в сервисе реестр. Реестр сервисов Istio состоит из всех найденных сервисов. в реестре сервисов платформы (например, сервисы Kubernetes, Consul услуги), а также услуги, заявленные через Ресурс ServiceEntry.

    Примечание для пользователей Kubernetes : когда используются короткие имена (например, «обзоры» вместо «reviews.default.svc.cluster.local»), Istio интерпретирует короткое имя на основе пространства имен правила, а не службы. А правило в пространстве имен «по умолчанию», содержащем хост, «отзывы будут интерпретируется как «reviews.default.svc.cluster.local», независимо от фактическое пространство имен, связанное со службой отзывов. Во избежание потенциального неверные конфигурации, рекомендуется всегда использовать полные доменные имена вместо коротких имен.

    В следующем примере Kubernetes весь трафик по умолчанию направляется в модули сервиса отзывов с пометкой «версия: v1» (т. е. подмножество v1) и некоторые для подмножества v2 в среде Kubernetes.

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: обзоры-маршрут
      пространство имен: фу
    спецификация:
      хосты:
      - отзывы # интерпретируются как review.foo.svc.cluster.local
      http:
      - соответствие:
        - ури:
            префикс: "/wpcatalog"
        - ури:
            префикс: "/consumercatalog"
        переписать:
          uri: "/ новый каталог"
        маршрут:
        - назначения:
            хост: обзоры # интерпретируется как Reviews.foo.svc.cluster.local
            подмножество: v2
      - маршрут:
        - назначения:
            хост: обзоры # интерпретируется как Reviews.foo.svc.cluster.local
            подмножество: v1
     

    И связанное с ним DestinationRule

     apiVersion: networking. istio.io/v1alpha3
    тип: DestinationRule
    метаданные:
      имя: обзоры-назначение
      пространство имен: фу
    спецификация:
      хост: обзоры # интерпретируется как Reviews.foo.svc.cluster.local
      подмножества:
      - название: v1
        этикетки:
          версия: v1
      - название: v2
        этикетки:
          версия: v2
     

    Следующая виртуальная служба устанавливает тайм-аут 5 с для всех вызовов productpage.prod.svc.cluster.local в Kubernetes. Заметь в этом правиле не определены подмножества. Istio доставит все экземпляры службы productpage.prod.svc.cluster.local из службы реестр и заполните пул балансировки нагрузки sidecar. Кроме того, обратите внимание что это правило установлено в пространстве имен istio-system, но использует полностью полное доменное имя сервиса productpage, productpage.prod.svc.cluster.local. Следовательно, пространство имен правила не влияет на разрешение имени сервиса productpage.

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      имя: мое-продукт-страница-правило
      пространство имен: istio-система
    спецификация:
      хосты:
      - productpage. prod.svc.cluster.local # игнорирует пространство имен правил
      http:
      - время ожидания: 5 с
        маршрут:
        - назначения:
            хост: productpage.prod.svc.cluster.local
     

    Для управления маршрутизацией трафика, привязанного к службам вне сетки, внешний сервисы должны быть сначала добавлены во внутренний реестр сервисов Istio с помощью Ресурс ServiceEntry. Затем можно определить VirtualServices для управления трафиком. привязаны к этим внешним службам. Например, следующие правила определяют Сервис для wikipedia.org и установите тайм-аут 5 с для HTTP-запросов.

     версия API: networking.istio.io/v1alpha3
    вид: ServiceEntry
    метаданные:
      имя: внешний-svc-википедия
    спецификация:
      хосты:
      - wikipedia.org
      местоположение: MESH_EXTERNAL
      порты:
      - номер: 80
        имя: пример-http
        протокол: HTTP
      разрешение: DNS
    ---
    версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      имя: мое-вики-правило
    спецификация:
      хосты:
      - wikipedia.org
      http:
      - время ожидания: 5 с
        маршрут:
        - назначения:
            хост: wikipedia. org
     
    Поле Тип Описание Обязательное
    хост строка имя службы из реестра. обслуживание имена ищутся в реестре служб платформы (например, сервисы Kubernetes, сервисы Consul и т. д.) и от хостов объявленный ServiceEntry. Трафик направляется на пункты назначения, не найденные ни в одном из двух, будут удалены.

    Примечание для пользователей Kubernetes : когда используются короткие имена (например, «обзоры» вместо «reviews.default.svc.cluster.local»), Istio интерпретирует короткое имя на основе пространства имен правила, а не службы. А правило в пространстве имен «по умолчанию», содержащем хост, «отзывы будут интерпретируется как «reviews.default.svc.cluster.local», независимо от фактическое пространство имен, связанное со службой отзывов. Избегать потенциальная неправильная конфигурация, рекомендуется всегда использовать полностью квалифицированные доменные имена вместо коротких имен.

    Да
    подмножество строка

    Имя подмножества в службе. Применимо только к услугам внутри сетки. Подмножество должно быть определено в соответствующем Правило назначения.

    Нет
    порт PortSelector

    Указывает порт на хосте, который адресуется. Если услуга предоставляет только один порт, не требуется явного выбора порт.

    Нет

    HTTPRoute

    Описывает условия соответствия и действия для маршрутизации HTTP/1.1, HTTP2 и gRPC-трафик. См. VirtualService для примеров использования.

    . имя маршрута будет объединено с названием матча и будет быть зарегистрированы в журналах доступа для запросов, соответствующих этому маршрут/матч.

    Поле Тип Описание Требуется
    Имя
    Нет
    совпадение HTTPMatchRequest[]

    Условия совпадения, которые должны быть выполнены для правила активирован. Все условия внутри одного блока совпадения имеют И семантика, в то время как список блоков соответствия имеет семантику ИЛИ. Правило сопоставляется, если любой из блоков сопоставления завершается успешно.

    маршрут HTTPRouteDestination[]

    Правило HTTP может возвращать трафик direct_response, перенаправлять или пересылать (по умолчанию). Целью пересылки может быть одна из нескольких версий службы (см. глоссарий в начале документа). Веса, связанные с версия сервиса определяет долю получаемого трафика.

    Нет
    перенаправление HTTPRedirect

    Правило HTTP может возвращать трафик direct_response, перенаправлять или перенаправлять (по умолчанию). Если в правиле указана возможность пропуска трафика, маршрут/перенаправление будут игнорироваться. Примитив перенаправления может использоваться для отправить перенаправление HTTP 301 на другой URI или орган.

    Нет
    directResponse HTTPDirectResponse

    Правило HTTP может возвращать трафик direct_response, перенаправлять или пересылать (по умолчанию). Прямой ответ используется для указания фиксированного ответа, который должен быть отправлены клиентам.

    Можно установить только когда Route и Redirect пусты.

    представитель представитель

    Делегат используется для указания конкретной виртуальной службы, которая может использоваться для определения делегата HTTPRoute.

    Может быть установлен только тогда, когда Route и Redirect пусты, а маршрут правила делегата VirtualService будут объединены с правилами в текущий.

    ПРИМЕЧАНИЕ :

    1. Поддерживается делегирование только одного уровня.
    2. HTTPMatchRequest делегата должен быть строгим подмножеством корневого, в противном случае возникнет конфликт, и HTTPRoute не вступит в силу.
    Нет
    переписать HTTPRewrite

    Переписать HTTP URI и заголовки полномочий. Перезапись нельзя использовать с Редирект примитив. Перед пересылкой будет выполнена перезапись.

    Нет
    время ожидания Длительность

    Время ожидания для HTTP-запросов, по умолчанию отключено.

    Нет
    повторных попыток HTTPRetry

    Политика повторных попыток для HTTP-запросов.

    Нет
    ошибка HTTPFaultInjection

    Политика внедрения ошибок для применения к HTTP-трафику на стороне клиента. Обратите внимание, что тайм-ауты или повторные попытки не будут активированы при обнаружении ошибок. включен на стороне клиента.

    зеркало Назначение

    Зеркалирование HTTP-трафика в другое место назначения в дополнение к переадресации запросы к предполагаемому месту назначения. Зеркальный трафик находится на основе наилучших усилий, когда коляска/шлюз не будет ждать зеркальный кластер для ответа перед возвратом ответа от первоначальное назначение. Статистика будет генерироваться для зеркального назначения.

    зеркалоПроцент Процент

    Процент трафика, отражаемого полем зеркало . Если это поле отсутствует, весь трафик (100%) будет зеркалироваться. Максимальное значение — 100.

    Нет
    corsPolicy CorsPolicy

    Политика совместного использования ресурсов между источниками (CORS). Ссылаться на КОРС для получения дополнительной информации о совместном использовании ресурсов между источниками.

    Нет

    Делегат

    Описывает делегат VirtualService. Следующие правила маршрутизации перенаправляют трафик на /productpage делегатом VirtualService с именем productpage , перенаправить трафик на /reviews делегатом VirtualService с именем review .

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      Название: bookinfo
    спецификация:
      хосты:
      - "bookinfo.com"
      шлюзы:
      - мой шлюз
      http:
      - соответствие:
        - ури:
            префикс: "/productpage"
        делегировать:
           имя: страница продукта
           пространство имен: nsA
      - соответствие:
        - ури:
            префикс: "/отзывы"
        делегировать:
            Название: отзывы
            пространство имен: нсб
     
     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      имя: страница продукта
      пространство имен: nsA
    спецификация:
      http:
      - соответствие:
         - ури:
            префикс: "/productpage/v1/"
        маршрут:
        - назначения:
            хост: productpage-v1. nsA.svc.cluster.local
      - маршрут:
        - назначения:
            хост: productpage.nsA.svc.cluster.local
     
     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      Название: отзывы
      пространство имен: нсб
    спецификация:
      http:
      - маршрут:
        - назначения:
            хост: Reviews.nsB.svc.cluster.local
     
    Field Type Description Required
    name string

    Name specifies the name of the delegate VirtualService.

    Нет
    пространство имен строка

    Пространство имен указывает пространство имен, в котором находится делегат VirtualService. По умолчанию он совпадает с корневым.

    Нет

    Заголовки сообщений можно манипулировать, когда Envoy пересылает запросы, или ответы от целевой службы. Правила манипулирования заголовками могут быть указан для конкретного пункта назначения маршрута или для всех пунктов назначения. Следующий VirtualService добавляет заголовок test со значением true . к запросам, которые перенаправляются в любой пункт назначения службы отзывов . Он также удаляет заголовок ответа foo , но только из ответов. исходящий из v1 подмножество (версия) службы обзоров .

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: обзоры-маршрут
    спецификация:
      хосты:
      - отзывы.prod.svc.cluster.local
      http:
      - заголовки:
          запрос:
            установлен:
              тест: "верно"
        маршрут:
        - назначения:
            хост: обзоры.prod.svc.cluster.local
            подмножество: v2
          вес: 25
        - назначения:
            хост: обзоры.prod.svc.cluster.local
            подмножество: v1
          заголовки:
            отклик:
              удалять:
              - фу
          вес: 75
     
    Поле Тип Описание Обязательное

    TLSRoute

    Описывает действия TLSRoute

    для условий маршрутизации и нетерминального соответствия TLS трафик (TLS/HTTPS) Следующее правило маршрутизации перенаправляет трафик, поступающий на порт 443 шлюза с именем «mygateway» на внутренний услуги в ячеистой сети на основе значения SNI.

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      имя: bookinfo-sni
    спецификация:
      хосты:
      - "*.bookinfo.com"
      шлюзы:
      - мой шлюз
      тлс:
      - соответствие:
        - порт: 443
          sniHosts:
          - логин.bookinfo.com
        маршрут:
        - назначения:
            хост: login.prod.svc.cluster.local
      - соответствие:
        - порт: 443
          sniHosts:
          - отзывы.bookinfo.com
        маршрут:
        - назначения:
            хост: обзоры.prod.svc.cluster.local
     
    Филд Тип Описание Требуется
    MATCH 9999999.SLIB 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000. 9000.

    .

    .

    .

    . 9020tield. активирован. Все условия внутри одного блока совпадения имеют И семантика, в то время как список блоков соответствия имеет семантику ИЛИ. Правило сопоставляется, если любой из блоков сопоставления завершается успешно.

    Да
    route RouteDestination[]

    Пункт назначения, к которому должно быть перенаправлено соединение.

    Нет

    TCPRoute

    Описывает условия соответствия и действия для маршрутизации TCP-трафика. следующее правило маршрутизации перенаправляет трафик, поступающий на порт 27017, для mongo.prod.svc.cluster.local на другой сервер Mongo через порт 5555.

     apiVersion: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      имя: bookinfo-монго
    спецификация:
      хосты:
      - mongo.prod.svc.cluster.local
      TCP:
      - соответствие:
        - порт: 27017
        маршрут:
        - назначения:
            хост: mongo.backup.svc.cluster.local
            порт:
              номер: 5555
     
    Field Type Description Required
    match L4MatchAttributes[]

    Match conditions to be satisfied for the rule to be активирован. Все условия внутри одного блока совпадения имеют И семантика, в то время как список блоков соответствия имеет семантику ИЛИ. Правило сопоставляется, если любой из блоков сопоставления завершается успешно.

    route RouteDestination[]

    Пункт назначения, к которому должно быть перенаправлено соединение.

    Нет

    HTTPMatchRequest

    HttpMatchRequest указывает набор критериев, которые должны быть выполнены для правило, которое будет применяться к HTTP-запросу. Например, следующее ограничивает правило, чтобы оно соответствовало только тем запросам, где URL-путь начинается с /ratings/v2/ и запрос содержит пользовательский заголовок конечного пользователя со значением Джейсон .

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: рейтинги-маршрут
    спецификация:
      хосты:
      - ratings. prod.svc.cluster.local
      http:
      - соответствие:
        - заголовки:
            конечный пользователь:
              точно: Джейсон
          ури:
            префикс: "/рейтинги/v2/"
          ignoreUriCase: правда
        маршрут:
        - назначения:
            хост: ratings.prod.svc.cluster.local
     

    HTTPMatchRequest НЕ МОЖЕТ быть пустым. Примечание: Невозможно установить соответствие строки регулярного выражения, если указан делегат VirtualService.

    Field Type Description Required
    name string

    The name assigned to a match. Название матча будет объединены с именем родительского маршрута и будут зарегистрированы журналы доступа для запросов, соответствующих этому маршруту.

    uri StringMatch

    URI для соответствия значения чувствительны к регистру и отформатированы следующим образом:

    • точное: «значение» для точного совпадения строки

    • префикс: «значение» для совпадения на основе префикса

    • 3 значение "

      для соответствия на основе регулярных выражений в стиле RE2 (https://github. com/google/re2/wiki/Syntax).

    Примечание. Сопоставление без учета регистра можно включить с помощью ignore_uri_case флаг.

    схема StringMatch

    Схема URI значения чувствительны к регистру и отформатированы следующим образом:

    • точное: «значение» для точного совпадения строки

    • префикс: «значение» для совпадения на основе префикса

    • 3 значение "

      для соответствия на основе регулярных выражений в стиле RE2 (https://github.com/google/re2/wiki/Syntax).

    Нет
    метод StringMatch

    HTTP метод значения чувствительны к регистру и отформатированы следующим образом:

    • точное: «значение» для точного совпадения строки

    • префикс: «значение» для совпадения на основе префикса

    • 3 значение "

      для соответствия на основе регулярных выражений в стиле RE2 (https://github. com/google/re2/wiki/Syntax).

    Нет
    Полномочия StringMatch

    Полномочия HTTP значения чувствительны к регистру и отформатированы следующим образом:

    • точное: «значение» для точного совпадения строки

    • префикс: «значение» для совпадения на основе префикса

    • 3 значение "

      для соответствия на основе регулярных выражений в стиле RE2 (https://github.com/google/re2/wiki/Syntax).

    Нет
    порт uint32

    Указывает порты на хосте, который адресуется. Много услуг выставляйте только один порт или маркируйте порты протоколами, которые они поддерживают, в этих случаях не требуется явно выбирать порт.

    Нет
    sourceLabels map

    Одна или несколько меток, ограничивающих применимость правила к исходным нагрузкам (клиентам) с заданными метками. Если для VirtualService указан список шлюзов на высшем уровне gateways поле, оно должно включать зарезервированный шлюз mesh для этого поля.

    Нет
    шлюзы строка[]

    Имена шлюзов, к которым должно применяться правило. Имена шлюзов в шлюзах верхнего уровня поле VirtualService (если есть) переопределяются. Шлюз match не зависит от sourceLabels.

    queryParams map

    Параметры запроса для сопоставления.

    Пример:

    • Для параметра запроса, такого как «?key=true», ключ сопоставления будет «key» и совпадение строки может быть определено как точное: "true" .

    • Для параметра запроса, такого как «?key», ключ карты будет «key», а соответствие строки может быть определено как точное: "" .

    • Для параметра запроса, такого как «?key=123», ключ карты будет «key», а соответствие строки может быть определено как регулярное выражение: "\d+$" . Обратите внимание, что это конфигурация будет соответствовать только таким значениям, как «123», но не «a123» или «123a».

    Примечание: соответствие префикса в настоящее время не поддерживается.

    Нет
    ignoreUriCase bool

    Флаг, указывающий, должно ли соответствие URI быть нечувствительным к регистру.

    Примечание: Регистр будет игнорироваться только в случае точного и префикс URI совпадает.

    Нет
    sourceNamespace строка

    Исходное пространство имен, ограничивающее применимость правила к рабочим нагрузкам в этом пространстве имен. Если VirtualService имеет список шлюзов, указанных в поле шлюзов верхнего уровня , чтобы это поле было применимо, оно должно включать зарезервированный шлюз mesh .

    statPrefix строка

    Удобочитаемый префикс для использования при выводе статистики для этого маршрута. Статистика генерируется с префиксом route.. Это должно быть установлено для очень важных маршрутов, по которым нужно получить статистику «по каждому маршруту». Этот префикс предназначен только для статистики уровня прокси (envoy *), а не статистики уровня службы (istio *). См. https://www.envoyproxy.io/docs/envoy/latest/api-v3/config/route/v3/route_components.proto#envoy-v3-api-field-config-route-v3-route-stat- префикс для статистики, которая генерируется, когда это настроено.

    Нет

    HTTPRouteDestination

    Каждое правило маршрутизации связано с одной или несколькими версиями службы (см. глоссарий в начале документа). Веса, связанные с версией определить долю трафика, который он получает. Например, Следующее правило будет направлять 25% трафика для сервиса «отзывы» на экземпляров с тегом «v2» и оставшимся трафиком (т. е. 75%) на «v1».

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: обзоры-маршрут
    спецификация:
      хосты:
      - отзывы.prod.svc.cluster.local
      http:
      - маршрут:
        - назначения:
            хост: обзоры.prod.svc.cluster.local
            подмножество: v2
          вес: 25
        - назначения:
            хост: обзоры.prod.svc.cluster.local
            подмножество: v1
          вес: 75
     

    И связанное с ним DestinationRule

     apiVersion: networking.istio.io/v1alpha3
    тип: DestinationRule
    метаданные:
      имя: обзоры-назначение
    спецификация:
      хост: обзоры.prod.svc.cluster.local
      подмножества:
      - название: v1
        этикетки:
          версия: v1
      - название: v2
        этикетки:
          версия: v2
     

    Трафик также может быть разделен между двумя совершенно разными службами без необходимо определить новые подмножества. Например, следующее правило пересылает 25% трафик с review.com на dev.reviews.com

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      имя: обзоры-маршрут-два-домена
    спецификация:
      хосты:
      - отзывы.com
      http:
      - маршрут:
        - назначения:
            хост: dev.reviews.com
          вес: 25
        - назначения:
            хост: обзоры.com
          вес: 75
     
    Поле Тип Описание Обязательное
    Пункт назначения

    4

    40004

    Место назначения однозначно идентифицирует экземпляры службы на который должен быть направлен запрос/соединение.

    Да
    вес int32

    Вес определяет относительную долю трафика, пересылаемого в пункт назначения. Пункт назначения получит веса/(сумма всех весов) запросов. Если в правиле указан только один пункт назначения, он будет получать весь трафик. В противном случае, если вес равен 0 , пункт назначения не будет получать трафик.

    Нет

    RouteDestination

    Взвешенный пункт назначения правила маршрутизации L4.

    Field Type Description Required
    destination Destination

    Destination uniquely identifies the instances of a service на который должен быть направлен запрос/соединение.

    Да
    вес int32

    Вес указывает относительную долю трафика, пересылаемого в пункт назначения. Пункт назначения получит веса/(сумма всех весов) запросов. Если в правиле указан только один пункт назначения, он будет получать весь трафик. В противном случае, если вес равен 0 , пункт назначения не получит никакого трафика.

    L4MatchAttributes

    Атрибуты соответствия соединения L4. Обратите внимание, что поддержка сопоставления соединений L4 является неполным.

    Филд Тип Описание Требуется
    Destinationsubnebnets 9000298 90vel. Например., abcd/xx или просто abcd.

    порт uint32

    Указывает порт на хосте, к которому обращаются. Много услуг выставляйте только один порт или маркируйте порты протоколами, которые они поддерживают, в этих случаях не требуется явно выбирать порт.

    Нет
    sourceLabels map

    Один или несколько ярлыков, ограничивающих применимость правила к рабочие нагрузки с заданными метками. Если у VirtualService есть список шлюзы, указанные на верхнем уровне gateways поле, оно должно включать зарезервированный шлюз mesh для того, чтобы это поле было применимо.

    Нет
    шлюзы строка[]

    Имена шлюзов, к которым должно применяться правило. Имена шлюзов в шлюзах верхнего уровня поле VirtualService (если есть) переопределяются. Шлюз match не зависит от sourceLabels.

    sourceNamespace строка

    Исходное пространство имен, ограничивающее применимость правила к рабочим нагрузкам в этом пространстве имен. Если VirtualService имеет список шлюзов, указанных в поле шлюзов верхнего уровня , чтобы это поле было применимо, оно должно включать зарезервированный шлюз mesh .

    Нет

    TLSMatchAttributes

    Атрибуты соответствия соединения TLS.

    Field Type Description Required
    sniHosts string[]

    SNI (server name indicator) to match on. Подстановочные префиксы может использоваться в значении SNI, например, *.com будет соответствовать foo.example.com а также example.com. Значение SNI должно быть подмножеством (т. е. внутри домена) соответствующих хостов виртуальных служб.

    Да
    destinationSubnets string[]

    IPv4 или IPv6 IP-адреса назначения с дополнительной подсетью. Например., abcd/xx или просто abcd.

    Нет
    порт uint32

    Указывает порт на хосте, который адресуется. Много услуг выставляйте только один порт или помечайте порты протоколами, которые они поддержки, в этих случаях не требуется явный выбор порт.

    Нет
    sourceLabels map

    Один или несколько ярлыков, ограничивающих применимость правила к рабочие нагрузки с заданными метками. Если у VirtualService есть список шлюзы, указанные в поле верхнего уровня gateways , оно должно включать зарезервированный шлюз mesh для того, чтобы это поле было применимо.

    gateways string[]

    Имена шлюзов, к которым должно применяться правило. Имена шлюзов в шлюзах верхнего уровня поле VirtualService (если есть) переопределяются. Шлюз match не зависит от sourceLabels.

    Нет
    sourceNamespace строка

    Исходное пространство имен, ограничивающее применимость правила к рабочим нагрузкам в этом пространстве имен. Если у VirtualService есть список шлюзов, указанный в верхнем уровне шлюзы поле, чтобы это поле было применимо, оно должно включать зарезервированный шлюз mesh .

    Нет

    HTTPRedirect

    HTTPRedirect может использоваться для отправки вызывающему абоненту ответа перенаправления 301, где авторитет/хост и URI в ответе можно поменять местами с указанные значения. Например, следующее правило перенаправляет запросы к API /v1/getProductRatings в службе рейтингов для /v1/bookRatings предоставлено сервисом BookRatings.

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: рейтинги-маршрут
    спецификация:
      хосты:
      - ratings.prod.svc.cluster.local
      http:
      - соответствие:
        - ури:
            точно: /v1/getProductRatings
        перенаправить:
          uri: /v1/bookRatings
          авторитет: newratings.default.svc.cluster.local
      ...
     
    949494949494949494949494949494949494
    Поле Тип Описание Обязательно
    uri 141414140003 строка

    При перенаправлении перезапишите часть пути URL этим ценность. Обратите внимание, что весь путь будет заменен, независимо от URI запроса соответствует точному пути или префиксу.

    Нет
    полномочия строка

    При перенаправлении перезапишите часть URL-адреса полномочий/узла с помощью это значение.

    порт uint32 (oneof)

    При перенаправлении перезапишите часть URL-адреса порта этим значением.

    Нет
    производный порт RedirectPortSelection (один из)

    При перенаправлении динамически устанавливаем порт: * FROM_PROTOCOL_DEFAULT: автоматически устанавливается значение 80 для HTTP и 443 для HTTPS. * FROM_REQUEST_PORT: автоматически использовать порт запроса.

    схема строка

    При перенаправлении перезапишите схему URL этим значением. Например, http или https . Если не установлено, будет использована исходная схема. Если Deriveport установлен на From_protocol_default , это повлияет на используемый порт, а также

    no
    redirectcode uint32 9000 uint32 9000 9000 9000. перенаправление отклик. Код ответа по умолчанию — MOVED_PERMANENTLY (301).

    Нет

    HTTPDirectResponse

    HTTPDirectResponse можно использовать для отправки фиксированного ответа клиентам. Например, следующее правило возвращает фиксированный статус 503 с телом на запросы API /v1/getProductRatings.

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: рейтинги-маршрут
    спецификация:
      хосты:
      - ratings.prod.svc.cluster.local
      http:
      - соответствие:
        - ури:
            точно: /v1/getProductRatings
        прямой ответ:
          статус: 503
          тело:
            строка: "неизвестная ошибка"
      ...
     

    Также можно указать двоичное тело ответа. Это в основном полезно для нетекстовых протоколов, таких как gRPC.

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: рейтинги-маршрут
    спецификация:
      хосты:
      - ratings.prod.svc.cluster.local
      http:
      - соответствие:
        - ури:
            точно: /v1/getProductRatings
        прямой ответ:
          статус: 503
          тело:
            bytes: "dW5rbm93biBlcnJvcg==" # "неизвестная ошибка" в base64
      . ..
     

    Рекомендуется добавлять заголовки в HTTPRoute а также direct_response, например, чтобы указать возвращаемый Content-Type.

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: рейтинги-маршрут
    спецификация:
      хосты:
      - ratings.prod.svc.cluster.local
      http:
      - соответствие:
        - ури:
            точно: /v1/getProductRatings
        прямой ответ:
          статус: 503
          тело:
            строка: "{\"ошибка\": \"неизвестная ошибка\"}"
        заголовки:
          отклик:
            установлен:
              тип содержимого: "приложение/json"
      ...
     
    Поле Тип Описание Обязательно
    статус uint32

    Указывает возвращаемый статус ответа HTTP.

    Да
    body HTTPBody

    Указывает содержимое тела ответа. Если этот параметр опущен, тело не включается в сгенерированный ответ.

    Нет

    HTTPBody

    Field Type Description Required
    string string (oneof)

    response body as a string

    No
    bytes байта (один из)

    тело ответа в виде байтов в кодировке base64.

    Нет

    HTTPRewrite

    HTTPRewrite можно использовать для перезаписи определенных частей HTTP-запроса перед отправкой запроса адресату. Переписать примитив можно использоваться только с HTTPRouteDestination. Следующий пример демонстрирует, как переписать префикс URL для вызова API (/ratings) на рейтинги, прежде чем сделать фактический вызов API.

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: рейтинги-маршрут
    спецификация:
      хосты:
      - ratings. prod.svc.cluster.local
      http:
      - соответствие:
        - ури:
            префикс: /рейтинги
        переписать:
          uri: /v1/bookRatings
        маршрут:
        - назначения:
            хост: ratings.prod.svc.cluster.local
            подмножество: v1
     
    Поле Тип Описание Обязательное
    uri строка

    переписать часть пути (или префикса) URI с помощью этого ценность. Если исходный URI был сопоставлен на основе префикса, значение указанный в этом поле, заменит соответствующий совпадающий префикс.

    Нет
    полномочия строка

    переписать заголовок Полномочия/Хост с этим значением.

    Нет

    StringMatch

    Описывает, как сопоставить заданную строку в заголовках HTTP. Совпадение деликатный случай.

    Field Type Description Required
    exact string (oneof)

    exact string match

    No
    prefix строка (одна из)

    совпадение на основе префикса

    Нет
    регулярное выражение строка (одна из)

    Соответствие регулярному выражению в стиле RE2 (https://github. com/google/re2/wiki/Syntax).

    Нет

    HTTPRetry

    Описывает политику повторных попыток, используемую при сбое HTTP-запроса. За Например, следующее правило устанавливает максимальное количество попыток равным 3, когда рейтинги вызовов: сервис v1 с тайм-аутом 2 с на повторную попытку. Будет предпринята повторная попытка, если произойдет сбой подключения, reject_stream или когда вышестоящий сервер отвечает сообщением «Сервис недоступен» (503).

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: рейтинги-маршрут
    спецификация:
      хосты:
      - ratings.prod.svc.cluster.local
      http:
      - маршрут:
        - назначения:
            хост: ratings.prod.svc.cluster.local
            подмножество: v1
        повторяет:
          попытки: 3
          perTryTimeout: 2 с
          retryOn: сбой подключения, отказ от потока, 503
     
    Поле Тип Описание Обязательное
    попытки int32

    Количество повторных попыток, разрешенных для данного запроса. Интервал между попытками будет определяться автоматически (25 мс+). При запросе тайм-аут маршрута HTTP или per_try_timeout , фактическое количество предпринятых попыток также зависит от указанный запрос timeout и per_try_timeout значений.

    Да
    perTryTimeout Продолжительность

    Тайм-аут на попытку для данного запроса, включая первоначальный вызов и любые повторные попытки. Формат: 1ч/1м/1с/1мс. ДОЛЖНО БЫТЬ >=1 мс. По умолчанию то же значение, что и в запросе тайм-аут маршрута HTTP, что означает отсутствие тайм-аута.

    Нет
    retryOn строка

    Указывает условия, при которых происходит повторная попытка. Одну или несколько политик можно указать с помощью списка с разделителями «,». Если retry_on указывает действительный статус HTTP, он будет добавлен в политику повторных попыток retriable_status_codes. См. политики повторных попыток и политики повторных попыток gRPC для получения более подробной информации.

    Нет
    retryRemoteLocalities BoolValue

    Флаг, указывающий, следует ли повторять попытки в другие местоположения. Подробнее см. в конфигурации плагина повторной попытки.

    CorsPolicy

    Описывает политику совместного использования ресурсов между источниками (CORS) для данного оказание услуг. Обратитесь к КОРС для получения дополнительной информации о совместном использовании ресурсов между источниками. Например, следующее правило ограничивает запросы между источниками исходящими из домена example.com с помощью HTTP POST/GET и устанавливает Заголовок Access-Control-Allow-Credentials имеет значение false. Кроме того, это только выставляет заголовок X-Foo-bar и устанавливает срок действия 1 день.

     версия API: networking. istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: рейтинги-маршрут
    спецификация:
      хосты:
      - ratings.prod.svc.cluster.local
      http:
      - маршрут:
        - назначения:
            хост: ratings.prod.svc.cluster.local
            подмножество: v1
        corsPolicy:
          разрешить происхождение:
          - точно: https://example.com
          разрешить методы:
          - ПОЧТА
          - ПОЛУЧИТЬ
          разрешить учетные данные: ложь
          разрешить заголовки:
          - X-Foo-бар
          maxAge: "24 часа"
     
    Field Type Description Required
    allowOrigins StringMatch[]

    String patterns that match allowed origins. Происхождение разрешено, если совпало какое-либо из совпадений строк. Если совпадение найдено, исходящий Access-Control-Allow-Origin будет установлен на источник, предоставленный клиентом.

    allowMethods string[]

    Список HTTP-методов, которым разрешен доступ к ресурсу. Содержание будет сериализоваться в заголовок Access-Control-Allow-Methods.

    Нет
    maxAge Duration

    Указывает, как долго могут быть результаты запроса предварительной проверки кэшировано. Преобразуется в заголовок Access-Control-Max-Age .

    allowCredentials BoolValue

    Указывает, разрешено ли вызывающему абоненту отправлять фактический запрос (не предварительная проверка) с использованием учетных данных. Переводит на Заголовок Access-Control-Allow-Credentials .

    Нет

    HTTPFaultInjection

    HTTPFaultInjection можно использовать для указания одной или нескольких ошибок для внедрения при пересылке HTTP-запросов в пункт назначения, указанный в маршруте. Спецификация сбоя является частью правила VirtualService. Неисправности включают прерывание запроса Http от нижестоящей службы и/или задержка проксирование запросов. Правило ошибки ДОЛЖНО ИМЕТЬ задержку или прерывание, или и то, и другое.

    Примечание: Ошибки задержки и сброса не зависят друг от друга, даже если оба указаны одновременно.

    Field Type Description Required
    delay Delay

    Delay requests before forwarding, emulating various failures such as проблемы с сетью, перегрузка вышестоящего сервиса и т. д.

    Нет
    Прервать Прервать

    Прервать Попытки запроса Http и вернуть коды ошибок обратно в нисходящий поток сервис, создавая впечатление, что вышестоящий сервис неисправен.

    Нет

    PortSelector

    PortSelector указывает номер порта, который будет использоваться для сопоставление или выбор для окончательной маршрутизации.

    Поле Тип ОписаниеRequired
    number uint32

    Valid port number

    No

    Percent

    Percent specifies a percentage in the range of [0.0, 100.0].

    Field Type Description Required
    value double No

    HeaderOperations Describes the header manipulations to apply

    Field Type Description Required

    HTTPFaultInjection.Delay

    Delay specification is used to inject latency into the request путь пересылки. В следующем примере будет введена 5-секундная задержка в 1 из каждых 1000 запросов к «v1» версии «отзывов» сервис из всех модулей с меткой env: prod

     версия API: networking. istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: обзоры-маршрут
    спецификация:
      хосты:
      - отзывы.prod.svc.cluster.local
      http:
      - соответствие:
        - исходные метки:
            среда: продукт
        маршрут:
        - назначения:
            хост: обзоры.prod.svc.cluster.local
            подмножество: v1
        вина:
          задерживать:
            процент:
              значение: 0,1
            фиксированная задержка: 5 с
     

    Поле fixedDelay используется для указания величины задержки в секундах. Факультативный процент Поле может использоваться только для задержки определенного процент запросов. Если не указать, все запросы будут отложены.

    Field Type Description Required
    fixedDelay Duration (oneof)

    Add a fixed delay before forwarding the request. Формат: 1ч/1м/1с/1мс. ДОЛЖЕН быть >=1 мс.

    Да
    Процент Процент

    Процент запросов, для которых будет введена задержка.

    Нет
    процента int32

    Процент запросов, на которые будет введена задержка (0-100). Использование целочисленного значения процентов от не рекомендуется. Используйте двойной процент вместо этого поле.

    HTTPFaultInjection.Abort

    Спецификация Abort используется для преждевременного прерывания запроса с предварительно заданный код ошибки. Следующий пример вернет HTTP 400 код ошибки для 1 из каждых 1000 запросов к сервису «рейтинги» «v1».

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      название: рейтинги-маршрут
    спецификация:
      хосты:
      - ratings.prod.svc.cluster.local
      http:
      - маршрут:
        - назначения:
            хост: ratings.prod.svc.cluster.local
            подмножество: v1
        вина:
          прервать:
            процент:
              значение: 0,1
            httpСтатус: 400
     

    Поле httpStatus используется для указания кода состояния HTTP для вернуться к вызывающему абоненту. Необязательное поле в процентах можно использовать только для отменить определенный процент запросов. Если не указано, все запросы прервано.

    Field Type Description Required
    httpStatus int32 (oneof)

    HTTP status code to use to abort the Http request.

    Да
    grpcStatus string (one of)

    Код состояния GRPC для отмены запроса. Поддерживаемый коды задокументированы в https://github.com/grpc/grpc/blob/master/doc/statuscodes.md Примечание: Если вы хотите вернуть статус «Недоступен», то вам следует укажите код как UNAVAILABLE (все заглавные), но не 14 .

    процент Процент

    Процент запросов, которые должны быть прерваны с указанным кодом ошибки.

    Нет

    google.protobuf.UInt32Value

    Сообщение-оболочка для uint32 .

    Представление JSON для UInt32Value — это номер JSON.

    Поле Тип Описание Обязательное
    значение uint32

    Значение uint32.

    No

    HTTPRedirect.RedirectPortSelection

    Name Description
    FROM_PROTOCOL_DEFAULT
    FROM_REQUEST_PORT

    Istio / Gateway

     11 минутное чтение

    Шлюз описывает балансировщик нагрузки, работающий на краю сетки. получение входящих или исходящих соединений HTTP/TCP. Спецификация описывает набор портов, которые должны быть открыты, тип протокола для использование, настройка SNI для балансировщика нагрузки и т. д.

    Например, следующая конфигурация шлюза настраивает прокси для работы как балансировщик нагрузки, открывающий порты 80 и 9080 (http), 443 (https), 9443 (https) и порт 2379 (TCP) для входа. Шлюз будет применяется к прокси, работающему на поде с метками app: мой-шлюз-контроллер . Пока Istio настроит прокси для прослушивания на этих портах пользователь должен убедиться, что внешний трафик к этим портам разрешен в сетке.

     версия API: networking.istio.io/v1alpha3
    вид: Шлюз
    метаданные:
      имя: мой шлюз
      пространство имен: пространство имен некоторых конфигураций
    спецификация:
      селектор:
        приложение: мой-шлюз-контроллер
      серверы:
      - порт:
          номер: 80
          имя: http
          протокол: HTTP
        хосты:
        - uk.bookinfo.com
        - eu.bookinfo.com
        тлс:
          httpsRedirect: true # отправляет 301 редирект для http-запросов
      - порт:
          номер: 443
          имя: https-443
          протокол: HTTPS
        хосты:
        - uk.bookinfo.com
        - eu.bookinfo.com
        тлс:
          mode: SIMPLE # включает HTTPS на этом порту
          сертификат сервера: /etc/certs/servercert. pem
          приватный ключ: /etc/certs/privatekey.pem
      - порт:
          номер: 9443
          имя: https-9443
          протокол: HTTPS
        хосты:
        - "bookinfo-namespace/*.bookinfo.com"
        тлс:
          mode: SIMPLE # включает HTTPS на этом порту
          credentialName: bookinfo-secret # извлекает сертификаты из секрета Kubernetes
      - порт:
          номер: 9080
          имя: http-подстановочный знак
          протокол: HTTP
        хосты:
        - "*"
      - порт:
          номер: 2379 # для доступа к внутреннему сервису через внешний порт 2379
          имя: монго
          протокол: МОНГО
        хосты:
        - "*"
     

    Приведенная выше спецификация шлюза описывает свойства L4-L6 нагрузки балансир. А VirtualService затем можно привязать к шлюзу для управления перенаправление трафика, поступающего на конкретный хост или порт шлюза.

    Например, следующий VirtualService разделяет трафик для https://uk.bookinfo.com/reviews , https://eu.bookinfo.com/reviews , http://uk.bookinfo. com:9080/reviews , http://eu.bookinfo.com:9080/reviews на две версии (prod и qa) службу внутренней проверки через порт 9080. Кроме того, запросы содержащий файл cookie «user: dev-123», будет отправлен на специальный порт 7777. в ка версии. То же правило применимо и внутри сетки для запросы к сервису «reviews.prod.svc.cluster.local». Это правило применимо через порты 443, 9080. Обратите внимание, что http://uk.bookinfo.com перенаправляется на https://uk.bookinfo.com (т.е. 80 перенаправляет на 443).

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      имя: bookinfo-rule
      пространство имен: bookinfo-пространство имен
    спецификация:
      хосты:
      - отзывы.prod.svc.cluster.local
      - uk.bookinfo.com
      - eu.bookinfo.com
      шлюзы:
      - пространство-имя-конфигурации/мой-шлюз
      - mesh # применяется ко всем коляскам в меше
      http:
      - соответствие:
        - заголовки:
            куки:
              точно: "пользователь=dev-123"
        маршрут:
        - назначения:
            порт:
              номер: 7777
            хост: обзоры. qa.svc.cluster.local
      - соответствие:
        - ури:
            префикс: /отзывы/
        маршрут:
        - назначения:
            порт:
              номер: 9080 # можно не указывать, если это единственный порт для отзывов
            хост: обзоры.prod.svc.cluster.local
          вес: 80
        - назначения:
            хост: обзоры.qa.svc.cluster.local
          вес: 20
     

    Следующая виртуальная служба перенаправляет трафик, поступающий на (внешний) порт 27017 на внутренний сервер Mongo через порт 5555. Это правило не применяется внутри сетки, так как в списке шлюзов отсутствует зарезервированное имя сетка .

     версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      имя: bookinfo-монго
      пространство имен: bookinfo-пространство имен
    спецификация:
      хосты:
      - mongosvr.prod.svc.cluster.local # имя внутренней службы Mongo
      шлюзы:
      - some-config-namespace/my-gateway # может опускать пространство имен, если шлюз находится в том же пространстве имен, что и виртуальная служба.
      TCP:
      - соответствие:
        - порт: 27017
        маршрут:
        - назначения:
            хост: mongo. prod.svc.cluster.local
            порт:
              номер: 5555
     

    Можно ограничить набор виртуальных служб, которые могут привязываться к сервер шлюза, использующий синтаксис пространства имен/имени хоста в поле hosts. Например, следующий шлюз разрешает любую виртуальную службу в сети ns1. пространство имен для привязки к нему, ограничивая при этом только виртуальный сервис с помощью foo.bar.com в пространстве имен ns2 для привязки к нему.

     версия API: networking.istio.io/v1alpha3
    вид: Шлюз
    метаданные:
      имя: мой шлюз
      пространство имен: пространство имен некоторых конфигураций
    спецификация:
      селектор:
        приложение: мой-шлюз-контроллер
      серверы:
      - порт:
          номер: 80
          имя: http
          протокол: HTTP
        хосты:
        - "нс1/*"
        - "ns2/foo.bar.com"
     

    Шлюз

    Шлюз описывает балансировщик нагрузки, работающий на краю сетки. получение входящих или исходящих соединений HTTP/TCP.

    Филд Тип Описание Требуется
    94429212
    22
    29292
    229292
    28.

    Да
    selector map

    Одна или несколько меток, обозначающих определенный набор модулей/ВМ. на котором должна применяться эта конфигурация шлюза. По умолчанию поиск рабочих нагрузок выполняется во всех пространствах имен на основе селекторов меток. Это означает, что ресурс шлюза в пространстве имен «foo» может выбирать модули в пространство имен «бар» на основе меток. Этим поведением можно управлять через PILOT_SCOPE_GATEWAY_TO_NAMESPACE . переменная окружения в istiod. Если эта переменная установлена значение true, область поиска меток ограничена конфигурацией пространство имен, в котором находится ресурс. Другими словами, шлюз ресурс должен находиться в том же пространстве имен, что и рабочая нагрузка шлюза пример. Если селектор равен нулю, шлюз будет применяться ко всем рабочим нагрузкам.

    Да

    Сервер

    Сервер описывает свойства прокси на данном балансировщике нагрузки порт. Например,

     apiVersion: networking.istio.io/v1alpha3
    вид: Шлюз
    метаданные:
      имя: мой вход
    спецификация:
      селектор:
        приложение: my-ingressgateway
      серверы:
      - порт:
          номер: 80
          имя: http2
          протокол: HTTP2
        хосты:
        - "*"
     

    Другой пример

     apiVersion: networking.istio.io/v1alpha3
    вид: Шлюз
    метаданные:
      имя: мой-tcp-вход
    спецификация:
      селектор:
        приложение: my-tcp-ingressgateway
      серверы:
      - порт:
          номер: 27018
          имя: монго
          протокол: МОНГО
        хосты:
        - "*"
     

    Ниже приведен пример конфигурации TLS для порта 443

     apiVersion: networking.istio.io/v1alpha3
    вид: Шлюз
    метаданные:
      имя: мой-tls-вход
    спецификация:
      селектор:
        приложение: my-tls-ingressgateway
      серверы:
      - порт:
          номер: 443
          имя: https
          протокол: HTTPS
        хосты:
        - "*"
        тлс:
          режим: ПРОСТОЙ
          CredentialName: tls-cert
     
    Поле Тип Описание Обязательное
    порт Порт

    Порт, на котором прокси-сервер должен прослушивать входящие соединения.

    Да
    bind строка

    IP-адрес или сокет домена Unix, к которому должен быть привязан слушатель к. Формат: x.x.x.x или unix:///path/to/uds или unix://@foobar (абстрактное пространство имен Linux). При использовании доменных сокетов Unix порт число должно быть 0. Это можно использовать для ограничения доступности этого сервера только внутренним шлюзом. Обычно это используется, когда шлюзу необходимо обмениваться данными с другим сервисом mesh. например публикации показателей. В таком случае сервер, созданный с помощью указанная привязка не будет доступна для клиентов внешнего шлюза.

    Нет
    хосты строка[]

    Один или несколько хостов, открытых этим шлюзом. Хотя обычно применимо к HTTP-сервисы, его также можно использовать для TCP-сервисов с использованием TLS с SNI. Хост указывается как dnsName с необязательным префиксом пространства имен /. dnsName следует указывать в формате полного доменного имени, при необходимости включая подстановочный знак в крайнем левом компоненте (например, prod/*.example.com ). Установите для dnsName значение * , чтобы выбрать все хоста VirtualService из указанное пространство имен (например, prod/* ).

    Пространство имен может быть установлено как * или . , представляющий любой или текущий пространства имен соответственно. Например, */foo.example.com выбирает service из любого доступного пространства имен, а ./foo.example.com выбирает только сервис из пространства имен sidecar. По умолчанию, если нет пространство имен/ указано, равно */ , то есть выбирать сервисы из любого пространства имен. Также будет использоваться любой связанный DestinationRule в выбранном пространстве имен.

    VirtualService должен быть привязан к шлюзу и должен иметь один или больше хостов, которые соответствуют хостам, указанным на сервере. Матч может быть точным совпадением или совпадением суффикса с хостами сервера. За например, если хосты сервера указывают *.example.com , Виртуальная служба с хостами dev.example.com или prod.example.com будет соответствие. Однако VirtualService с хостом example.com или newexample.com не будет соответствовать.

    ПРИМЕЧАНИЕ. В пространство имен шлюза экспортируются только виртуальные службы. (например, exportTo со значением * ). Частные конфигурации (например, exportTo установлены на . ) не будут доступный. См. настройку exportTo в Виртуальная служба , DestinationRule и ServiceEntry конфигурации для получения подробной информации.

    Да
    tls ServerTLSSettings

    Набор параметров, связанных с TLS, которые управляют поведением сервера. Использовать эти параметры, чтобы контролировать, должны ли все HTTP-запросы перенаправляться на https и используемые режимы TLS.

    имя string

    Необязательное имя сервера, если задано, оно должно быть уникальным для всех серверов. Это будет использоваться для различных целей, таких как префикс статистики, сгенерированной с помощью это имя и т. д.

    Нет

    Порт

    Порт описывает свойства конкретного порта службы.

    Поле Тип Описание Обязательно
    номер uint32

    Допустимый неотрицательный целочисленный номер порта.

    Да
    протокол строка

    Протокол, доступный для порта. ДОЛЖЕН БЫТЬ одним из HTTP|HTTPS|GRPC|HTTP2|MONGO|TCP|TLS. TLS подразумевает, что соединение будет маршрутизироваться на основе заголовка SNI к пункт назначения без прерывания соединения TLS.

    Да
    имя строка

    Метка, присвоенная порту.

    Да
    targetPort uint32

    Номер порта на конечной точке, через которую будет проходить трафик полученный. Применимо только при использовании с ServiceEntries.

    ServerTLSSettings

    Поле Тип ОписаниеОбязательно
    httpsRedirect bool

    все HTTP-соединения, предлагая клиентам использовать HTTPS.

    Нет
    режим TLSmode

    Необязательно: Указывает, должны ли быть подключены к этому порту защищен с помощью TLS. Значение этого поля определяет, как работает TLS. принудительно

    Нет
    serverCertificate строка

    ТРЕБУЕТСЯ, если режим 0TUAL 90 MUPL

    4 или

    4 Путь к файлу наличие сертификата TLS на стороне сервера для использования.

    Нет
    privateKey string

    ТРЕБУЕТСЯ, если режим SIMPLE 90MUAL или Путь к файлу хранение закрытого ключа сервера.

    Нет
    caCertificates строка

    ТРЕБУЕТСЯ, если режим ВЗАИМНЫЙ . Путь к файлу, содержащему сертификаты центра сертификации для использования при проверке представленного сертификат на стороне клиента.

    Нет
    credentialName string

    Для шлюзов, работающих в Kubernetes, имя секрета, который содержит сертификаты TLS, включая сертификаты CA. Применимый только на Кубернете. Секрет (типа общий ) должен содержат следующие ключи и значения: ключ : и сертификат: . Для взаимного TLS, cacert: может быть предоставлен в том же секрете или отдельный секрет с именем -cacert . Секрет типа tls для сертификатов сервера вместе с Также поддерживается ключ ca.crt для сертификатов ЦС. Только один из сертификатов сервера и сертификат CA или можно указать CredentialName.

    Нет
    subjectAltNames string[]

    Список альтернативных имен для подтверждения личности субъекта в Сертификат, предоставленный клиентом.

    Нет
    verifyCertificateSpki string[]

    Необязательный список SHA-256 в кодировке base64 SHA-256 сертификаты авторизованных клиентов. Примечание. Когда оба значения verify_certificate_hash и verify_certificate_spki указаны, хэш, соответствующий любому значению, приведет к сертификат принимается.

    Нет
    verifyCertificateHash string[]

    Необязательный список хэшей SHA-256 в шестнадцатеричном кодировании сертификаты авторизованных клиентов. И простые, и разделенные двоеточием форматы приемлемы. Примечание. Когда оба значения verify_certificate_hash и verify_certificate_spki указаны, хэш, соответствующий любому значению, приведет к сертификат принимается.

    Нет
    минПротоколВерсия Протокол TLS

    Необязательно: минимальная версия протокола TLS.

    Нет
    maxProtocolVersion TLSProtocol

    Дополнительно: Максимальная версия протокола TLS.

    Нет
    cipherSuites string[]

    Необязательно: Если указано, поддерживается только указанный список шифров. В противном случае по умолчанию используется список шифров по умолчанию, поддерживаемый Envoy.

    No

    ServerTLSSettings.TLSmode

    TLS modes enforced by the proxy

    Name Description
    PASSTHROUGH

    The SNI string presented by the client will be используется в качестве соответствие критерию в маршруте VirtualService TLS для определения службу назначения из реестра служб.

    ПРОСТОЙ

    Безопасные соединения со стандартной семантикой TLS.

    ВЗАИМНАЯ

    Безопасные соединения с нисходящим потоком с использованием взаимного TLS путем предоставление сертификатов сервера для аутентификации.

    AUTO_PASSTHROUGH

    Аналогично режиму сквозной передачи, за исключением серверов с этим TLS режим не требует связанного VirtualService для сопоставления с значение SNI для обслуживания в реестре. Назначение такие детали, как сервис/подмножество/порт, закодированы в значение СНИ. Прокси будет пересылать вверх по течению (Envoy) кластер (группа конечных точек), указанный SNI ценность. Этот сервер обычно используется для подключения между сервисами в разрозненных сетях L3, которые в противном случае не имеют прямой связи между своими соответствующими конечные точки. Использование этого режима предполагает, что и источник, и пункт назначения использует Istio mTLS для защиты трафика.

    ISTIO_MUTUAL

    Защитите соединения от нисходящего потока с помощью взаимного TLS путем предоставление сертификатов сервера для аутентификации. По сравнению в режим Mutual, этот режим использует сертификаты, представляющие идентификатор рабочей нагрузки шлюза, автоматически созданный Istio для mTLS-аутентификации. При использовании этого режима все остальные поля в TLSOptions должны быть пустыми.

    СерверTLSSettings.

    TLSProtocol

    Версии протокола TLS.

    Название Описание
    TLS_AUTO

    Автоматический выбор оптимальной версии TLS.

    TLSV1_0

    TLS version 1.0

    TLSV1_1

    TLS version 1.1

    TLSV1_2

    TLS version 1.2

    TLSV1_3

    TLS Версия 1.3

    ISTIO / Включение Gateways

    вместе с поддержкой For Kubernetes Ingess, ISTIO. Шлюз обеспечивает более широкие возможности настройки и гибкость, чем Ingress , и позволяет применять такие функции Istio, как мониторинг и правила маршрутизации, к трафику, входящему в кластер.

    В этой задаче описывается, как настроить Istio для предоставления сервиса за пределами сервисной сетки с помощью Istio Шлюз .

    Прежде чем начать

    • Запустите образец httpbin.

      Если вы включили автоматическое внедрение sidecar, разверните службу httpbin :

       $ kubectl apply -f @samples/httpbin/httpbin.yaml@
       

      В противном случае необходимо вручную внедрить sidecar перед развертыванием приложения httpbin :

       $ kubectl apply -f <(istioctl kube-inject -f @samples/httpbin/httpbin.yaml@)
       
    • Определите входящий IP-адрес и порты, как описано в следующем подразделе.

    Определение входящего IP-адреса и портов

    Выполните следующую команду, чтобы определить, работает ли ваш кластер Kubernetes в среде, поддерживающей внешние балансировщики нагрузки:

     $ kubectl get svc istio-ingressgateway -n istio-system
    НАЗВАНИЕ ТИП КЛАСТЕР-IP ВНЕШНИЙ-IP ПОРТ(Ы) ВОЗРАСТ
    istio-входящий шлюз LoadBalancer 172. 21.109.129 130.211.10.121 ... 17ч
     

    Если установлено значение EXTERNAL-IP , ваша среда имеет внешний балансировщик нагрузки, который можно использовать для входящего шлюза. Если значение EXTERNAL-IP равно (или постоянно ), ваша среда не предоставляет внешний балансировщик нагрузки для входного шлюза. В этом случае вы можете получить доступ к шлюзу, используя порт узла службы.

    Если вы используете minikube, вы можете легко запустить внешний балансировщик нагрузки (рекомендуется), выполнив следующую команду в другом терминале:

    $ туннель миникубе
     

    Если вы используете Istio с использованием Kind в Linux, следуйте инструкциям по настройке MetalLB, чтобы заставить работать службы типа LoadBalancer .

    Выберите инструкции, соответствующие вашей среде:

    Следуйте этим инструкциям, если вы определили, что в вашей среде есть внешний балансировщик нагрузки.

    Установите входящий IP-адрес и порты:

     $ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
    $ export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')
    $ export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].port}')
    $ export TCP_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="tcp")].port}')
     

    В некоторых средах балансировщик нагрузки может быть представлен с использованием имени хоста вместо IP-адреса. В этом случае значение EXTERNAL-IP входного шлюза не будет IP-адресом, а скорее имя хоста, и приведенная выше команда не сможет установить переменную среды INGRESS_HOST . Используйте следующую команду, чтобы исправить значение INGRESS_HOST :

     $ export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{. status.loadBalancer.ingress[0].hostname}' )
     

    Настройка входа с помощью шлюза Istio

    Шлюз входа описывает балансировщик нагрузки, работающий на краю сетки, который получает входящие соединения HTTP/TCP. Он настраивает открытые порты, протоколы и т. д. но, в отличие от Kubernetes Ingress Resources, не включает конфигурацию маршрутизации трафика. Вместо этого настроена маршрутизация входящего трафика. с помощью правил маршрутизации Istio точно так же, как и для внутренних сервисных запросов.

    Давайте посмотрим, как вы можете настроить Шлюз на порту 80 для HTTP-трафика.

    1. Создать шлюз Istio :

       $ kubectl apply -f - < example.com"
      EOF
       
    2. Настроить маршруты для трафика, входящего через Шлюз :

       $ kubectl применить -f - <

      Теперь вы создали виртуальную службу конфигурация для службы httpbin , содержащая два правила маршрутизации, разрешающие трафик для путей /статус и /задержка .

      Список шлюзов указывает, что разрешены только запросы через ваш httpbin-шлюз . Все другие внешние запросы будут отклонены с ответом 404.

      Внутренние запросы от других служб в ячеистой сети не подпадают под действие этих правил но вместо этого по умолчанию будет использоваться циклическая маршрутизация. Чтобы применить эти правила и к внутренним вызовам, вы можете добавить специальное значение mesh в список шлюзов . Поскольку внутреннее имя хоста для услуга, вероятно, отличается (например, httpbin.default.svc.cluster.local ) с внешнего, вам также нужно будет добавить его в список хостов . Обратитесь к руководство по эксплуатации Больше подробностей.

    3. Доступ к службе httpbin с помощью curl :

       $ curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST:$INGRESS_PORT/status/200"
      HTTP/1.1 200 ОК
      сервер: istio-envoy
      ...
       

      Обратите внимание, что вы используете флаг -H , чтобы установить HTTP-заголовок Host на «httpbin.example.com». Это необходимо, потому что ваш вход Шлюз настроен на обработку «httpbin.example.com», но в вашей тестовой среде у вас нет привязки DNS для этого хоста, и вы просто отправляете свой запрос на входной IP-адрес.

    4. Доступ к любому другому URL-адресу, который не был явно раскрыт. Вы должны увидеть ошибку HTTP 404:

       $ curl -s -I -HHost:httpbin.example.com "http://$INGRESS_HOST:$INGRESS_PORT/headers"
      HTTP/1.1 404 не найден
      ...
       

    Доступ к службам входящего трафика с помощью браузера

    Ввод URL-адреса службы httpbin в браузере не будет работать, поскольку вы не можете передать заголовок Host в браузер, как вы сделали с curl . В реальной ситуации это не проблема потому что вы правильно настроили запрошенный хост и разрешили DNS. Таким образом, вы используете доменное имя хоста в URL-адресе, например, https://httpbin.example.com/status/200 .

    Чтобы обойти эту проблему для простых тестов и демонстраций, используйте подстановочный знак * значение для хоста в шлюзе и конфигурации VirtualService . Например, если вы измените конфигурацию входа на следующую:

     $ kubectl apply -f - < istio.io/v1alpha3
    вид: Шлюз
    метаданные:
      имя: httpbin-шлюз
    спецификация:
      селектор:
        istio: ingressgateway # использовать реализацию шлюза Istio по умолчанию
      серверы:
      - порт:
          номер: 80
          имя: http
          протокол: HTTP
        хосты:
        - "*"
    ---
    версия API: networking.istio.io/v1alpha3
    вид: виртуалсервис
    метаданные:
      имя: httpbin
    спецификация:
      хосты:
      - "*"
      шлюзы:
      - httpbin-шлюз
      http:
      - соответствие:
        - ури:
            префикс: / заголовки
        маршрут:
        - назначения:
            порт:
              номер: 8000
            хост: httpbin
    EOF
     

    Затем вы можете использовать $INGRESS_HOST:$INGRESS_PORT в URL-адресе браузера. Например, http://$INGRESS_HOST:$INGRESS_PORT/headers отобразит все заголовки, которые отправляет ваш браузер.

    Понимание того, что произошло

    Ресурсы конфигурации шлюза позволяют внешнему трафику поступать в Сервисная сетка Istio и создание функций управления трафиком и политик Istio. доступны для пограничных сервисов.

    На предыдущих шагах вы создали сервис внутри сервисной сетки. и открыли конечную точку HTTP службы для внешнего трафика.

    Устранение неполадок

    1. Проверьте значения переменных среды INGRESS_HOST и INGRESS_PORT . Убедиться они имеют допустимые значения в соответствии с выводом следующих команд:

       $ kubectl get svc -n istio-system
      $ echo "INGRESS_HOST=$INGRESS_HOST, INGRESS_PORT=$INGRESS_PORT"
       
    2. Убедитесь, что на том же порту не определены другие входные шлюзы Istio:

       $ kubectl get gateway --all-namespaces
       
    3. Убедитесь, что у вас нет ресурсов Kubernetes Ingress, определенных на том же IP и порту:

       $ kubectl get ingress --all-namespaces
       
    4. Если у вас есть внешний балансировщик нагрузки и он у вас не работает, попробуйте получить доступ к шлюзу, используя его порт узла.

    Очистка

    Удалить конфигурацию Gateway и VirtualService и отключить службу httpbin:

     $ kubectl удалить шлюз httpbin-gateway
    $ kubectl удалить виртуальный сервис httpbin
    $ kubectl удалить --ignore-not-found=true -f @samples/httpbin/httpbin.yaml@
     

    Istio / Secure Gateways

    Задача Контроль входящего трафика описывает, как настроить входной шлюз для предоставления HTTP обслуживание внешнего трафика. В этой задаче показано, как открыть безопасный HTTPS-адрес. службы с использованием простого или взаимного TLS.

    Перед началом работы

    1. Выполните действия, описанные в разделе Перед началом работы. и Определение входящего IP-адреса и портов разделы задачи Контроль входящего трафика. После выполнения эти шаги у вас должны быть развернуты Istio и служба httpbin, и переменные окружения INGRESS_HOST и SECURE_INGRESS_PORT установлены.

    2. Для пользователей macOS убедитесь, что вы используете curl , скомпилированный с библиотекой LibreSSL:

       $ curl --version | grep LibreSSL
      curl 7.54.0 (x86_64-apple-darwin17.0) libcurl/7.54.0 LibreSSL/2.0.20 zlib/1.2.11 nghttp2/1.24.0
       

      Если предыдущая команда выводит версию LibreSSL, как показано, ваша команда curl должны правильно работать с инструкциями в этой задаче. В противном случае попробуйте другая реализация curl , например, на компьютере с Linux.

    Создание клиентских и серверных сертификатов и ключей

    Для этой задачи вы можете использовать свой любимый инструмент для создания сертификатов и ключей. Команды ниже используют openssl

    1. Создайте корневой сертификат и закрытый ключ для подписи сертификатов для ваших служб:

       $ openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=example Inc. /CN =example.com' -keyout example.com.key -out example.com.crt
       
    2. Создайте сертификат и закрытый ключ для httpbin.example.com :

       $ openssl req -out httpbin.example.com.csr -newkey rsa:2048 -nodes -keyout httpbin.example.com.key -subj "/CN=httpbin.example.com/O=httpbin организация"
      $ openssl x509 -req -sha256 -days 365 -CA example.com.crt -CAkey example.com.key -set_serial 0 -in httpbin.example.com.csr -out httpbin.example.com.crt
       

    Настройка входящего шлюза TLS для одного узла

    1. Перед началом работы убедитесь, что вы развернули службу httpbin.

    2. Создайте секрет для входного шлюза:

       $ kubectl create -n istio-system secret tls httpbin-credential --key=httpbin.example.com.key --cert=httpbin.example.com.crt
       
    3. Определите шлюз с серверами : раздел для порта 443 и укажите значения для credentialName будет httpbin-credential . Значения такие же, как и имя тайны. Режим TLS должен иметь значение ПРОСТОЙ .

       $ кот <
    4. Настройте маршруты входящего трафика шлюза. Определите соответствующий виртуальный сервис.

       $ кошка <
    5. Отправить запрос HTTPS для доступа к службе httpbin через HTTPS:

       $ curl -v -HHost:httpbin. example.com --resolve "httpbin.example.com:$SECURE_INGRESS_PORT:$INGRESS_HOST" \
      --cacert example.com.crt "https://httpbin.example.com:$SECURE_INGRESS_PORT/status/418"
       

      Служба httpbin вернет 418 Код "Я Чайник".

    6. Удалить секрет шлюза и создать новый для изменения входа учетные данные шлюза.

       $ kubectl -n istio-system удалить секрет httpbin-credential
       
       $ mkdir new_certificates
      $ openssl запрос -x509-sha256 -nodes -days 365 -newkey rsa:2048 -subj '/O=example Inc./CN=example.com' -keyout new_certificates/example.com.key -out new_certificates/example.com.crt
      $ openssl req -out new_certificates/httpbin.example.com.csr -newkey rsa:2048 -nodes -keyout new_certificates/httpbin.example.com.key -subj "/CN=httpbin.example.com/O=httpbin организация"
      $ openssl x509 -req -sha256 -days 365 -CA new_certificates/example.com.crt -CAkey new_certificates/example. com.key -set_serial 0 -in new_certificates/httpbin.example.com.csr -out new_certificates/httpbin.example. com.crt
      $ kubectl create -n istio-system secret tls httpbin-credential \
      --key=новые_сертификаты/httpbin.example.com.key \
      --cert=new_certificates/httpbin.example.com.crt
       9`"._,
          \_;`"---"`|//
            | ;/
            \_ _/
              `"""`
       
    7. Если вы попытаетесь получить доступ к httpbin с предыдущей цепочкой сертификатов, попытка завершится неудачно.

       $ curl -v -HHost:httpbin.example.com --resolve "httpbin.example.com:$SECURE_INGRESS_PORT:$INGRESS_HOST" \
      --cacert example.com.crt "https://httpbin.example.com:$SECURE_INGRESS_PORT/status/418"
      ...
      * TLSv1.2 (OUT), рукопожатие TLS, приветствие клиента (1):
      * TLSv1.2 (IN), рукопожатие TLS, приветствие сервера (2):
      * TLSv1.2 (IN), рукопожатие TLS, сертификат (11):
      * TLSv1.2 (OUT), оповещение TLS, приветствие сервера (2):
      * curl: (35) ошибка: 04FFF06A: подпрограммы rsa: CRYPTO_internal: тип блока не 01
       

    Настройка входного шлюза TLS для нескольких хостов

    Вы можете настроить входной шлюз для нескольких хостов, httpbin. example.com и helloworld-v1.example.com , например. Входной шлюз извлекает уникальные учетные данные, соответствующие определенному credentialName .

    1. Чтобы восстановить учетные данные для httpbin , удалите его секрет и создайте заново.

       $ kubectl -n istio-system удалить секрет httpbin-credential
      $ kubectl create -n istio-system secret tls httpbin-credential \
      --key=httpbin.example.com.key \
      --cert=httpbin.example.com.crt
       
    2. Запустить образец helloworld-v1

       $ cat <
    3. Создать сертификат и закрытый ключ для helloworld-v1. example.com :

       $ openssl req -out helloworld-v1.example.com.csr -newkey rsa:2048 -nodes -keyout helloworld-v1 .example.com.key -subj "/CN=helloworld-v1.example.com/O=helloworld организация"
      $ openssl x509 -req -sha256 -days 365 -CA example.com.crt -CAkey example.com.key -set_serial 1 -in helloworld-v1.example.com.csr -out helloworld-v1.example.com.crt
       
    4. Создайте helloworld-credential секрет:

       $ kubectl create -n istio-system secret tls helloworld-credential --key=helloworld-v1.example.com.key --cert=helloworld-v1.example.com.crt
       
    5. Определить шлюз с двумя секциями сервера для порта 443. Установить значение credentialName на каждом порту до httpbin-credential и helloworld-credential соответственно. Установите для режима TLS значение SIMPLE .

       $ кот < istio.io/v1alpha3
      вид: Шлюз
      метаданные:
        имя: мой шлюз
      спецификация:
        селектор:
          istio: ingressgateway # использовать входной шлюз istio по умолчанию
        серверы:
        - порт:
            номер: 443
            имя: https-httpbin
            протокол: HTTPS
          тлс:
            режим: ПРОСТОЙ
            CredentialName: httpbin-credential
          хосты:
          - httpbin.example.com
        - порт:
            номер: 443
            имя: https-helloworld
            протокол: HTTPS
          тлс:
            режим: ПРОСТОЙ
            credentialName: helloworld-credential
          хосты:
          - helloworld-v1.example.com
      EOF
       
    6. Настройте маршруты трафика шлюза. Определите соответствующий виртуальный сервис.

       $ кот <
    7. Отправить запрос HTTPS на helloworld-v1. `". _, \_;`"---"`|// | ;/ \_ _/ `"""`

    Настройка общего входного шлюза TLS

    Вы можете расширить определение своего шлюза для поддержки взаимный TLS. Изменять учетные данные входного шлюза, удалив его секрет и создав новый. Сервер использует сертификат CA для проверки его клиентов, и мы должны использовать имя cacert для хранения сертификата ЦС.

     $ kubectl -n istio-system удалить секрет httpbin-credential
    $ kubectl create -n istio-system secret generic httpbin-credential --from-file=tls.key=httpbin.example.com.key \
    --from-file=tls.crt=httpbin.example.com.crt --from-file=ca.crt=example.com.crt
     
    1. Измените определение шлюза, чтобы установить режим TLS на ВЗАИМНЫЙ .

       $ кот < example.com
      EOF
       
    2. Попытка отправить HTTPS-запрос, используя предыдущий подход, и посмотрите, почему он не работает:

       $ curl -v -HHost:httpbin.example.com --resolve "httpbin.example.com:$SECURE_INGRESS_PORT:$INGRESS_HOST" \
      --cacert example.com.crt "https://httpbin.example.com:$SECURE_INGRESS_PORT/status/418"
      * TLSv1.3 (OUT), рукопожатие TLS, приветствие клиента (1):
      * TLSv1.3 (IN), рукопожатие TLS, приветствие сервера (2):
      * TLSv1.3 (IN), рукопожатие TLS, зашифрованные расширения (8):
      * TLSv1.3 (IN), рукопожатие TLS, запрос CERT (13):
      * TLSv1.3 (IN), рукопожатие TLS, сертификат (11):
      * TLSv1.3 (IN), рукопожатие TLS, проверка CERT (15):
      * TLSv1.3 (IN), рукопожатие TLS, Готово (20):
      * TLSv1.3 (OUT), изменение шифрования TLS, изменение спецификации шифрования (1):
      * TLSv1.3 (OUT), рукопожатие TLS, сертификат (11):
      * TLSv1.3 (OUT), рукопожатие TLS, Готово (20):
      * TLSv1.3 (IN), оповещение TLS, неизвестно (628):
      * OpenSSL SSL_read: ошибка: 1409445C: подпрограммы SSL: ssl3_read_bytes: требуется сертификат оповещения tlsv13, errno 0
       
    3. Создать сертификат клиента и закрытый ключ:

       $ openssl req -out client.  `". _,
          \_;`"---"`|//
            | ;/
            \_ _/
              `"""`
       

    Форматы ключей

    Istio поддерживает чтение нескольких различных форматов секретов для поддержки интеграции с различными инструментами, такими как cert-manager:

    • Секрет TLS с ключами tls.key и tls.crt 90 описано выше. Для взаимного TLS можно использовать ключ ca.crt .
    • Общий секрет с ключами ключ и сертификат . Для взаимного TLS можно использовать ключ cacert .
    • Общий секрет с ключами ключ и сертификат . Для взаимного TLS используется отдельный универсальный секрет с именем -cacert и ключом cacert . Например, httpbin-credential имеет ключ и сертификат , а httpbin-credential-cacert имеет cacert .
    • Значением ключа cacert может быть пакет ЦС, состоящий из объединенных отдельных сертификатов ЦС.

    Маршрутизация SNI

    Шлюз HTTPS со значением поля hosts , отличным от * , будет выполняться сопоставление SNI перед пересылкой запроса, что может привести к сбою некоторых запросов. Дополнительные сведения см. в разделе Настройка маршрутизации SNI.

    Поиск и устранение неисправностей

    • Проверьте значения среды INGRESS_HOST и SECURE_INGRESS_PORT . переменные. Убедитесь, что они имеют допустимые значения в соответствии с выводом следующие команды:

       $ kubectl get svc -n istio-system
      $ echo "INGRESS_HOST=$INGRESS_HOST, SECURE_INGRESS_PORT=$SECURE_INGRESS_PORT"
       
    • Проверьте журнал контроллера istio-ingressgateway на наличие сообщений об ошибках:

       $ kubectl logs -n istio-system "$(kubectl get pod -l istio=ingressgateway \
      -n istio-system -o jsonpath='{. items[0].metadata.name}')"
       
    • Если вы используете macOS, убедитесь, что вы используете curl , скомпилированный с LibreSSL библиотеки, как описано в разделе «Перед началом работы».

    • Убедитесь, что секреты успешно созданы в istio-система пространство имен:

       $ kubectl -n istio-system получить секреты
       

      httpbin-credential и helloworld-credential должны отображаться в секретах список.

    • Проверьте журналы, чтобы убедиться, что агент входящего шлюза отправил пару ключ/сертификат на входной шлюз.

       $ kubectl logs -n istio-system "$(kubectl get pod -l istio=ingressgateway \
      -n istio-system -o jsonpath='{.items[0].metadata.name}')"
       

      Журнал должен показать, что был добавлен секрет httpbin-credential . При использовании взаимных TLS, то также должен появиться секрет httpbin-credential-cacert . Убедитесь, что журнал показывает, что агент шлюза получает запросы SDS от входной шлюз, имя ресурса httpbin-credential и входной шлюз получил пару ключ/сертификат. При использовании взаимного TLS в журнале должно отображаться ключ/сертификат отправлен на входной шлюз, что агент шлюза получил запрос SDS с кодом httpbin-credential-cacert имя ресурса и что входной шлюз получил корневой сертификат.

    Очистка

    1. Удалить конфигурацию шлюза, определение виртуальной службы и секреты:

       $ kubectl удалить шлюз mygateway
      $ kubectl удалить виртуальный сервис httpbin
      $ kubectl delete --ignore-not-found=true -n istio-системный секрет httpbin-credential \
      helloworld-учетные данные
      $ kubectl удалить --ignore-not-found=true виртуальный сервис helloworld-v1
       
    2. Удалить сертификаты и ключи:

       $ rm -rf example.com.crt example. com.key httpbin.example.com.crt httpbin.example.com.key httpbin.example.com.csr helloworld-v1 .example.com.crt helloworld-v1.example.com.key helloworld-v1.example.com.csr client.example.com.crt client.example.com.csr client.example.com.key ./new_certificates
       
    3. Отключить службы httpbin и helloworld-v1 :

       $ kubectl удалить развертывание --ignore-not-found=true httpbin helloworld-v1
      $ kubectl служба удаления --ignore-not-found=true httpbin helloworld-v1
       

    Istio / Service Mesh Istio

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

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

    Что такое Service Mesh?

    Архитектура современных приложений обычно представляет собой распределенные наборы микросервисов, каждый из которых выполняет определенную бизнес-функцию. Сервисная сетка — это выделенный уровень инфраструктуры, который вы можете добавить к своим приложениям. Это позволяет вам прозрачно добавлять такие возможности, как наблюдаемость, управление трафиком и безопасность, не добавляя их в свой собственный код. Термин «сервисная сетка» описывает как тип программного обеспечения, которое вы используете для реализации этого шаблона, так и безопасность или сетевой домен, который создается при использовании этого программного обеспечения.

    Поскольку развертывание распределенных служб, например, в системе на основе Kubernetes, увеличивается в размерах и усложняется, становится все труднее понимать и управлять ими. Его требования могут включать обнаружение, балансировку нагрузки, восстановление после отказа, метрики и мониторинг. Сервисная сетка также часто удовлетворяет более сложные эксплуатационные требования, такие как A/B-тестирование, канареечное развертывание, ограничение скорости, контроль доступа, шифрование и сквозная аутентификация.

    Связь между службами — это то, что делает возможным распределенное приложение. Маршрутизация этой связи как внутри, так и между кластерами приложений становится все более сложной по мере роста числа сервисов. Istio помогает уменьшить эту сложность и снизить нагрузку на команды разработчиков

    Что такое Истио?

    Istio — это сервисная сетка с открытым исходным кодом, которая прозрачно накладывается на существующие распределенные приложения. Мощные функции Istio обеспечивают унифицированный и более эффективный способ защиты, подключения и мониторинга сервисов. Istio — это путь к балансировке нагрузки, межсервисной аутентификации и мониторингу — с небольшими изменениями кода службы или без них. Его мощная плоскость управления обладает жизненно важными функциями, в том числе:

    • Безопасная связь между службами в кластере с шифрованием TLS, строгой аутентификацией и авторизацией на основе удостоверений
    • Автоматическая балансировка нагрузки для трафика HTTP, gRPC, WebSocket и TCP
    • Детализированный контроль поведения трафика с помощью расширенных правил маршрутизации, повторных попыток, отказоустойчивости и внедрения ошибок лимиты и квоты
    • Автоматические метрики, журналы и трассировки для всего трафика в кластере, включая входящий и исходящий трафик кластера

    Istio разработан с учетом расширяемости и может удовлетворить широкий спектр потребностей развертывания. Плоскость управления Istio работает в Kubernetes, и вы можете добавлять приложения, развернутые в этом кластере, в свою сетку, расширять сетку на другие кластеры или даже подключать виртуальные машины или другие конечные точки, работающие за пределами Kubernetes.

    Большая экосистема участников, партнеров, интеграторов и дистрибьюторов расширяет и использует Istio для самых разных сценариев. Вы можете установить Istio самостоятельно, или у ряда поставщиков есть продукты, которые интегрируют Istio и управляют им за вас.

    Как это работает

    Istio состоит из двух компонентов: плоскости данных и плоскости управления.

    Плоскость данных — это связь между службами. Без сервисной сетки сеть не понимает передаваемый трафик и не может принимать какие-либо решения на основе того, какой это тип трафика или от кого он поступает.

    Service Mesh использует прокси-сервер для перехвата всего вашего сетевого трафика, что позволяет использовать широкий набор функций с учетом приложений на основе заданной вами конфигурации.

    Прокси-сервер Envoy развертывается вместе с каждой службой, которую вы запускаете в своем кластере, или работает вместе со службами, работающими на виртуальных машинах.

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

    До использования Istio
    После использования Istio

    Маршрутизация трафика как внутри одного кластера, так и между кластерами влияет на производительность и обеспечивает лучшую стратегию развертывания. Правила маршрутизации трафика Istio позволяют легко контролировать поток трафика и вызовы API между сервисами. Istio упрощает настройку свойств уровня обслуживания, таких как автоматические выключатели, тайм-ауты и повторные попытки, а также упрощает настройку важных задач, таких как A/B-тестирование, канареечное развертывание и поэтапное развертывание с процентным разделением трафика.

    По мере усложнения сервисов становится все труднее понять поведение и производительность. Istio генерирует подробную телеметрию для всех взаимодействий в сервисной сетке. Эта телеметрия обеспечивает возможность наблюдения за поведением службы, позволяя операторам устранять неполадки, обслуживать и оптимизировать свои приложения. Более того, вы получаете почти все эти инструменты, не требуя внесения изменений в приложение. С помощью Istio операторы получают полное представление о том, как взаимодействуют отслеживаемые сервисы.

    Телеметрия Istio включает подробные метрики, распределенные трассировки и журналы полного доступа. С Istio вы получаете полную и всестороннюю наблюдаемость сервисной сетки.

    Микросервисы предъявляют особые требования к безопасности, включая защиту от атак типа «злоумышленник посередине», гибкие средства управления доступом, инструменты аудита и взаимный TLS. Istio включает в себя комплексное решение для обеспечения безопасности, позволяющее операторам решить все эти проблемы. Он обеспечивает надежное удостоверение, мощную политику, прозрачное шифрование TLS, а также инструменты аутентификации, авторизации и аудита (AAA) для защиты ваших служб и данных.

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *