Delen via


Migratierichtlijnen voor OsM-configuraties (Open Service Mesh) naar Istio

Belangrijk

Dit artikel is bedoeld om een simplistisch begrip te bieden van het identificeren van OSM-configuraties en deze te vertalen naar equivalente Istio-configuraties voor het migreren van workloads van OSM naar Istio. Dit wordt in geen enkel verband beschouwd als een uitgebreide gedetailleerde handleiding.

Dit artikel bevat praktische richtlijnen voor het toewijzen van OSM-beleid aan het Istio-beleid om te helpen bij het migreren van uw microservicesimplementaties die worden beheerd door OSM naar worden beheerd door Istio. We gebruiken de OSM Bookstore-voorbeeldtoepassing als basisverwijzing voor huidige OSM-gebruikers. In de volgende procedure wordt de Bookstore-toepassing geïmplementeerd. Dezelfde stappen worden gevolgd en uitgelegd hoe u het OSM SMI-verkeersbeleid toepast met behulp van het Istio-equivalent.

Als u osm niet gebruikt en nog niet in Istio werkt, begint u met de eigen introductiehandleiding van Istio om te leren hoe u de Istio-service-mesh voor uw toepassingen gebruikt. Als u momenteel OSM gebruikt, moet u ervoor zorgen dat u bekend bent met de voorbeeldtoepassing OSM Bookstore over de wijze waarop OSM verkeersbeleid configureert. In het volgende overzicht wordt de huidige documentatie niet gedupliceerd en wordt verwezen naar specifieke onderwerpen wanneer dit relevant is. U moet vertrouwd en volledig op de hoogte zijn van de architectuur van de bookstore-toepassing voordat u doorgaat.

Vereisten

Wijzigingen die nodig zijn voor de OSM Sample Bookstore-toepassing

Om Ervoor te zorgen dat Istio de OSM-boekstoretoepassing kan beheren, zijn er een aantal wijzigingen nodig in de bestaande manifesten. Deze wijzigingen zijn bij de bookstore en de mysql-services.

Wijzigingen in boekhandel

In het overzicht van de OSM Bookstore wordt de bookstore-service samen met een andere bookstore-v2-service geïmplementeerd om te laten zien hoe OSM verkeer verschuift. Met deze geïmplementeerde services kunt u het clientverkeer (bookbuyer) splitsen tussen meerdere service-eindpunten. Het eerste nieuwe concept om te begrijpen hoe Istio omgaat met wat ze noemen als Traffic Shifting.

OSM-implementatie van verkeerverschuiving is gebaseerd op de SMI Traffic Split-specificatie. De SMI Traffic Split-specificatie vereist het bestaan van meerdere services op het hoogste niveau die worden toegevoegd als back-ends met de gewenste gewichtsmetriek om clientaanvragen van de ene service naar de andere te verplaatsen. Istio voert verkeerverschuifing uit met behulp van een combinatie van een virtuele service en een doelregel. Het wordt ten zeerste aanbevolen om vertrouwd te raken met zowel de concepten van een virtuele service als de doelregel.

Eenvoudig gezegd definieert de virtuele Istio-service routeringsregels voor clients die de host (servicenaam) aanvragen. Met Virtual Services kunnen meerdere versies van een implementatie worden gekoppeld aan één hostnaam van een virtuele service, zodat clients zich kunnen richten. Meerdere implementaties kunnen worden gelabeld voor dezelfde service, die verschillende versies van de toepassing achter dezelfde hostnaam vertegenwoordigen. De virtuele Istio-service kan vervolgens worden geconfigureerd om de aanvraag te wegen naar een specifieke versie van de service. De beschikbare versies van de service zijn geconfigureerd voor het gebruik van het subsets kenmerk in een Istio-doelregel.

De wijziging van de bookstore-service en -implementatie voor Istio verwijdert de noodzaak om een expliciete tweede service te hebben die moet worden gericht op de SMI-verkeerssplitsing. Er is ook geen ander serviceaccount nodig voor de bookstore v2-service, omdat het moet worden geconsolideerd onder de bookstore-service. Het oorspronkelijke OSM traffic-access-v1.yaml-manifest wordt gewijzigd in Istio voor zowel de bookstore v1 als v2 in de onderstaande sectie Pods, Services en ServiceAccounts maken. We laten zien hoe we verkeer splitsen, ook wel verkeer verschuiven later in het overzicht:

MySql-wijzigingen

Wijzigingen in de stateful set mysql zijn alleen nodig in de serviceconfiguratie. Onder de servicespecificatie had OSM de targetPort en appProtocol kenmerken nodig. Deze kenmerken zijn niet nodig voor Istio. De volgende bijgewerkte service voor mysqldb ziet er als volgt uit:

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

De gewijzigde bookstoretoepassing implementeren

Net als bij de walk-through van de OSM Bookstore beginnen we met een nieuwe installatie van de bookstore-toepassing.

De naamruimten maken

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

Een naamruimtelabel toevoegen voor Istio sidecar-injectie

Voor OSM hebt u met behulp van de opdracht osm namespace add <namespace> de benodigde aantekeningen gemaakt voor de naamruimte voor de OSM-controller om automatische sidecar-injectie toe te voegen. Met Istio hoeft u alleen maar een naamruimte te labelen zodat de Istio-controller kan worden geïnstrueerd om automatisch de sidecarproxy's van Envoy te injecteren.

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

De virtuele Istio-service- en doelregel implementeren voor bookstore

Zoals eerder vermeld in de sectie Bookstore Modification, verwerkt Istio verkeersverschuiving met behulp van een kenmerk voor het gewicht van virtualservice dat we later in het overzicht configureren. We implementeren de virtuele service en doelregel voor de bookstore-service. We implementeren alleen de boekwinkel versie 1, ook al wordt de bookstore versie 2 geïmplementeerd. De virtuele Istio-service levert alleen een route naar de versie 1 van de boekhandel. Afgezien van de manier waarop OSM verkeer verschuift (verkeer splitsen), heeft OSM een andere service geïmplementeerd voor de bookstore versie 2-toepassing. OSM moest verkeer instellen dat moet worden gesplitst tussen clientaanvragen met behulp van een TrafficSplit. Wanneer u verkeer verplaatst met Istio, kunnen we verwijzen naar het verplaatsen van verkeer naar meerdere Kubernetes-toepassingsimplementaties (versies) die zijn gelabeld voor dezelfde service.

In deze walk-though wordt de implementatie van beide boekstoreversies (v1 & v2) tegelijkertijd geïmplementeerd. Alleen versie 1 is bereikbaar vanwege de configuratie van de virtuele service. U hoeft geen andere service te implementeren voor bookstore versie 2, we schakelen later een route naar de bookstore versie 2 in wanneer we de virtuele service van de bookstore bijwerken en het benodigde gewichtskenmerk opgeven om verkeer te verplaatsen.

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

Pods, services en serviceaccounts maken

We gebruiken één manifestbestand dat de wijzigingen bevat die eerder in het overzicht zijn besproken om de bookbuyer, bookthief, bookstore, en mysqlbookwarehousetoepassingen te implementeren.

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

Voer de volgende opdrachten uit om deze resources op uw cluster weer te geven:

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

De toepassings-UIS's weergeven

Net als in het oorspronkelijke OSM-overzicht kunt u, als u de OSM-opslagplaats hebt gekloond, de scripts voor het doorsturen van poorten gebruiken om de UIS's van elke toepassing hier weer te geven. Voorlopig zijn we alleen bezorgd om de gebruikersinterface en bookthief de bookbuyer gebruikersinterface te bekijken.

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

Open in een browser de volgende URL's:

http://localhost:8080 - bookbuyer

http://localhost:8083 - boekdief

Verkeersbeleid van Istio configureren

Om de continuïteit te behouden met de oorspronkelijke walk-through van de OSM Bookstore voor de vertaling naar Istio, bespreken we de permissive Traffic Policy Mode van OSM. De permissieve verkeersbeleidsmodus van OSM was een concept van het toestaan of weigeren van verkeer in de mesh zonder dat er een specifieke SMI-regel voor toegangsbeheer voor verkeer is geïmplementeerd. De configuratie van de missieve verkeersmodus bestond om gebruikers toe te staan toepassingen in de mesh te onboarden, terwijl mTLS-versleuteling wordt opgehaald, zonder dat expliciete regels nodig zijn om toepassingen in de mesh te laten communiceren. De functie voor de missieve verkeersmodus was om te voorkomen dat de communicatie van uw toepassing wordt onderbroken zodra OSM deze heeft beheerd, en om tijd te bieden om uw regels te definiëren en ervoor te zorgen dat toepassingscommunicatie mTLS is versleuteld. Deze instelling kan worden ingesteld op true of false via de MeshConfig van OSM.

Istio verwerkt mTLS-afdwinging anders. Anders dan OSM configureert de permissieve modus van Istio automatisch sidecarproxy's voor het gebruik van mTLS, maar staat de service toe om zowel plaintext- als mTLS-verkeer te accepteren. Het equivalent van de configuratie van de permissieve modus van OSM is het gebruik van de instellingen van PeerAuthentication Istio. PeerAuthentication kan nauwkeurig worden uitgevoerd op de naamruimte of voor de hele mesh. Lees het artikel over wederzijdse TLS-migratie van Istio voor meer informatie over het afdwingen van mTLS.

Istio Strict Mode afdwingen voor bookstore-naamruimten

Het is belangrijk om te onthouden, net zoals de permissieve modus van OSM, is de configuratie van PeerAuthentication Istio alleen gerelateerd aan het gebruik van mTLS-afdwinging. Werkelijke laag-7-beleidsregels, net zoals die worden gebruikt in HTTPRouteGroups van OSM, worden verwerkt met behulp van de AuthorizationPolicy-configuraties van Istio die u later in het overzicht ziet.

We plaatsen de , bookthief, en bookwarehousebookstorenaamruimten gedetailleerd in de bookbuyerstrikte modus van 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-toegangsbeheerbeleid implementeren

Net als bij SMI Traffic Target en SMI Traffic Specs resources van OSM om toegangsbeheer en routeringsbeleid te definiëren voor de toepassingen om te communiceren, voert Istio deze vergelijkbare verfijnde besturingselementen uit met behulp van AuthorizationPolicy configuraties.

Laten we eens kijken naar het vertalen van het traffictarget-beleid van de boekwinkel, waarmee het bookbuyer specifiek kan communiceren, met alleen een bepaald laag-7-pad, -headers en -methoden. Hier volgt een deel van het traffic-access-v1.yaml-manifest .

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

Als u merkt onder het TrafficTarget-beleid, kunt u in de specificatie expliciet definiëren welke bronservice kan communiceren met een doelservice. We kunnen zien dat we toestaan dat de bron bookbuyer kan worden geautoriseerd om te communiceren met de doelboekwinkel. Als we de service-naar-service-autorisatie vertalen van een OSM-configuratie TrafficTarget naar een Istio AuthorizationPolicy, ziet dit er als volgt uit:

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

In de Istio's AuthorizationPolicyziet u hoe de doelservice van het OSM TrafficTarget-beleid is toegewezen aan de selectorlabelovereenkomst en de naamruimte waarin de service zich bevindt. De bronservice wordt weergegeven in de sectie Regels waar een bron-/principeskenmerk is dat is toegewezen aan de naam van het serviceaccount voor de bookbuyer service.

Naast alleen de bron-/doelconfiguratie in osm TrafficTarget verbindt OSM het gebruik van een HTTPRouteGroup om de laag-7-autorisatie waar de bron toegang toe heeft verder te definiëren. We kunnen dit zien in alleen het gedeelte van de HTTPRouteGroup hieronder. Er zijn twee matches voor de toegestane bronservice.

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

Er is een match benoemde naam books-bought waarmee de bron toegang heeft tot het pad /books-bought met behulp van een GET methode met hostheadergebruikersagent- en client-app-informatie en een buy-a-book overeenkomst die gebruikmaakt van een regex-express voor een pad dat een GET methode bevat.*a-book.*new.

We kunnen deze OSM HTTPRouteGroup-configuraties definiëren in de sectie regels van de istio AuthorizationPolicy die hieronder wordt weergegeven:

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

We kunnen nu het osm gemigreerd traffic-access-v1.yaml-manifest implementeren, zoals hieronder wordt begrepen door Istio. Er is geen AuthorizationPolicy voor de bookthief, dus de bookthief-gebruikersinterface moet stoppen met het verhogen van boeken uit de boekwinkel v1:

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

De Bookthief-toepassing toegang geven tot Bookstore

Op dit moment is er geen AuthorizationPolicy mogelijkheid om het boekdief te laten communiceren met de boekwinkel. We kunnen het volgende AuthorizationPolicy implementeren om het boekdief te laten communiceren met de boekhandel. U ziet de toevoeging voor de regel voor het boekwinkelbeleid waarmee de autorisatie van bookthief is toegestaan.

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

De bookthief-gebruikersinterface moet nu boeken uit de boekwinkel v1 verhogen.

Traffic Shifting tussen twee serviceversies configureren

Om te laten zien hoe u verkeer kunt verdelen tussen twee versies van een Kubernetes-service, ook wel verkeer verplaatsen in Istio. Zoals u zich in een vorige sectie herinnert, is osm-implementatie van verkeer die wordt verplaatst afhankelijk van twee afzonderlijke services die worden geïmplementeerd en die servicenamen toevoegen aan de back-endconfiguratie van het TrafficTarget beleid. Deze implementatiearchitectuur is niet nodig voor de wijze waarop Istio verkeer verschuift. Met Istio kunnen we meerdere implementaties maken die elke versie van de servicetoepassing vertegenwoordigen en verkeer naar die specifieke versies verplaatsen via de Istio-configuratie virtualservice .

De momenteel geïmplementeerde virtualservice regel heeft alleen een routeregel naar de v1-versie van de boekwinkel die hieronder wordt weergegeven:

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

We werken het virtualservice bij om 100% van het gewicht te verplaatsen naar de v2-versie van de boekhandel.

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

Als het goed is, ziet u nu alleen het verhogen van de bookbuyerbookthief gebruikersinterface voor de bookstore v2-service. U kunt blijven experimenteren door het weigth kenmerk te wijzigen om verkeer tussen de twee bookstore versies te verplaatsen.

Samenvatting

We hopen dat deze procedure de nodige richtlijnen biedt voor het migreren van uw huidige OSM-beleid naar Istio-beleid. Neem tijd en bekijk de Istio-concepten en doorloop de eigen Introductiehandleiding van Istio om te leren hoe u de Istio-service-mesh gebruikt om uw toepassingen te beheren.