Migrationsleitfaden für OSM-Konfigurationen (Open Service Mesh) in Istio

Wichtig

Dieser Artikel soll ein einfaches Verständnis dafür vermitteln, wie OSM-Konfigurationen identifiziert und in äquivalente Istio-Konfigurationen für die Migration von Workloads von OSM zu Istio übersetzt werden können. Hierbei handelt es sich keineswegs um eine ausführliche Anleitung.

Dieser Artikel enthält praktische Anleitungen für die Zuordnung von OSM-Richtlinien zu den Istio-Richtlinien, um Ihre von OSM verwalteten Bereitstellungen von Microservices so zu migrieren, um von Istio verwaltet zu werden. Die OSM Bookstore-Beispielanwendung wird als Basisreferenz für aktuelle OSM-Benutzer verwendet. Die folgende exemplarische Vorgehensweise stellt die Bookstore-Anwendung bereit. Es werden dieselben Schritte ausgeführt, und es wird erläutert, wie die OSM SMI-Datenverkehrsrichtlinien mithilfe des Istio-Äquivalents angewendet werden.

Wenn Sie OSM nicht verwenden und noch nicht mit Istio vertraut sind, beginnen Sie mit dem Istio-Leitfaden für erste Schritte, um zu erfahren, wie Sie das Istio-Dienstgitter für Ihre Anwendungen verwenden können. Wenn Sie derzeit OSM verwenden, stellen Sie sicher, dass Sie mit der exemplarischen Vorgehensweise zur OSM Bookstore-Beispielanwendung zum Konfigurieren von OMS-Datenverkehrsrichtlinien vertraut sind. Die folgende exemplarische Vorgehensweise ist kein Duplikat der aktuellen Dokumentation und verweist gegebenenfalls auf bestimmte Themen. Bevor Sie fortfahren, sollten Sie sich mit der Bookstore-Anwendungsarchitektur vertraut machen.

Voraussetzungen

  • Ein Azure-Abonnement. Falls Sie über kein Azure-Abonnement verfügen, können Sie ein kostenloses Konto erstellen.
  • Die Azure CLI muss installiert sein.
  • Das OSM AKS-Add-On wird im AKS-Cluster deinstalliert.
  • Alle vorhandenen OSM Bookstore-Anwendungen, einschließlich Namespaces, werden deinstalliert und aus dem Cluster gelöscht.
  • Installieren des Istio AKS Service Mesh-Add-On

Erforderliche Änderungen an der OSM Bookstore-Beispielanwendung

Damit Istio die OSM Bookstore-Anwendung verwalten kann, sind einige Änderungen an den vorhandenen Manifesten erforderlich. Diese Änderungen betreffen den Bookstore und die MySQL-Dienste.

Bookstore-Änderungen

In der exemplarischen Vorgehensweise für OSM Bookstore wird der Bookstore-Dienst zusammen mit einem anderen Bookstore-v2-Dienst bereitgestellt, um zu veranschaulichen, wie OSM das Verschieben des Datenverkehrs ermöglicht. Mit diesen bereitgestellten Diensten konnten der Clientdatenverkehr (bookbuyer) auf mehrere Dienstendpunkte aufgeteilt werden. Das erste neue Konzept beinhaltet, wie Istio mit dem umgeht, was als Verschieben des Datenverkehrs bezeichnet wird.

Die OSM-Implementierung für das Verschieben des Datenverkehrs basiert auf der Spezifikation für SMI-Datenverkehrsaufteilung. Die SMI-Datenverkehrsaufteilung erfordert das Vorhandensein mehrerer Dienste der obersten Ebene, die als Back-Ends mit der gewünschten Gewichtungsmetrik hinzugefügt werden, um Clientanforderungen von einem Dienst zu einem anderen zu verschieben. Istio führt das Verschieben des Datenverkehrs mithilfe einer Kombination aus einem virtuellen Dienst und einer Zielregel aus. Es wird dringend empfohlen, sich mit den Konzepten eines virtuellen Diensts und einer Zielregel vertraut zu machen.

Einfach ausgedrückt: Der virtuelle Dienst von Istio definiert Routingregeln für Clients, die den Host anfordern (Dienstname). Mit virtuellen Diensten können mehrere Versionen einer Bereitstellung einem Hostnamen des virtuellen Diensts zugeordnet werden, um Clients als Ziel zu verwenden. Für denselben Dienst können mehrere Bereitstellungen mit Bezeichnungen versehen werden, die verschiedene Versionen der Anwendung hinter demselben Hostnamen darstellen. Der virtuelle Dienst von Istio kann dann so konfiguriert werden, dass die Anforderung für eine bestimmte Version des Diensts gewichtet wird. Die verfügbaren Versionen des Diensts sind für die Verwendung des subsets-Attributs in einer Istio-Zielregel konfiguriert.

Durch die Änderung am Bookstore-Dienst und der Bereitstellung für Istio entfällt die Notwendigkeit, einen expliziten zweiten Dienst als Ziel zu verwenden, der für die SMI-Datenverkehrsaufteilung erforderlich ist. Es ist auch kein anderes Dienstkonto für den Bookstore v2-Dienst notwendig, da es unter dem Bookstore-Dienst konsolidiert werden soll. Die ursprüngliche Änderung des Manifests von OSM traffic-access-v1.yaml an Istio für den Bookstore v1 und v2 ist im nachstehenden Abschnitt Erstellen von Pods, Diensten und Dienstkonten aufgeführt. Es ist veranschaulicht, wie die Datenverkehrsaufteilung durchgeführt wird, die später in der exemplarischen Vorgehensweise als Verschieben des Datenverkehrs bezeichnet wird:

MySql-Änderungen

Änderungen am MySql-StatefulSet sind nur in der Dienstkonfiguration erforderlich. Gemäß der Dienstspezifikation benötigte OSM die targetPort- und appProtocol- Attribute. Diese Attribute sind für Istio nicht erforderlich. Der aktualisierte Dienst für MySqldb sieht wie folgt aus:

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

Bereitstellen der geänderten Bookstore-Anwendung

Ähnlich wie bei der exemplarischen Vorgehensweise für OSM Bookstore beginnen wir mit der neuen Installation der Bookstore-Anwendung.

Erstellen der Namespaces

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

Hinzufügen einer Namespace-Bezeichnung für Istio Sidecar-Injection

Für OSM wurden mithilfe des Befehls osm namespace add <namespace> die erforderlichen Anmerkungen zum Namespace für den OSM-Controller erstellt, um die automatische Sidecar-Injection hinzuzufügen. Mit Istio müssen Sie nur einen Namespace bezeichnen, damit der Istio-Controller angewiesen wird, die Envoy-Sidecar-Proxys automatisch einzufügen.

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

Bereitstellen des virtuellen Diensts und der Zielregel für Bookstore von Istio

Wie bereits im Abschnitt „Bookstore-Änderungen“ erwähnt, verarbeitet Istio das Verschieben des Datenverkehrs mithilfe eines VirtualService-Gewichtungsattributs, das später in der exemplarischen Vorgehensweise konfiguriert wird. Wir stellen den virtuellen Dienst und die Zielregel für den Bookstore-Dienst bereit. Wir stellen nur die Bookstore Version 1 bereit, obwohl die Bookstore Version 2 bereitgestellt wird. Der virtuelle Dienst von Istio stellt nur eine Route zur Version 1 von Bookstore bereit. Anders als beim Verschieben des Datenverkehrs (Datenverkehrsaufteilung) hat OSM für die Anwendung mit Bookstore Version 2 einen weiteren Dienst bereitgestellt. OSM musste den Datenverkehr so einrichten, dass er mithilfe eines TrafficSplit zwischen den Clientanforderungen aufgeteilt werden konnte. Bei Verwendung von Verschieben des Datenverkehrs mit Istio können wir auf das Verschieben des Datenverkehrs auf mehrere Kubernetes-Anwendungsbereitstellungen (Versionen) verweisen, die für denselben Dienst bezeichnet sind.

In diesem Walk-obwohl wird die Bereitstellung beider Bookstore-Versionen (v1 & v2) gleichzeitig bereitgestellt. Nur die Version 1 ist aufgrund der Konfiguration des virtuellen Diensts erreichbar. Es ist nicht notwendig, einen weiteren Dienst für Bookstore Version 2 bereitzustellen. Wir aktivieren später eine Route zu Bookstore Version 2, wenn wir den virtuellen Dienst von Bookstore aktualisieren und das erforderliche Gewichtungsattribut für das Verschieben des Datenverkehrs bereitstellen.

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

Erstellen von Pods, Diensten und Dienstkonten

Wir verwenden eine einzelne Manifestdatei, die die zuvor in der exemplarische Vorgehensweise erläuterten Änderungen enthält, um die Anwendungen bookbuyer, bookthief, bookstore, bookwarehouse und mysql bereitzustellen.

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

Führen Sie die folgenden Befehle aus, um diese Ressourcen in Ihrem Cluster anzuzeigen:

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

Anzeigen der Anwendungsbenutzeroberflächen

Ähnlich wie bei der ursprünglichen exemplarischen Vorgehensweise für OSM können Sie, wenn Sie das OSM-Repository geklont haben, die Portweiterleitungsskripts verwenden, um die Benutzeroberflächen jeder Anwendung hier anzuzeigen. Derzeit geht es nur darum, die Benutzeroberfläche bookbuyer und bookthief anzuzeigen.

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

Öffnen Sie in einem Browser die folgenden URLs:

http://localhost:8080 – Bookbuyer

http://localhost:8083 – Bookthief

Konfigurieren der Datenverkehrsrichtlinien von Istio

Um die Kontinuität mit der ursprünglichen exemplarischen Vorgehensweise für OSM Bookstore für die Übersetzung in Istio zu gewährleisten, wird der permissive Datenverkehrsrichtlinienmodus von OSM erläutert. Der permissive Datenverkehrsrichtlinienmodus von OSM war ein Konzept, das den Datenverkehr im Gittermodell zuließ oder verweigerte, ohne dass eine bestimmte Regel für SMI Datenverkehr-Zugriffssteuerung bereitgestellt wurde. Die Konfiguration des permissiven Datenverkehrsmodus diente dazu, Benutzern das Einbinden von Anwendungen in das Gittermodell zu ermöglichen und gleichzeitig eine mTLS-Verschlüsselung zu erreichen, ohne dass explizite Regeln für die Kommunikation von Anwendungen im Gittermodell erforderlich sind. Die Funktion „Permissiver Datenverkehrsmodus“ sollte verhindern, dass die Kommunikation Ihrer Anwendung unterbrochen wird, sobald OSM sie verwaltet hat, und Ihnen Zeit geben, Ihre Regeln zu definieren, während sichergestellt wird, dass die Anwendungskommunikation mTLS-verschlüsselt ist. Diese Einstellung kann auf true oder false über die MeshConfig von OSM festgelegt werden.

Istio behandelt die mTLS-Erzwingung anders. Anders als OSM konfiguriert der permissive Modus von Istio automatisch Sidecar-Proxys für die Verwendung von mTLS, ermöglicht es dem Dienst jedoch, sowohl Klartext- als auch MTLS-Datenverkehr zu akzeptieren. Das Äquivalent zur Konfiguration des permissiven Modus von OSM ist die Verwendung der PeerAuthentication-Einstellungen von Istio. PeerAuthentication kann im Namespace oder für das gesamte Gittermodell präzise ausgeführt werden. Weitere Informationen zur Erzwingung von mTLS durch Istio finden Sie im Artikel „Istio Mutual TLS Migration“.

Erzwingen des Strict-Modus von Istio für Bookstore-Namespaces

Es ist wichtig zu beachten, dass sich die PeerAuthentication-Konfiguration von Istio, genau wie der permissive Modus von OSM, nur auf die Verwendung der mTLS-Erzwingung bezieht. Tatsächliche Layer-7-Richtlinien, wie sie in den HTTPRouteGroups von OSM verwendet werden, werden mithilfe der AuthorizationPolicy-Konfigurationen von Istio verarbeitet, die später in der exemplarischen Vorgehensweise zu sehen sind.

Wir versetzen die Namespaces bookbuyer, bookthief, bookstore und bookwarehouse präzise in den mTLS-Strict-Modus von 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

Bereitstellen der Access Control-Richtlinien von Istio

Ähnlich wie die OSM-Ressourcen SMI Traffic Target und SMI Traffic Specs zur Definition von Zugriffssteuerungs- und Routingrichtlinien für die zu kommunizierenden Anwendungen erreicht Istio diese ähnlichen detaillierten Steuerelemente mithilfe der AuthorizationPolicy-Konfigurationen.

Lassen Sie uns die Übersetzung der TrafficTarget-Richtlinie von Bookstore durchgehen, die insbesondere bookbuyer die Kommunikation ermöglicht, und zwar nur mit bestimmten Layer-7-Pfaden, Headern und Methoden. Im Folgenden ist ein Teil des Manifests traffic-access-v1.yaml zu sehen.

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

Laut TrafficTarget-Richtlinie können Sie in der Spezifikation explizit definieren, welcher Quelldienst mit einem Zieldienst kommunizieren kann. Wie lassen also zu, dass die Quelle bookbuyer für die Kommunikation mit dem Ziel-Bookstore autorisiert wird. Wenn wir die Dienst-zu-Dienst-Autorisierung von einer OSM TrafficTarget-Konfiguration in ein Istio AuthorizationPolicy übersetzen, sieht dies wie folgt aus:

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"]

Im AuthorizationPolicy von Istio ist zu sehen, wie der OSM TrafficTarget-Richtlinien-Zieldienst der Übereinstimmung der Selektorbezeichnung und dem Namespace, in dem sich der Dienst befindet, zugeordnet ist. Der Quelldienst wird im Abschnitt „Regeln“ dargestellt, in dem ein Quell-/Prinzipien-Attribut vorhanden ist, das dem Dienstkontonamen für den bookbuyer-Dienst zugeordnet ist.

Zusätzlich zur reinen Quell-/Zielkonfiguration im OSM TrafficTarget bindet OSM die Verwendung einer HTTPRouteGroup, um die Layer-7-Autorisierung, auf die die Quelle Zugriff hat, weiter zu definieren. Wir können nur den Teil der HTTPRouteGroup unten sehen. Für den zulässigen Quelldienst gibt es zwei 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

Es gibt einen match mit dem Namen books-bought, der der Quelle den Zugriff auf den Pfad /books-bought mithilfe einer GET-Methode mit Benutzer-Agent- und Client-App-Informationen des Hostheaders ermöglicht, und eine buy-a-book-Übereinstimmung, die einen regex express für einen Pfad mit .*a-book.*new mithilfe einer GET-Methode verwendet.

Diese OSM-HTTPRouteGroup-Konfigurationen können im Abschnitt „Regeln“ des unten gezeigten Istio AuthorizationPolicy definiert werden:

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"]

Wir können jetzt das von OSM migrierte Manifest traffic-access-v1.yaml so bereitstellen, wie es von Istio unten verstanden wird. Es gibt kein AuthorizationPolicy für die Bookthief, daher sollte die Bookthief-Benutzeroberfläche das Inkrementieren von Büchern aus Bookstore v1 beenden:

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-Anwendung kann auf Bookstore zugreifen

Derzeit gibt es keine AuthorizationPolicy, die es dem Bookthief ermöglicht, mit Bookstore zu kommunizieren. Wir können folgende AuthorizationPolicy bereitstellen, damit der Bookthief mit Bookstore kommunizieren kann. Sie sehen den Zusatz für die Regel für die Bookstore-Richtlinie, die die Bookthief-Autorisierung zulässt.

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

Die Bookthief-Benutzeroberfläche sollte jetzt Bücher aus Bookstore v1 inkrementieren.

Konfigurieren des Verschiebens des Datenverkehrs zwischen zwei Dienstversionen

Um zu veranschaulichen, wie Datenverkehr zwischen zwei Versionen eines Kubernetes-Diensts ausgeglichen wird, was in Istio als Verschieben des Datenverkehrs bezeichnet wird. Wie Sie sich in einem vorherigen Abschnitt beschrieben, stützte sich die OSM-Implementierung für das Verschieben des Datenverkehrs darauf, dass zwei verschiedene Dienste bereitgestellt und diese Dienstnamen zur Back-End-Konfiguration der TrafficTarget-Richtlinie hinzugefügt wurden. Diese Bereitstellungsarchitektur ist für die Implementierung für das Verschieben von Datenverkehr durch Istio nicht erforderlich. Mit Istio können mehrere Bereitstellungen erstellt werden, die jede Version der Dienstanwendung darstellen, und Datenverkehr über die virtualservice-Konfiguration von Istio an diese spezifischen Versionen verschieben.

Die derzeit bereitgestellte virtualservice verfügt nur über eine Routenregel für die unten dargestellte v1-Version von Bookstore:

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

Wir aktualisieren virtualservice, um 100 % der Gewichtung auf die v2-Version von Bookstore zu verschieben.

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

Jetzt sollten Sie sehen, dass sowohl die Benutzerfläche bookbuyer als auch bookthief nur für den bookstore v2-Dienst inkrementiert werden. Sie können weiter experimentieren, indem Sie das weigth-Attribut ändern, um den Datenverkehr zwischen den beiden bookstore-Versionen zu verschieben.

Zusammenfassung

Wir hoffen, dass wir Ihnen mit dieser exemplarischen Vorgehensweise zeigen konnten, wie Sie Ihre aktuellen OSM-Richtlinien zu Istio-Richtlinien migrieren können. Lesen Sie sorgfältig die Konzepte von Istio, und sehen Sie sich den Istio-Leitfaden für erste Schritte an, um zu erfahren, wie Sie das Dienst-Gittermodel von Istio für die Verwaltung Ihrer Anwendungen verwenden können.