Partekatu honen bidez:


Guía de migración para configuraciones de Open Service Mesh (OSM) a Istio

Importante

Este artículo tiene como objetivo proporcionar una comprensión simple sobre cómo identificar las configuraciones de OSM y trasladarlas a configuraciones equivalentes de Istio para migrar cargas de trabajo de OSM a Istio. Esto no se considera en modo alguno una guía detallada exhaustiva.

En este artículo se proporcionan instrucciones prácticas para asignar directivas de OSM a las directivas de Istio para ayudar a migrar las implementaciones de microservicios administradas por OSM para ser administradas por Istio. Usamos la aplicación de ejemplo bookstore de OSM como referencia base para los usuarios actuales de OSM. En el siguiente tutorial se implementa la aplicación bookstore. Se siguen los mismos pasos y se explica cómo aplicar las directivas de tráfico de SMI de OSM mediante su equivalente de Istio.

Si no usa OSM y no está familiarizado con Istio, comience con la Guía de introducción a Istio para aprender a usar la malla de servicios de Istio para sus aplicaciones. Si actualmente usa OSM, asegúrese de estar familiarizado con el tutorial de Aplicación de ejemplo bookstore de OSM sobre cómo OSM configura las directivas de tráfico. El siguiente tutorial no duplica la documentación actual y hace referencia a temas específicos cuando se considera pertinente. Debe estar cómodo y completamente al tanto de la arquitectura de la aplicación bookstore antes de continuar.

Requisitos previos

Modificaciones necesarias para la aplicación de ejemplo bookstore de OSM

Para permitir que Istio administre la aplicación bookstore de OSM, hay un par de cambios necesarios en los manifiestos existentes. Estos cambios se realizan con el bookstore y los servicios mysql.

Modificaciones de bookstore

En el tutorial de bookstore de OSM, el servicio bookstore se implementa junto con otro servicio bookstore v2 para demostrar cómo OSM proporciona el desplazamiento de tráfico. Estos servicios implementados le permiten dividir el tráfico del cliente (bookbuyer) entre varios puntos de conexión de servicio. El primer concepto nuevo para comprender cómo Istio controla lo que denominan Desplazamiento de tráfico.

La implementación de OSM del desplazamiento de tráfico se basa en la especificación de división de tráfico de SMI. La especificación de división de tráfico de SMI requiere la existencia de varios servicios de nivel superior que se agregan como back-end con la métrica de peso deseada para desplazar las solicitudes de cliente de un servicio a otro. Istio realiza el desplazamiento de tráfico mediante una combinación de un Servicio virtual y una Regla de destino. Se recomienda que se familiarice con los conceptos de un servicio virtual y una regla de destino.

En pocas palabras, el servicio virtual de Istio define reglas de enrutamiento para los clientes que solicitan el host (nombre del servicio). Los servicios virtuales permiten asociar varias versiones de una implementación a un nombre de host de servicio virtual para que los clientes tengan como destino. Se pueden etiquetar varias implementaciones para el mismo servicio, que representan diferentes versiones de la aplicación detrás del mismo nombre de host. El servicio virtual de Istio se puede configurar para ponderar la solicitud a una versión específica del servicio. Las versiones disponibles del servicio están configuradas para usar el atributo subsets en una regla de destino de Istio.

La modificación realizada en el servicio bookstore y la implementación de Istio elimina la necesidad de tener un segundo servicio explícito de destino, necesario para la división de tráfico de SMI. No hay necesidad de otra cuenta de servicio para el servicio bookstore v2, ya que se va a consolidar en el servicio bookstore. La modificación del manifiesto original de OSM traffic-access-v1.yamla Istio para bookstore v1 y v2 se muestra en la sección Crear pods, servicios y cuentas de servicio más abajo. Se muestra cómo se divide el tráfico, conocido como desplazamiento de tráfico, más adelante en el tutorial:

Modificaciones de MySql

Los cambios en el StatefulSet mysql solo son necesarios en la configuración del servicio. En la especificación del servicio, OSM necesitaba los atributos targetPort y appProtocol. Estos atributos no son necesarios para Istio. El siguiente servicio actualizado para mysqldb tiene el siguiente aspecto:

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

Implementación de la aplicación bookstore modificada

Al igual que el tutorial de bookstore de OSM, empezamos con una nueva instalación de la aplicación bookstore.

Crear los espacios de nombres

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

Agregar una etiqueta de espacio de nombres para la inyección sidecar de Istio

Para OSM, con el comando osm namespace add <namespace> se crearon las anotaciones necesarias en el espacio de nombres del controlador OSM para agregar la inserción automática de sidecar. Con Istio, solo tiene que etiquetar un espacio de nombres para permitir que se indique al controlador Istio que inserte automáticamente los servidores proxy sidecar de 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

Implementación del servicio virtual de Istio y la regla de destino para Bookstore

Como se mencionó anteriormente en la sección Modificación de bookstore, Istio controla el desplazamiento del tráfico mediante un atributo de peso de VirtualService que se configura más adelante en el tutorial. Implementamos el servicio virtual y la regla de destino para el servicio bookstore. Solo implementamos la versión 1 de bookstore aunque se implemente la versión 2 de bookstore. El servicio virtual de Istio solo proporciona una ruta a la versión 1 de bookstore. Diferente de cómo OSM controla el desplazamiento del tráfico (división de tráfico), OSM implementó otro servicio para la aplicación bookstore versión 2. OSM necesitaba configurar el tráfico para dividirlo entre las solicitudes de cliente mediante TrafficSplit. Al usar el desplazamiento de tráfico con Istio, podemos hacer referencia al desplazamiento de tráfico a varias implementaciones de aplicaciones de Kubernetes (versiones) etiquetadas para el mismo servicio.

En este tutorial, la implementación de ambas versiones de bookstore (v1 y v2) se implementa al mismo tiempo. Solo se puede acceder a la versión 1 debido a la configuración del servicio virtual. No es necesario implementar otro servicio para la versión 2 de bookstore; se habilita una ruta a la versión 2 de bookstore más adelante cuando actualizamos el servicio virtual de bookstore y proporcionamos el atributo de peso necesario para realizar el desplazamiento de tráfico.

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

Crear pods, servicios y cuentas de servicio

Usamos un único archivo de manifiesto que contiene las modificaciones descritas anteriormente en el tutorial para implementar las aplicaciones bookbuyer, bookthief, bookstore, bookwarehouse y 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

Para ver estos recursos en el clúster, ejecute los siguientes comandos:

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

Visualización de las interfaces de usuario de la aplicación

De forma similar al tutorial original de OSM, si tiene clonado el repositorio de OSM, puede usar los scripts de reenvío de puertos para ver las interfaces de usuario de cada aplicación aquí. Por ahora, solo nos preocupa ver la interfaz de usuario bookbuyer y bookthief.

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

En un explorador, abra las siguientes direcciones URL:

http://localhost:8080 - bookbuyer

http://localhost:8083 - bookthief

Configurar las directivas de tráfico de Istio

Para mantener la continuidad con el tutorial original de bookstore de OSM para la traslación a Istio, analizamos el Modo de directiva de tráfico permisivo de OSM. El modo de directiva de tráfico permisivo de OSM era un concepto para permitir o denegar el tráfico en la malla sin ninguna regla específica de control de acceso de tráfico de SMI implementada. La configuración del modo de tráfico permisivo existía para permitir que los usuarios incorporen aplicaciones a la malla, al mismo tiempo que obtenían el cifrado mTLS, sin necesidad de reglas explícitas para permitir que las aplicaciones de la malla se comuniquen. La característica de modo de tráfico permisivo era evitar interrumpir las comunicaciones de la aplicación tan pronto como OSM la administraba, y proporcionar tiempo para definir las reglas, a la vez que garantizaba que las comunicaciones de la aplicación se cifraban en mTLS. Esta configuración se puede establecer en true o false a través de MeshConfig de OSM.

Istio controla el cumplimiento de mTLS de forma diferente. Distinto de OSM, el modo permisivo de Istio configura automáticamente los servidores proxy sidecar para usar mTLS, pero permite que el servicio acepte tráfico de texto no cifrado y mTLS. El equivalente a la configuración de modo permisivo de OSM es utilizar la configuración PeerAuthentication de Istio. PeerAuthentication se puede realizar de forma pormenorizada en el espacio de nombres o para toda la malla. Para obtener más información sobre la aplicación de mTLS en Istio, lea el artículo sobre Migración mutua de TLS de Istio.

Aplicar el modo strict de Istio en espacios de nombres de bookstore

Es importante recordar que, al igual que el modo permisivo de OSM, la configuración PeerAuthentication de Istio solo está relacionada con el uso de la aplicación de mTLS. Las directivas reales de capa 7, al igual que las que se usan en HTTPRouteGroups de OSM, se controlan mediante las configuraciones AuthorizationPolicy de Istio que se ven más adelante en el tutorial.

Colocamos de manera pormenorizada los espacios de nombres bookbuyer, bookthief, bookstore y bookwarehouse en el modo strict de mTLS de 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

Implementación de directivas de Access Control de Istio

De forma similar a los recursos Destino del tráfico SMI y Especificaciones de tráfico de SMI de OSM para definir directivas de control de acceso y enrutamiento para que las aplicaciones se comuniquen, Istio realiza estos controles específicos similares mediante configuraciones AuthorizationPolicy.

Vamos a recorrer la traslación de la directiva TrafficTarget de bookstore, que permite específicamente que bookbuyer se comunique, con solo cierta ruta de acceso, encabezados y métodos de capa 7. A continuación se muestra una parte del manifiesto 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

Si observa en la directiva TrafficTarget, en la especificación es donde puede definir explícitamente qué servicio de origen puede comunicarse con un servicio de destino. Podemos ver que estamos permitiendo que el origen bookbuyer esté autorizado para comunicarse con el bookstore de destino. Si trasladamos la autorización de servicio a servicio de una configuración TrafficTarget de OSM a un AuthorizationPolicy de Istio, tendrá el siguiente aspecto:

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

En AuthorizationPolicy de Istio, observará cómo se asigna el servicio de destino de la directiva TrafficTarget de OSM a la coincidencia de etiqueta del selector y el espacio de nombres en el que reside el servicio. El servicio de origen se muestra en la sección de reglas donde hay un atributo de origen/principio que se asigna al nombre de la cuenta de servicio del servicio bookbuyer.

Además de solo la configuración de origen o destino en TrafficTarget de OSM, OSM enlaza el uso de HTTPRouteGroup para definir aún más la autorización de capa 7 a la que tiene acceso el origen. Podemos ver solo la parte de HTTPRouteGroup siguiente. Hay dos matches para el servicio de origen permitido.

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

Hay un match denominado books-bought que permite al origen tener acceso a la ruta de acceso /books-bought mediante un método GET con el encabezado host user-agent y la información de client-app, y una coincidencia buy-a-book que usa una expresión regex express para una ruta de acceso que contiene .*a-book.*new con un método GET.

Podemos definir estas configuraciones HTTPRouteGroup de OSM en la sección de reglas de AuthorizationPolicy de Istio que se muestra a continuación:

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

Ahora podemos implementar el manifiesto de OSM migrado traffic-access-v1.yaml, tal y como se entiende en Istio a continuación. No hay un AuthorizationPolicy para bookthief, por lo que la interfaz de usuario de bookthief debe dejar de incrementar los libros de bookstore 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

Permitir que la aplicación bookthief acceda a bookstore

Actualmente no hay ningún AuthorizationPolicy que permita que bookthief se comunique con bookstore. Podemos implementar el siguiente AuthorizationPolicy para permitir que bookthief se comunique con bookstore. Observe la adición de la regla para la directiva de bookstore que permite la autorización de 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

La interfaz de usuario de bookthief ahora debería incrementar los libros de bookstore v1.

Configurar el desplazamiento de tráfico entre dos versiones de servicio

Para demostrar cómo equilibrar el tráfico entre dos versiones de un servicio de Kubernetes, conocido como desplazamiento de tráfico en Istio. Como se recuerda en una sección anterior, la implementación de OSM del desplazamiento de tráfico se basa en dos servicios distintos que se implementan y se agregan esos nombres de servicio a la configuración de back-end de la directiva TrafficTarget. Esta arquitectura de implementación no es necesaria para cómo Istio implementa el desplazamiento de tráfico. Con Istio, podemos crear varias implementaciones que representen cada versión de la aplicación de servicio y desplazar el tráfico a esas versiones específicas a través de la configuración virtualservice de Istio.

virtualservice implementado actualmente solo tiene una regla de ruta a la versión v1 del bookstore que se muestra a continuación:

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

Actualizamos virtualservice para cambiar el 100 % del peso a la versión v2 del bookstore.

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

Ahora debería ver el incremento de la interfaz de usuario bookbuyer y bookthief solo para el servicio v2 bookstore. Para continuar experimentando, cambie el atributo weigth para desplazar el tráfico entre las dos versiones bookstore.

Resumen

Esperamos que este tutorial proporcione las instrucciones necesarias sobre cómo migrar las directivas actuales de OSM a las directivas de Istio. Tómese su tiempo y revise los Conceptos de Istio y recorra la Guía de Introducción a Istio para obtener información sobre cómo usar la malla de servicios de Istio para administrar las aplicaciones.