Linee guida sulla migrazione per le configurazioni open service mesh (OSM) in Istio

Importante

Questo articolo mira a fornire una comprensione semplicistica di come identificare le configurazioni OSM e convertirle in configurazioni Istio equivalenti per la migrazione dei carichi di lavoro da OSM a Istio. Ciò non significa che si consideri una guida dettagliata esaustiva.

Questo articolo fornisce indicazioni pratiche per il mapping dei criteri OSM ai criteri Istio per facilitare la migrazione delle distribuzioni di microservizi gestite da OSM per essere gestite da Istio. Usiamo l'applicazione di esempio OSM Bookstore come riferimento di base per gli utenti OSM correnti. La procedura dettagliata seguente distribuisce l'applicazione Bookstore. Vengono seguiti gli stessi passaggi e spiegano come applicare i criteri di traffico SMI di OSM usando l'equivalente Istio.

Se non si usa OSM e non si ha familiarità con Istio, iniziare con la guida introduttiva di Istio per informazioni su come usare la mesh del servizio Istio per le applicazioni. Se si usa attualmente OSM, assicurarsi di avere familiarità con l'applicazione di esempio OSM Bookstore per informazioni dettagliate su come OSM configura i criteri di traffico. La procedura dettagliata seguente non duplica la documentazione corrente e fa riferimento a argomenti specifici, se pertinenti. Prima di procedere, è consigliabile avere familiarità con l'architettura dell'applicazione bookstore.

Prerequisiti

Modifiche necessarie per l'applicazione bookstore di esempio OSM

Per consentire a Istio di gestire l'applicazione bookstore OSM, sono necessarie alcune modifiche nei manifesti esistenti. Queste modifiche sono relative al bookstore e ai servizi mysql.

Modifiche alle librerie

Nella procedura dettagliata di OSM Bookstore il servizio bookstore viene distribuito insieme a un altro servizio bookstore-v2 per illustrare come OSM fornisce lo spostamento del traffico. Questi servizi distribuiti hanno consentito di suddividere il traffico client (bookbuyer) tra più endpoint di servizio. Il primo nuovo concetto per comprendere in che modo Istio gestisce ciò a cui fanno riferimento come Traffic Shifting (spostamento del traffico).

L'implementazione di OSM dello spostamento del traffico si basa sulla specifica SMI Traffic Split (suddivisione del traffico). La specifica SMI Traffic Split richiede l'esistenza di più servizi di primo livello aggiunti come back-end con la metrica di peso desiderata per spostare le richieste client da un servizio a un altro. Istio esegue lo spostamento del traffico usando una combinazione di un servizio virtuale e di una regola di destinazione. È consigliabile acquisire familiarità con entrambi i concetti di servizio virtuale e regola di destinazione.

In poche parole, il servizio virtuale Istio definisce le regole di routing per i client che richiedono l'host (nome del servizio). Servizi virtuali consente l'associazione di più versioni di una distribuzione a un nome host del servizio virtuale per i client di destinazione. È possibile etichettare più distribuzioni per lo stesso servizio che rappresenta versioni diverse dell'applicazione dietro lo stesso nome host. Il servizio virtuale Istio può quindi essere configurato per ponderare la richiesta a una versione specifica del servizio. Le versioni disponibili del servizio sono configurate per l'uso dell'attributo subsets in una regola di destinazione Istio.

La modifica apportata al servizio bookstore e alla distribuzione per Istio rimuove la necessità di avere un secondo servizio esplicito di destinazione, che la suddivisione del traffico SMI richiede. Non è necessario un altro account di servizio anche per il servizio bookstore v2, perché deve essere consolidato nel servizio bookstore. La modifica originale del manifesto OSM traffic-access-v1.yaml in Istio per la libreria v1 e v2 è illustrata nella sezione Creare pod, servizi e account di servizio seguente. Viene illustrato come eseguire la suddivisione del traffico, nota come spostamento del traffico in un secondo momento nella procedura dettagliata:

Modifiche a MySql

Le modifiche apportate al set con stato mysql sono necessarie solo nella configurazione del servizio. In base alla specifica del servizio, OSM richiedeva gli attributi targetPort e appProtocol. Questi attributi non sono necessari per Istio. Il servizio aggiornato seguente per mysqldb è simile al seguente:

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

Distribuire l'applicazione Bookstore modificata

Analogamente alla procedura dettagliata di OSM Bookstore, si inizia con una nuova installazione dell'applicazione bookstore.

Creare gli spazi dei nomi

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

Aggiungere un'etichetta dello spazio dei nomi per l'inserimento sidecar istio

Per OSM, usando il comando osm namespace add <namespace> sono state create le annotazioni necessarie per lo spazio dei nomi per il controller OSM per aggiungere l'inserimento automatico del sidecar. Con Istio, è sufficiente etichettare solo uno spazio dei nomi per consentire al controller Istio di inserire automaticamente i proxy sidecar 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

Distribuire il servizio virtuale Istio e la regola di destinazione per Bookstore

Come accennato in precedenza nella sezione Modifica bookstore, Istio gestisce lo spostamento del traffico usando un attributo peso VirtualService configurato più avanti nella procedura dettagliata. Per il servizio bookstore vengono distribuiti il servizio virtuale e la regola di destinazione. Distribuiamo solo la versione 1 del bookstore anche se la versione 2 è distribuita. Il servizio virtuale Istio fornisce solo una route alla versione 1 della libreria. Diversamente dal modo in cui OSM gestisce lo spostamento del traffico (suddivisione del traffico), OSM ha distribuito un altro servizio per l'applicazione bookstore versione 2. OSM deve configurare il traffico da dividere tra le richieste client usando un TrafficSplit. Quando si usa lo spostamento del traffico con Istio, è possibile fare riferimento allo spostamento del traffico verso più distribuzioni di applicazioni Kubernetes (versioni) etichettate per lo stesso servizio.

In questa procedura dettagliata, la distribuzione di entrambe le versioni bookstore (v1 & v2) viene distribuita contemporaneamente. Solo la versione 1 è raggiungibile a causa della configurazione del servizio virtuale. Non è necessario distribuire un altro servizio per bookstore versione 2, si abilita una route alla versione 2 bookstore in un secondo momento quando si aggiorna il servizio virtuale bookstore e si fornisce l'attributo di peso necessario per eseguire lo spostamento del traffico.

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

Creare pod, servizi e account di servizio

Viene usato un singolo file manifesto contenente le modifiche descritte in precedenza nella procedura dettagliata per distribuire le applicazioni bookbuyer, bookthief, bookstore, bookwarehouse e 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

Per visualizzare queste risorse nel cluster, eseguire i comandi seguenti:

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

Visualizzare le interfacce utente dell'applicazione

Analogamente alla procedura dettagliata di OSM originale, se è stato clonato il repository OSM, è possibile usare gli script di port forwarding per visualizzare le interfacce utente di ogni applicazionequi. Per il momento, ci interessa solo visualizzare l'interfaccia utente bookbuyer e bookthief.

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

In un browser aprire gli URL seguenti:

http://localhost:8080 - bookbuyer

http://localhost:8083 - bookthief

Configurare i criteri di traffico di Istio

Per mantenere la continuità con la procedura dettagliata originale di OSM Bookstore per la traduzione in Istio, viene illustrata la modalità dei criteri di traffico permissiva di OSM. La modalità dei criteri di traffico permissiva di OSM era un concetto che consentiva o negava il traffico nella mesh senza una specifica regola di controllo di accesso al traffico SMI distribuita. La configurazione della modalità traffico permissiva esisteva per consentire agli utenti di eseguire l'onboarding delle applicazioni nella mesh, ottenendo la crittografia mTLS, senza richiedere regole esplicite per consentire alle applicazioni nella mesh di comunicare. La funzionalità della modalità traffico permissiva è stata quella di evitare l'interruzione delle comunicazioni dell'applicazione non appena è stata gestita da OSM e fornire tempo per definire le regole assicurando al tempo stesso che le comunicazioni dell'applicazione fossero state crittografate con mTLS. Questa impostazione può essere impostata su true o false tramite MeshConfig di OSM.

Istio gestisce l'imposizione mTLS in modo diverso. Diversamente da OSM, la modalità permissiva di Istio configura automaticamente proxy sidecar per l'uso di mTLS, ma consente al servizio di accettare sia il testo non crittografato che il traffico mTLS. L'equivalente alla configurazione della modalità permissiva di OSM consiste nell'usare le impostazioni di PeerAuthentication di Istio. PeerAuthentication può essere eseguita in modo granulare nello spazio dei nomi o per l'intera mesh. Per altre informazioni sull'applicazione di mTLS di Istio, vedere l'articolo Migrazione tls reciproca istio.

Applicare la modalità Istio Strict agli spazi dei nomi bookstore

È importante ricordare che, proprio come la modalità permissiva di OSM, la configurazione PeerAuthentication di Istio è correlata solo all'uso dell'imposizione mTLS. I criteri di livello 7 effettivi, molto simili a quelli usati nei HTTPRouteGroups di OSM, vengono gestiti usando le configurazioni AuthorizationPolicy di Istio visualizzate più avanti nella procedura dettagliata.

Gli spazi dei nomi bookbuyer, bookthief, bookstore e bookwarehouse vengono inseriti in modalità strict mTLS di 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

Distribuire criteri di controllo di accesso Istio

Analogamente alle risorse di destinazione del traffico SMI e specifiche del traffico SMI di OSM per definire i criteri di controllo di accesso e routing per le applicazioni da comunicare, Istio esegue questi controlli simili con granularità fine usando le configurazioni AuthorizationPolicy.

Verrà ora illustrata la traduzione dei criteri TrafficTarget bookstore, che consentono in particolare all'oggetto bookbuyer di comunicare con esso, con solo determinati metodi, intestazioni e percorsi di livello 7. Di seguito è riportata una parte del manifesto 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

Se si nota sotto il criterio TrafficTarget, nella specifica è possibile definire in modo esplicito il servizio di origine in grado di comunicare con un servizio di destinazione. È possibile notare che bookbuyer di origine può essere autorizzato a comunicare con la libreria di destinazione. Se si converte l'autorizzazione da servizio a servizio da una configurazione TrafficTarget OSM a un AuthorizationPolicyIstio, è simile al seguente:

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 AuthorizationPolicy di Istio si noterà come viene eseguito il mapping del servizio di destinazione dei criteri TrafficTarget OSM alla corrispondenza dell'etichetta del selettore e allo spazio dei nomi in cui risiede il servizio. Il servizio di origine viene visualizzato nella sezione regole in cui è presente un attributo di origine/principi mappato al nome dell'account del servizio per il servizio bookbuyer.

Oltre alla configurazione di origine/destinazione in OSM TrafficTarget, OSM associa l'uso di un HTTPRouteGroup per definire ulteriormente l'autorizzazione di livello 7 a cui l'origine ha accesso. È possibile vedere solo nella parte di HTTPRouteGroup seguente. Sono disponibili due matches per il servizio di origine consentito.

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

È presente un oggetto match denominato books-bought che consente all'origine di accedere al percorso /books-bought usando un metodo GET con l'intestazione host user-agent e le informazioni client-app e una corrispondenza buy-a-book che usa un'espressione regolare per un percorso contenente .*a-book.*new usando un metodo GET.

È possibile definire queste configurazioni HTTPRouteGroup OSM nella sezione regole di AuthorizationPolicy Istio illustrata di seguito:

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

È ora possibile distribuire il manifesto traffic-access-v1.yaml migrato da OSM, come indicato di seguito da Istio. Non esiste un AuthorizationPolicy per il bookthief, quindi l'interfaccia utente bookthief deve interrompere l'incremento dei libri dalla libreria 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

Consentire all'applicazione Bookthief di accedere a Bookstore

Attualmente non c'è alcun AuthorizationPolicy che consente al bookthief di comunicare con la libreria. È possibile distribuire i AuthorizationPolicy seguenti per consentire al bookthief di comunicare con il booktore. Si noti l'aggiunta della regola per i criteri bookstore che consente l'autorizzazione 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

L'interfaccia utente bookthief dovrebbe ora incrementare i libri dalla libreria v1.

Configurare lo spostamento del traffico tra due versioni del servizio

Per illustrare come bilanciare il traffico tra due versioni di un servizio Kubernetes, noto come spostamento del traffico in Istio. Come si ricorderà in una sezione precedente, l'implementazione di spostamento del traffico di OSM si basava su due servizi distinti distribuiti e che aggiungevano tali nomi di servizio alla configurazione back-end dei criteri TrafficTarget. Questa architettura di distribuzione non è necessaria per il modo in cui Istio implementa lo spostamento del traffico. Con Istio è possibile creare più distribuzioni che rappresentano ogni versione dell'applicazione di servizio e spostare il traffico verso tali versioni specifiche tramite la configurazione virtualservice di Istio.

virtualservice attualmente distribuito ha solo una regola di route alla versione v1 della libreria illustrata di seguito:

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

Aggiorniamo virtualservice per spostare il 100% del peso alla versione v2 della libreria.

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

Verranno ora visualizzati sia l'incremento dell'interfaccia utente bookbuyer che bookthief solo per il servizio v2 bookstore. È possibile continuare a sperimentare modificando l'attributo weigth per spostare il traffico tra le due versioni bookstore.

Riepilogo

Questa procedura dettagliata fornisce le indicazioni necessarie su come eseguire la migrazione dei criteri OSM correnti ai criteri Istio. Dedicare il tempo necessario ad esaminare i concetti di Istio e la guida introduttiva di Istio per imparare a usare la mesh di servizi Istio per gestire le applicazioni.