Руководство по миграции конфигураций Open Service Mesh (OSM) в Istio

Важно!

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

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

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

Необходимые компоненты

Изменения, необходимые для примера приложения Bookstore OSM

Чтобы разрешить Istio управлять приложением bookstore OSM, в существующих манифестах необходимо несколько изменений. Эти изменения связаны с книжным хранилищем и службами mysql.

Изменения bookstore

В пошаговом руководстве по OSM Bookstore служба книжного хранилища развертывается вместе с другой службой bookstore-v2, чтобы продемонстрировать, как OSM обеспечивает смену трафика. Эти развернутые службы позволяют разделить трафик клиента (bookbuyer) между несколькими конечными точками службы. Первая новая концепция, чтобы понять, как Istio обрабатывает то, что они называют сменой трафика.

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

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

Изменение, внесенное в службу хранилища книг и развертывание для Istio, удаляет необходимость явной второй службы для целевой цели, для которой требуется разделение трафика SMI. Нет необходимости в другой учетной записи службы для службы bookstore версии 2, так как она должна быть консолидирована в службе книжного хранилища. Исходные изменения манифеста OSM traffic-access-v1.yaml в Istio для книжного магазина версии 1 и версии 2 показаны в разделе "Создание модулей pod, служб и учетных записей служб". Мы покажем, как разделить трафик, известный как сдвиг трафика далее в пошаговом руководстве:

Изменения MySql

Изменения в наборе состояния mysql необходимы только в конфигурации службы. В спецификации службы OSM требовались targetPort и appProtocol атрибуты. Эти атрибуты не нужны для Istio. Следующая обновленная служба для mysqldb выглядит следующим образом:

apiVersion: v1
kind: Service
metadata:
  name: mysqldb
  labels:
    app: mysqldb
    service: mysqldb
spec:
  ports:
    - port: 3306
      name: tcp
  selector:
    app: mysqldb

Развертывание измененного приложения Bookstore

Как и в пошаговом руководстве по OSM Bookstore, мы начнем с новой установки приложения bookstore.

Создание пространств имен

kubectl create namespace bookstore
kubectl create namespace bookbuyer
kubectl create namespace bookthief
kubectl create namespace bookwarehouse

Добавление метки пространства имен для внедрения бокового автомобиля Istio

Для OSM, используя команду osm namespace add <namespace> , создав необходимые заметки в пространстве имен для контроллера OSM, чтобы добавить автоматическую внедрение боковой кареты. С помощью Istio необходимо просто наметить пространство имен, чтобы позволить контроллеру Istio автоматически внедрять прокси-серверы на стороне Envoy.

kubectl label namespace bookstore istio-injection=enabled
kubectl label namespace bookbuyer istio-injection=enabled
kubectl label namespace bookthief istio-injection=enabled
kubectl label namespace bookwarehouse istio-injection=enabled

Развертывание правила виртуальной службы Istio и назначения для Bookstore

Как упоминание ранее в разделе изменения Bookstore, Istio обрабатывает перемещение трафика с помощью атрибута веса VirtualService, который мы настраиваем позже в пошаговом руководстве. Мы развертываем правило виртуальной службы и назначения для службы bookstore. Мы развертываем только книжный магазин версии 1, несмотря на развертывание книжного магазина версии 2. Виртуальная служба Istio предоставляет только маршрут для книжного магазина версии 1. Отличается от того, как OSM обрабатывает сдвиг трафика (разделение трафика), OSM развернула другую службу для приложения bookstore версии 2. OSM необходимо настроить трафик для разделения трафика между клиентскими запросами с помощью TrafficSplit. При смене трафика с помощью Istio можно ссылаться на переключение трафика на несколько развертываний приложений Kubernetes (версий), помеченных для одной службы.

В этом пошаговом руководстве развертывание обеих версий книжного магазина (версии 1 и версии 2) развертывается одновременно. Доступно только версия 1 из-за конфигурации виртуальной службы. Нет необходимости развертывать другую службу для книжного магазина версии 2, мы включаем маршрут в книжный магазин версии 2 позже при обновлении виртуальной службы книжного магазина и предоставления необходимого атрибута веса для перемещения трафика.

kubectl apply -f - <<EOF
# Create bookstore virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookstore-virtualservice
  namespace: bookstore
spec:
  hosts:
  - bookstore
  http:
  - route:
    - destination:
        host: bookstore
        subset: v1
---
# Create bookstore destination rule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: bookstore-destination
  namespace: bookstore
spec:
  host: bookstore
  subsets:
  - name: v1
    labels:
      app: bookstore
      version: v1
  - name: v2
    labels:
      app: bookstore
      version: v2
EOF

Создание модулей pod, служб и учетных записей служб

Мы используем один файл манифеста, содержащий изменения, рассмотренные ранее в пошаговом руководстве по развертыванию , bookthiefи bookstorebookwarehousemysql приложений.bookbuyer

kubectl apply -f - <<EOF
##################################################################################################
# bookbuyer service
##################################################################################################
---
# Create bookbuyer Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookbuyer
  namespace: bookbuyer
---
# Create bookbuyer Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookbuyer
  namespace: bookbuyer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookbuyer
      version: v1
  template:
    metadata:
      labels:
        app: bookbuyer
        version: v1
    spec:
      serviceAccountName: bookbuyer
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookbuyer
          image: openservicemesh/bookbuyer:latest-main
          imagePullPolicy: Always
          command: ["/bookbuyer"]
          env:
            - name: "BOOKSTORE_NAMESPACE"
              value: bookstore
            - name: "BOOKSTORE_SVC"
              value: bookstore
---
##################################################################################################
# bookthief service
##################################################################################################
---
# Create bookthief ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookthief
  namespace: bookthief
---
# Create bookthief Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookthief
  namespace: bookthief
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookthief
  template:
    metadata:
      labels:
        app: bookthief
        version: v1
    spec:
      serviceAccountName: bookthief
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookthief
          image: openservicemesh/bookthief:latest-main
          imagePullPolicy: Always
          command: ["/bookthief"]
          env:
            - name: "BOOKSTORE_NAMESPACE"
              value: bookstore
            - name: "BOOKSTORE_SVC"
              value: bookstore
            - name: "BOOKTHIEF_EXPECTED_RESPONSE_CODE"
              value: "503"
---
##################################################################################################
# bookstore service version 1 & 2
##################################################################################################
---
# Create bookstore Service
apiVersion: v1
kind: Service
metadata:
  name: bookstore
  namespace: bookstore
  labels:
    app: bookstore
spec:
  ports:
    - port: 14001
      name: bookstore-port
  selector:
    app: bookstore

---
# Create bookstore Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookstore
  namespace: bookstore

---
# Create bookstore-v1 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookstore-v1
  namespace: bookstore
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookstore
      version: v1
  template:
    metadata:
      labels:
        app: bookstore
        version: v1
    spec:
      serviceAccountName: bookstore
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookstore
          image: openservicemesh/bookstore:latest-main
          imagePullPolicy: Always
          ports:
            - containerPort: 14001
              name: web
          command: ["/bookstore"]
          args: ["--port", "14001"]
          env:
            - name: BOOKWAREHOUSE_NAMESPACE
              value: bookwarehouse
            - name: IDENTITY
              value: bookstore-v1

---
# Create bookstore-v2 Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookstore-v2
  namespace: bookstore
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookstore
      version: v2
  template:
    metadata:
      labels:
        app: bookstore
        version: v2
    spec:
      serviceAccountName: bookstore
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookstore
          image: openservicemesh/bookstore:latest-main
          imagePullPolicy: Always
          ports:
            - containerPort: 14001
              name: web
          command: ["/bookstore"]
          args: ["--port", "14001"]
          env:
            - name: BOOKWAREHOUSE_NAMESPACE
              value: bookwarehouse
            - name: IDENTITY
              value: bookstore-v2
---
##################################################################################################
# bookwarehouse service
##################################################################################################
---
# Create bookwarehouse Service Account
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
---
# Create bookwarehouse Service
apiVersion: v1
kind: Service
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
  labels:
    app: bookwarehouse
spec:
  ports:
  - port: 14001
    name: bookwarehouse-port
  selector:
    app: bookwarehouse
---
# Create bookwarehouse Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
spec:
  replicas: 1
  selector:
    matchLabels:
      app: bookwarehouse
  template:
    metadata:
      labels:
        app: bookwarehouse
        version: v1
    spec:
      serviceAccountName: bookwarehouse
      nodeSelector:
        kubernetes.io/arch: amd64
        kubernetes.io/os: linux
      containers:
        - name: bookwarehouse
          image: openservicemesh/bookwarehouse:latest-main
          imagePullPolicy: Always
          command: ["/bookwarehouse"]
##################################################################################################
# mysql service
##################################################################################################
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mysql
  namespace: bookwarehouse
---
apiVersion: v1
kind: Service
metadata:
  name: mysqldb
  labels:
    app: mysqldb
    service: mysqldb
spec:
  ports:
    - port: 3306
      name: tcp
  selector:
    app: mysqldb
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
  namespace: bookwarehouse
spec:
  serviceName: mysql
  replicas: 1
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      serviceAccountName: mysql
      nodeSelector:
        kubernetes.io/os: linux
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          value: mypassword
        - name: MYSQL_DATABASE
          value: booksdemo
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - mountPath: /mysql-data
          name: data
        readinessProbe:
          tcpSocket:
            port: 3306
          initialDelaySeconds: 15
          periodSeconds: 10
      volumes:
        - name: data
          emptyDir: {}
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 250M
EOF

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

kubectl get pods,deployments,serviceaccounts -n bookbuyer
kubectl get pods,deployments,serviceaccounts -n bookthief

kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookstore
kubectl get pods,deployments,serviceaccounts,services,endpoints -n bookwarehouse

Просмотр пользовательских интерфейсов приложений

Как и в исходном пошаговом руководстве OSM, если у вас есть клонирование репозитория OSM, вы можете использовать скрипты перенаправления портов для просмотра пользовательских интерфейсов каждого приложения здесь. Сейчас мы обеспокоены только просмотром и bookthief пользовательским интерфейсомbookbuyer.

cp .env.example .env
bash <<EOF
./scripts/port-forward-bookbuyer-ui.sh &
./scripts/port-forward-bookthief-ui.sh &
wait
EOF

В браузере откройте следующие URL-адреса:

http://localhost:8080 - bookbuyer

http://localhost:8083 - bookthief

Настройка политик трафика Istio

Чтобы обеспечить непрерывность работы с исходной пошаговой инструкцией OSM Bookstore для перевода в Istio, мы обсудим режим постоянной политики трафика OSM. Режим политики трафика OSM является концепцией разрешения или запрета трафика в сетке без какого-либо конкретного правила SMI- контроль доступа. Существует неизрешительная конфигурация режима трафика, позволяющая пользователям подключить приложения в сетку, получая шифрование mTLS, не требуя явных правил, позволяющих приложениям в сетке взаимодействовать. Функция разрешительного режима трафика заключалась в том, чтобы избежать нарушения связи приложения сразу после его управления OSM и предоставить время для определения правил, обеспечивая шифрование mTLS приложений. Этот параметр можно задать или truefalse с помощью MeshConfig OSM.

Istio обрабатывает применение mTLS по-другому. В отличие от OSM, режим разрешительного режима Istio автоматически настраивает прокси-серверы на стороне для использования mTLS, но позволяет службе принимать как обычный текст, так и трафик mTLS. Эквивалентной конфигурации режима осМ является использование параметров Istio PeerAuthentication . PeerAuthentication можно выполнить детализированно в пространстве имен или для всей сетки. Дополнительные сведения о применении MTLS Istio см. в статье о миграции Istio Mutual TLS.

Принудительное применение строгого режима Istio в пространствах имен Bookstore

Важно помнить, что так же, как и в разрешительном режиме OSM, конфигурация Istio PeerAuthentication связана только с использованием принудительного применения MTLS. Фактические политики уровня 7, как и те, которые используются в HTTPRouteGroups OSM, обрабатываются с помощью конфигураций AuthorizationPolicy Istio, которые отображаются далее в пошаговом руководстве.

Мы тщательно помещаем bookbuyerпространства имен , bookstorebookthiefи bookwarehouse пространства имен в строгом режиме MTLS Istio.

kubectl apply -f - <<EOF
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookbuyer
  namespace: bookbuyer
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookthief
  namespace: bookthief
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookstore
  namespace: bookstore
spec:
  mtls:
    mode: STRICT
---
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
  name: bookwarehouse
  namespace: bookwarehouse
spec:
  mtls:
    mode: STRICT
EOF

Развертывание политик контроль доступа Istio

Как и ресурсы SMI трафика OSM и спецификации трафика SMI для определения политик управления доступом и маршрутизации для приложений, Istio выполняет эти аналогичные точные элементы управления с помощью AuthorizationPolicy конфигураций.

Давайте рассмотрим преобразование политики TrafficTarget книжного магазина, которая, в частности, позволяет bookbuyer взаимодействовать с ним, только с определенным путем уровня 7, заголовками и методами. Ниже приведена часть манифеста traffic-access-v1.yaml .

kind: TrafficTarget
apiVersion: access.smi-spec.io/v1alpha3
metadata:
  name: bookstore
  namespace: bookstore
spec:
  destination:
    kind: ServiceAccount
    name: bookstore
    namespace: bookstore
  rules:
    - kind: HTTPRouteGroup
      name: bookstore-service-routes
      matches:
        - buy-a-book
        - books-bought
  sources:
    - kind: ServiceAccount
      name: bookbuyer
      namespace: bookbuyer
---
apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
  name: bookstore-service-routes
  namespace: bookstore
spec:
  matches:
    - name: books-bought
      pathRegex: /books-bought
      methods:
        - GET
      headers:
        - "user-agent": ".*-http-client/*.*"
        - "client-app": "bookbuyer"
    - name: buy-a-book
      pathRegex: ".*a-book.*new"
      methods:
        - GET

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

apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: bookstore
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]

В Istio AuthorizationPolicyвы заметите, как целевая служба политики OSM TrafficTarget сопоставляется с меткой селектора и пространство имен, в котором находится служба. Исходная служба отображается в разделе правил, где есть атрибут source/principles, который сопоставляется с именем учетной записи службы для bookbuyer службы.

Помимо конфигурации источника или назначения в OSM TrafficTarget, OSM привязывает использование HTTPRouteGroup для дальнейшего определения авторизации уровня 7, к источнику имеется доступ. Мы видим только часть HTTPRouteGroup ниже. Существует два matches параметра для разрешенной исходной службы.

apiVersion: specs.smi-spec.io/v1alpha4
kind: HTTPRouteGroup
metadata:
  name: bookstore-service-routes
  namespace: bookstore
spec:
  matches:
    - name: books-bought
      pathRegex: /books-bought
      methods:
        - GET
      headers:
        - "user-agent": ".*-http-client/*.*"
        - "client-app": "bookbuyer"
    - name: buy-a-book
      pathRegex: ".*a-book.*new"
      methods:
        - GET

match Существует именованное имяbooks-bought, позволяющее источнику получить доступ к пути /books-bought с помощью GET метода с данными пользователя-агента заголовка узла и клиентским приложением, а buy-a-book также совпадение, которое использует regex express для пути, .*a-book.*new содержащего методGET.

Эти конфигурации OSM HTTPRouteGroup можно определить в разделе правил Istio AuthorizationPolicy , показанном ниже:

apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]
        - source:
            namespaces: ["bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]

Теперь мы можем развернуть перенесенный манифест OSM traffic-access-v1.yaml, как показано ниже. AuthorizationPolicy Нет для bookthief, поэтому пользовательский интерфейс bookthief должен остановить добавочные книги из книжного магазина версии 1:

kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer"]
        - source:
            namespaces: ["bookbuyer"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "bookwarehouse"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: bookwarehouse
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookstore/sa/bookstore"]
        - source:
            namespaces: ["bookstore"]
      to:
        - operation:
            methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "mysql"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: mysql
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookwarehouse/sa/bookwarehouse"]
        - source:
            namespaces: ["bookwarehouse"]
      to:
         - operation:
            ports: ["3306"]
EOF

Разрешение приложению Bookthief получить доступ к Bookstore

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

kubectl apply -f - <<EOF
##################################################################################################
# bookstore policy
##################################################################################################
apiVersion: "security.istio.io/v1beta1"
kind: "AuthorizationPolicy"
metadata:
  name: "bookstore"
  namespace: bookstore
spec:
  selector:
    matchLabels:
      app: bookstore
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookbuyer/sa/bookbuyer", "cluster.local/ns/bookthief/sa/bookthief"]
        - source:
            namespaces: ["bookbuyer", "bookthief"]
      to:
        - operation:
            methods: ["GET"]
            paths: ["*/books-bought", "*/buy-a-book/new"]
    - when:
        - key: request.headers[User-Agent]
          values: ["*-http-client/*"]
        - key: request.headers[Client-App]
          values: ["bookbuyer"]
---
##################################################################################################
# bookwarehouse policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "bookwarehouse"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: bookwarehouse
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookstore/sa/bookstore"]
        - source:
            namespaces: ["bookstore"]
      to:
        - operation:
            methods: ["POST"]
---
##################################################################################################
# mysql policy
##################################################################################################
apiVersion: security.istio.io/v1beta1
kind: AuthorizationPolicy
metadata:
  name: "mysql"
  namespace: bookwarehouse
spec:
  selector:
    matchLabels:
      app: mysql
  action: ALLOW
  rules:
    - from:
        - source:
            principals: ["cluster.local/ns/bookwarehouse/sa/bookwarehouse"]
        - source:
            namespaces: ["bookwarehouse"]
      to:
         - operation:
            ports: ["3306"]
EOF

Пользовательский интерфейс bookthief теперь должен увеличивать книги из книжного магазина версии 1.

Настройка смены трафика между двумя версиями службы

Чтобы продемонстрировать, как сбалансировать трафик между двумя версиями службы Kubernetes, известной как перемещение трафика в Istio. Как вы помните в предыдущем разделе, реализация смены трафика OSM зависит от двух разных служб, развертываемых и добавляя эти имена служб в конфигурацию серверной TrafficTarget части политики. Эта архитектура развертывания не требуется для того, как Istio реализует смену трафика. С помощью Istio можно создать несколько развертываний, представляющих каждую версию приложения-службы и переместив трафик на эти определенные версии с помощью конфигурации Istio virtualservice .

В настоящее время развернуто virtualservice только правило маршрутизации для версии 1 книжного магазина, показанное ниже:

spec:
  hosts:
    - bookstore
  http:
    - route:
        - destination:
            host: bookstore
            subset: v1

Мы обновляем virtualservice 100% веса до версии 2 книжного магазина.

kubectl apply -f - <<EOF
# Create bookstore virtual service
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: bookstore-virtualservice
  namespace: bookstore
spec:
  hosts:
  - bookstore
  http:
  - route:
    - destination:
        host: bookstore
        subset: v1
      weight: 0
    - destination:
        host: bookstore
        subset: v2
      weight: 100
EOF

Теперь вы увидите как добавочную, так bookbuyer и bookthief пользовательский интерфейс только для bookstore службы версии 2. Вы можете продолжать экспериментировать, изменив weigth атрибут для перемещения трафика между двумя bookstore версиями.

Итоги

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