Dela via


Migreringsvägledning för OSM-konfigurationer (Open Service Mesh) till Istio

Viktigt!

Den här artikeln syftar till att ge en förenklad förståelse för hur du identifierar OSM-konfigurationer och översätter dem till motsvarande Istio-konfigurationer för migrering av arbetsbelastningar från OSM till Istio. Detta anses inte på något sätt vara en uttömmande detaljerad vägledning.

Den här artikeln innehåller praktisk vägledning för att mappa OSM-principer till Istio-principerna för att migrera dina mikrotjänstdistributioner som hanteras av OSM till att hanteras av Istio. Vi använder OSM Bookstore-exempelprogrammet som basreferens för aktuella OSM-användare. Följande genomgång distribuerar Bokhandelsprogrammet. Samma steg följs och förklarar hur du tillämpar OSM SMI-trafikprinciperna med hjälp av Istio-motsvarigheten.

Om du inte använder OSM och är nybörjare på Istio börjar du med Istios egen Komma igång guide för att lära dig hur du använder Istio-tjänstnätet för dina program. Om du för närvarande använder OSM kontrollerar du att du är bekant med OSM Bookstore-exempelprogrammets genomgång av hur OSM konfigurerar trafikprinciper. Följande genomgång duplicerar inte den aktuella dokumentationen och refererar till specifika ämnen när det är relevant. Du bör vara bekväm och fullt medveten om bokhandelsprogrammets arkitektur innan du fortsätter.

Förutsättningar

Ändringar som behövs i OSM-exempelbokhandelsprogrammet

För att Istio ska kunna hantera OSM-bokhandelsprogrammet behövs ett par ändringar i de befintliga manifesten. Dessa ändringar är med bokhandeln och mysql-tjänsterna.

Ändringar i bokhandeln

I osm-bokhandelns genomgång distribueras bokhandelstjänsten tillsammans med en annan bokhandels-v2-tjänst för att visa hur OSM tillhandahåller trafikväxling. Med de här distribuerade tjänsterna kunde du dela upp klienttrafiken (bookbuyer) mellan flera tjänstslutpunkter. Det första nya konceptet för att förstå hur Istio hanterar vad de kallar trafikväxling.

OSM-implementeringen av trafikväxling baseras på SMI Traffic Split-specifikationen. SMI Traffic Split-specifikationen kräver att det finns flera tjänster på toppnivå som läggs till som serverdelar med önskat viktmått för att flytta klientbegäranden från en tjänst till en annan. Istio utför trafikväxling med hjälp av en kombination av en virtuell tjänst och en målregel. Vi rekommenderar starkt att du bekantar dig med både begreppen för en virtuell tjänst och målregel.

Enkelt uttryckt definierar den virtuella Istio-tjänsten routningsregler för klienter som begär värden (tjänstnamn). Med Virtual Services kan flera versioner av en distribution associeras till ett virtuellt tjänstvärdnamn för klienter som ska riktas. Flera distributioner kan märkas för samma tjänst, vilket representerar olika versioner av programmet bakom samma värdnamn. Den virtuella Istio-tjänsten kan sedan konfigureras för att vikta begäran till en viss version av tjänsten. De tillgängliga versionerna av tjänsten är konfigurerade för att använda subsets attributet i en Istio-målregel.

Ändringen av bokhandelstjänsten och distributionen för Istio tar bort behovet av att ha en explicit andra tjänst att rikta in sig på, vilket SMI Traffic Split behöver. Det finns inget behov av ett annat tjänstkonto för bokhandelstjänsten v2 också, eftersom det ska konsolideras under bokhandelstjänsten. Den ursprungliga OSM-manifeständringen traffic-access-v1.yaml till Istio för både bokhandeln v1 och v2 visas i avsnittet Skapa poddar, tjänster och tjänstkonton nedan. Vi visar hur vi delar upp trafiken, så kallad trafikförskjutning senare i genomgången:

MySql-ändringar

Ändringar i den tillståndskänsliga mysql-uppsättningen behövs bara i tjänstkonfigurationen. Enligt tjänstspecifikationen behövde OSM attributen targetPort och appProtocol . Dessa attribut behövs inte för Istio. Följande uppdaterade tjänst för mysqldb ser ut så här:

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

Distribuera det ändrade bokhandelsprogrammet

På samma sätt som osm-bokhandelns genomgång börjar vi med en ny installation av bokhandelsprogrammet.

Skapa namnrymderna

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

Lägg till en namnområdesetikett för Inmatning av sidovagn i Istio

För OSM skapade kommandot osm namespace add <namespace> nödvändiga anteckningar till namnområdet för OSM-styrenheten för att lägga till automatisk sidovagnsinmatning. Med Istio behöver du bara märka ett namnområde så att Istio-kontrollanten kan instrueras att automatiskt mata in envoy-proxyservrarna för sidovagn.

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

Distribuera den virtuella Istio-tjänsten och målregeln för bokhandel

Som tidigare nämnts i avsnittet Ändring av bokhandel hanterar Istio trafikväxling med hjälp av ett VirtualService-viktattribut som vi konfigurerar senare i genomgången. Vi distribuerar den virtuella tjänsten och målregeln för bokhandelstjänsten. Vi distribuerar endast bokhandeln version 1 trots att bokhandeln version 2 har distribuerats. Den virtuella Istio-tjänsten tillhandahåller bara en väg till version 1 av bokhandeln. OsM, som skiljer sig från hur OSM hanterar trafikväxling (trafikdelning), distribuerade en annan tjänst för bokhandelns version 2-program. OSM behövde konfigurera trafik som ska delas mellan klientbegäranden med hjälp av en TrafficSplit. När du använder trafikväxling med Istio kan vi referera till att flytta trafik till flera Kubernetes-programdistributioner (versioner) märkta för samma tjänst.

I den här genomgången distribueras distributionen av båda bokhandelsversionerna (v1 & v2) samtidigt. Endast version 1 kan nås på grund av konfigurationen av den virtuella tjänsten. Det finns inget behov av att distribuera en annan tjänst för bokhandel version 2, vi aktiverar en väg till bokhandeln version 2 senare när vi uppdaterar den virtuella bokhandelns virtuella tjänst och tillhandahåller det viktattribut som krävs för att utföra trafikväxling.

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

Skapa poddar, tjänster och tjänstkonton

Vi använder en enda manifestfil som innehåller de ändringar som beskrevs tidigare i genomgången för att distribuera bookbuyerprogrammen , bookthief, bookstore, bookwarehouseoch mysql .

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

Om du vill visa dessa resurser i klustret kör du följande kommandon:

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

Visa program-UIs

På samma sätt som den ursprungliga OSM-genomgången kan du använda portvidarebefordringsskripten för att visa UIs för varje program här om du har klonat OSM-lagringsplatsen. För tillfället är vi bara intresserade av att visa användargränssnittet bookbuyer och bookthief .

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

Öppna följande URL:ar i en webbläsare:

http://localhost:8080 - bokköpare

http://localhost:8083 - bookthief

Konfigurera Istios trafikprinciper

För att upprätthålla kontinuiteten med den ursprungliga OSM-bokhandelns genomgång för översättningen till Istio diskuterar vi OSM:s tillåtande trafikprincipläge. OSM:s tillåtande trafikprincipläge var ett begrepp om att tillåta eller neka trafik i nätet utan någon specifik SMI-trafikåtkomstkontrollregel distribuerad. Den tillåtande trafiklägeskonfigurationen fanns för att tillåta användare att registrera program i nätet, samtidigt som de fick mTLS-kryptering, utan att kräva explicita regler för att tillåta att program i nätet kommunicerar. Den tillåtande trafiklägesfunktionen var att undvika att bryta kommunikationen för ditt program så snart OSM hanterade det och ge tid att definiera dina regler samtidigt som du säkerställde att programkommunikationen var mTLS-krypterad. Den här inställningen kan anges till true eller false via OSM:s MeshConfig.

Istio hanterar mTLS-tvingande på olika sätt. Till skillnad från OSM konfigurerar Istios tillåtande läge automatiskt sidovagnsproxys för att använda mTLS, men tillåter att tjänsten accepterar både klartext- och mTLS-trafik. Motsvarigheten till OSM:s tillåtande lägeskonfiguration är att använda Istios PeerAuthentication inställningar. PeerAuthentication kan göras detaljerat i namnområdet eller för hela nätet. Mer information om Istios tillämpning av mTLS finns i artikeln Istio Mutual TLS Migration( Istio Mutual TLS Migration).

Framtvinga strikt Istio-läge på bokhandelsnamnområden

Det är viktigt att komma ihåg, precis som OSM:s tillåtande läge, att Istios PeerAuthentication konfiguration endast är relaterad till användningen av mTLS-tillämpning. Faktiska layer-7-principer, ungefär som de som används i OSM:s HTTPRouteGroups, hanteras med hjälp av Istios AuthorizationPolicy-konfigurationer som du ser senare i genomgången.

Vi placerar bookbuyergranularly namnrymderna , bookthief, bookstoreoch bookwarehouse i Istios strikta mTLS-läge.

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

Distribuera Principer för Istio-åtkomstkontroll

Precis som OSM:s SMI Traffic Target - och SMI Traffic Specs-resurser för att definiera åtkomstkontroll och routningsprinciper för de program som ska kommunicera, utför Istio dessa liknande detaljerade kontroller med hjälp AuthorizationPolicy av konfigurationer.

Nu ska vi gå igenom översättningen av principen TrafficTarget för bokhandeln, som specifikt gör det möjligt bookbuyer att kommunicera med den, med endast vissa layer-7-sökvägar, rubriker och metoder. Följande är en del av manifestet 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

Om du märker under TrafficTarget-principen är det i specifikationen där du uttryckligen kan definiera vilken källtjänst som kan kommunicera med en måltjänst. Vi kan se att vi tillåter att källan bookbuyer har behörighet att kommunicera med målbokhandeln. Om vi översätter tjänst-till-tjänst-auktoriseringen från en OSM-konfiguration TrafficTarget till en Istio AuthorizationPolicyser det ut så här nedan:

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

I Istios märker du hur OSM TrafficTarget-principmåltjänsten mappas AuthorizationPolicytill väljarens etikettmatchning och namnområdet som tjänsten finns i. Källtjänsten visas under regelavsnittet där det finns ett käll-/principattribut som mappar till tjänstens bookbuyer tjänstkontonamn.

Förutom bara käll-/målkonfigurationen i OSM TrafficTarget binder OSM användningen av en HTTPRouteGroup för att ytterligare definiera den layer-7-auktorisering som källan har åtkomst till. Vi kan se i bara delen av HTTPRouteGroup nedan. Det finns två matches för den tillåtna källtjänsten.

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

Det finns ett match namn books-bought som gör att källan kan komma åt sökvägen /books-bought med hjälp av en GET metod med användaragent för värdhuvud och klientappsinformation och en buy-a-book matchning som använder en regex-express för en sökväg som innehåller .*a-book.*new en GET metod.

Vi kan definiera dessa OSM HTTPRouteGroup-konfigurationer i regelavsnittet i Istio AuthorizationPolicy som visas nedan:

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

Nu kan vi distribuera OSM-manifestet traffic-access-v1.yaml enligt istio nedan. Det finns ingen AuthorizationPolicy för bookthief, så bookthief UI bör sluta öka böcker från bokhandel 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

Tillåter att Bookthief-programmet får åtkomst till bokhandeln

För närvarande finns det inget AuthorizationPolicy som tillåter att bookthief kommunicerar med bokhandeln. Vi kan distribuera följande AuthorizationPolicy så att bookthief kan kommunicera med bokhandeln. Du märker tillägget för regeln för bokhandelsprincipen som tillåter bookthief-auktorisering.

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 UI bör nu öka böcker från bokhandeln v1.

Konfigurera trafikväxling mellan två tjänstversioner

För att visa hur du balanserar trafik mellan två versioner av en Kubernetes-tjänst, så kallad trafikväxling i Istio. Som du minns i ett tidigare avsnitt förlitade sig OSM-implementeringen av trafikväxling på två distinkta tjänster som distribuerades och lade till dessa tjänstnamn i serverdelskonfigurationen TrafficTarget av principen. Den här distributionsarkitekturen behövs inte för hur Istio implementerar trafikväxling. Med Istio kan vi skapa flera distributioner som representerar varje version av tjänstprogrammet och flytta trafik till dessa specifika versioner via Istio-konfigurationen virtualservice .

Den för närvarande distribuerade har bara en routningsregel virtualservice till v1-versionen av bokhandeln som visas nedan:

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

Vi uppdaterar virtualservice för att flytta 100 % av vikten till v2-versionen av bokhandeln.

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

Nu bör både användargränssnittet bookbuyer och bookthief ökas för bookstore v2-tjänsten. Du kan fortsätta att experimentera genom att ändra weigth attributet för att flytta trafik mellan de två bookstore versionerna.

Sammanfattning

Vi hoppas att den här genomgången gav nödvändig vägledning om hur du migrerar dina aktuella OSM-principer till Istio-principer. Ta dig tid och granska Istio-begreppen och gå igenom Istios egen Komma igång guide för att lära dig hur du använder Istio-tjänstnätet för att hantera dina program.