Introducción a los principios y la práctica de la arquitectura de Istio

Sitio web oficial: https://istio.io/v1.11/zh/docs/concepts/what-is-istio/

arquitectura istio

imagen.png

De hecho, Istio es una implementación de la arquitectura Service Mesh. La comunicación entre servicios (como el Servicio A que accede al Servicio B aquí) se realizará a través de un proxy (el valor predeterminado es Envoy).

Además, el protocolo de red intermedio admite HTTP/1.1, HTTP/2, gRPC o TCP, que se puede decir que cubre los protocolos de comunicación convencionales. Esta capa de agentes se llama plano de datos.

El avión de control se subdivide a su vez en Piloto, Ciudadela y Galera, sus respectivas funciones son las siguientes:

Pilot:为 Envoy 提供了服务发现,流量管理和智能路由(AB 测试、金丝雀发布等),以及错误处理(超时、重试、熔断)功能。

Citadel:为服务之间提供认证和证书管理,可以让服务自动升级成 TLS 协议。

Galley:Galley 是 Istio 的配置验证、提取、处理和分发组件。它负责将其余的 Istio 组件与从底层平台(例如 Kubernetes)获取用户配置的细节隔离开来。

El plano de datos se comunica con el plano de control, por un lado puede obtener la información requerida entre servicios y por otro lado también puede reportar los datos de Métricas de las llamadas de servicio.

¿Por qué utilizar Istio?

A través del equilibrio de carga, la autenticación entre servicios, la supervisión y más, Istio facilita la creación de una red donde los servicios ya están implementados con pocos o ningún cambio en su código . Agregue soporte para Istio a los servicios mediante la implementación de un proxy sidecar especial en todo el entorno. El proxy intercepta todas las comunicaciones de red entre microservicios y luego utiliza sus capacidades del plano de control para configurar y administrar Istio. Esto incluye:

  • Equilibrio de carga automático para tráfico HTTP, gRPC, WebSocket y TCP.
  • Control detallado del comportamiento del tráfico con reglas de enrutamiento enriquecidas, reintentos, conmutación por error e inyección de errores.
  • API de configuración y capa de políticas conectables que admiten control de acceso, limitación de velocidad y cuotas.
  • Medición, registro y seguimiento automatizados de todo el tráfico dentro del clúster, incluida la entrada y salida del clúster.
  • Habilite la comunicación segura entre servicios en un clúster con autenticación sólida y autenticación basada en autorización.

Istio está diseñado para ofrecer escalabilidad para satisfacer diferentes necesidades de implementación.

La gestión del tráfico

La configuración de reglas simple y el enrutamiento del tráfico de Istio le permiten controlar el tráfico entre los servicios y el proceso de llamada API. Istio simplifica la configuración de propiedades de nivel de servicio (como disyuntores, tiempos de espera y reintentos) y facilita la realización de tareas importantes (como pruebas A/B, implementaciones canary e implementaciones por etapas por porcentaje de tráfico).
Con una mejor visibilidad de su tráfico y funciones de recuperación de fallas listas para usar, puede detectar problemas antes de que surjan, lo que hace que las llamadas sean más confiables y su red más sólida, pase lo que pase.

Estado de soporte de la versión de Istio

Versión Actualmente soportado fecha de asunto Detener el mantenimiento Versiones de Kubernetes compatibles No probado, posibles versiones de Kubernetes compatibles
maestro No, solo desarrollo - - - -
1.15 31 de agosto de 2022 ~ Marzo de 2023 (esperado) 1,22, 1,23, 1,24, 1,25 1,16, 1,17, 1,18, 1,19, 1,20, 1,21
1.14 24 de mayo de 2022 ~ Enero de 2023 (esperado) 1,21, 1,22, 1,23, 1,24 1,16, 1,17, 1,18, 1,19, 1,20
1.13 11 de febrero de 2022 ~ Octubre de 2022 (esperado) 1,20, 1,21, 1,22, 1,23 1,16, 1,17, 1,18, 1,19
1.12 18 de noviembre de 2021 12 de julio de 2022 1,19, 1,20, 1,21, 1,22 1,16, 1,17, 1,18
1.11 No 12 de agosto de 2021 25 de marzo de 2022 1,18, 1,19, 1,20, 1,21, 1,22 1.16, 1.17
1.10 No 18 de mayo de 2021 7 de enero de 2022 1,18, 1,19, 1,20, 1,21 1,16, 1,17, 1,22
1.9 No 9 de febrero de 2021 8 de octubre de 2021 1,17, 1,18, 1,19, 1,20 1.15, 1.16
1.8 No 10 de noviembre de 2020 12 de mayo de 2021 1,16, 1,17, 1,18, 1,19 1.15
1.7 No 21 de agosto de 2020 25 de febrero de 2021 1,16, 1,17, 1,18 1.15
1.6 y anteriores No - - - -

1.Descargar

curl -L https://istio.io/downloadIstio | ISTIO_VERSION=1.11.7 TARGET_ARCH=x86_64 sh -


#转到 Istio 包目录。例如,如果包是 istio-1.11.7:
cd istio-1.11.7

#将 istioctl 客户端添加到路径
export PATH=$PWD/bin:$PATH


2. Instalar istio

istioctl install --set profile=demo -y

Agregue una etiqueta al espacio de nombres para indicarle a Istio que inyecte automáticamente el proxy sidecar Envoy al implementar la aplicación:

kubectl label namespace default istio-injection=enabled

#Desinstalar istio

istioctl manifest generate --set profile=demo | kubectl delete -f -

3. Implementar la aplicación de muestra

Este ejemplo implementa una aplicación que demuestra varias características de Istio y consta de cuatro microservicios separados. Esta aplicación imita una categoría en una librería en línea y muestra información sobre un libro. La página muestra una descripción del libro, detalles del libro (ISBN, número de páginas, etc.) y algunos comentarios sobre el libro.

La aplicación Bookinfo se divide en cuatro microservicios separados:
página de producto. Este microservicio llamará a los microservicios de detalles y revisiones para generar páginas.
detalles Este microservicio contiene información del libro.
reseñas Este microservicio contiene reseñas relacionadas con libros. También llama microservicio de calificaciones.
calificaciones Este microservicio contiene información de calificación que consta de reseñas de libros.

Hay 3 versiones del microservicio de reseñas:
La versión v1 no llama al servicio de reseñas.
La versión v2 llamará al servicio de calificaciones y utilizará de 1 a 5 íconos de estrellas negras para mostrar información de calificación.
La versión v3 llamará al servicio de calificaciones y utilizará de 1 a 5 íconos de estrellas rojas para mostrar información de calificación.
La siguiente figura muestra la arquitectura de un extremo a otro de esta aplicación.
imagen.png

Implemente la aplicación de muestra Bookinfo :

bookinfo.yaml

##################################################################################################
# Details service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: details
  labels:
    app: details
    service: details
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: details
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-details
  labels:
    account: details
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: details-v1
  labels:
    app: details
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: details
      version: v1
  template:
    metadata:
      labels:
        app: details
        version: v1
    spec:
      serviceAccountName: bookinfo-details
      containers:
      - name: details
        image: docker.io/istio/examples-bookinfo-details-v1:1.16.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        securityContext:
          runAsUser: 1000
---
##################################################################################################
# Ratings service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: ratings
  labels:
    app: ratings
    service: ratings
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: ratings
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-ratings
  labels:
    account: ratings
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ratings-v1
  labels:
    app: ratings
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ratings
      version: v1
  template:
    metadata:
      labels:
        app: ratings
        version: v1
    spec:
      serviceAccountName: bookinfo-ratings
      containers:
      - name: ratings
        image: docker.io/istio/examples-bookinfo-ratings-v1:1.16.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        securityContext:
          runAsUser: 1000
---
##################################################################################################
# Reviews service
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: reviews
  labels:
    app: reviews
    service: reviews
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: reviews
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-reviews
  labels:
    account: reviews
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v1
  labels:
    app: reviews
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: reviews
      version: v1
  template:
    metadata:
      labels:
        app: reviews
        version: v1
    spec:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: docker.io/istio/examples-bookinfo-reviews-v1:1.16.2
        imagePullPolicy: IfNotPresent
        env:
        - name: LOG_DIR
          value: "/tmp/logs"
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: wlp-output
          mountPath: /opt/ibm/wlp/output
        securityContext:
          runAsUser: 1000
      volumes:
      - name: wlp-output
        emptyDir: {
    
    }
      - name: tmp
        emptyDir: {
    
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v2
  labels:
    app: reviews
    version: v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: reviews
      version: v2
  template:
    metadata:
      labels:
        app: reviews
        version: v2
    spec:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: docker.io/istio/examples-bookinfo-reviews-v2:1.16.2
        imagePullPolicy: IfNotPresent
        env:
        - name: LOG_DIR
          value: "/tmp/logs"
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: wlp-output
          mountPath: /opt/ibm/wlp/output
        securityContext:
          runAsUser: 1000
      volumes:
      - name: wlp-output
        emptyDir: {
    
    }
      - name: tmp
        emptyDir: {
    
    }
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: reviews-v3
  labels:
    app: reviews
    version: v3
spec:
  replicas: 1
  selector:
    matchLabels:
      app: reviews
      version: v3
  template:
    metadata:
      labels:
        app: reviews
        version: v3
    spec:
      serviceAccountName: bookinfo-reviews
      containers:
      - name: reviews
        image: docker.io/istio/examples-bookinfo-reviews-v3:1.16.2
        imagePullPolicy: IfNotPresent
        env:
        - name: LOG_DIR
          value: "/tmp/logs"
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        - name: wlp-output
          mountPath: /opt/ibm/wlp/output
        securityContext:
          runAsUser: 1000
      volumes:
      - name: wlp-output
        emptyDir: {
    
    }
      - name: tmp
        emptyDir: {
    
    }
---
##################################################################################################
# Productpage services
##################################################################################################
apiVersion: v1
kind: Service
metadata:
  name: productpage
  labels:
    app: productpage
    service: productpage
spec:
  ports:
  - port: 9080
    name: http
  selector:
    app: productpage
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: bookinfo-productpage
  labels:
    account: productpage
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: productpage-v1
  labels:
    app: productpage
    version: v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: productpage
      version: v1
  template:
    metadata:
      labels:
        app: productpage
        version: v1
    spec:
      serviceAccountName: bookinfo-productpage
      containers:
      - name: productpage
        image: docker.io/istio/examples-bookinfo-productpage-v1:1.16.2
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 9080
        volumeMounts:
        - name: tmp
          mountPath: /tmp
        securityContext:
          runAsUser: 1000
      volumes:
      - name: tmp
        emptyDir: {
    
    }
---

Implementar información del libro

kubectl apply -f samples/bookinfo/platform/kube/bookinfo.yaml

kubectl get po


#测试页面
kubectl exec "$(kubectl get pod -l app=ratings -o jsonpath='{.items[0].metadata.name}')" -c ratings -- curl -sS productpage:9080/productpage | grep -o "<title>.*</title>"


4. Abrir aplicaciones al mundo exterior

En este punto, la aplicación BookInfo se ha implementado, pero el mundo exterior aún no puede acceder a ella. Para abrir el acceso, debe crear una Istio Ingress Gateway , que asigna una ruta a una ruta en el borde de la malla.

  1. Asocie la aplicación a la puerta de enlace de Istio:

Si el clúster se ejecuta en un entorno que no admite balanceadores de carga externos (por ejemplo: minikube), la IP EXTERNA de istio-ingressgateway se mostrará como estado. Utilice el NodePort del servicio o el reenvío de puertos para acceder a la puerta de enlace.

kubectl apply -f samples/bookinfo/networking/bookinfo-gateway.yaml

kubectl get svc -n istio-system

#服务的 NodePort
kubectl -n istio-system edit svc istio-ingressgateway

kubectl get svc -n istio-system

Asegúrese de que no haya problemas con el archivo de configuración:

istioctl analyze

Determinar la IP y el puerto entrantes

Siga las instrucciones a continuación: Si su entorno no tiene un equilibrador de carga externo, seleccione un puerto de nodo.
Establecer puerto de entrada


export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].nodePort}')
export SECURE_INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="https")].nodePort}')

#ceph1主机Ip
export INGRESS_HOST=ceph1

export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

echo "$GATEWAY_URL"

echo "http://$GATEWAY_URL/productpage"

Verificar el acceso externo

Utilice un navegador para ver la página del producto de la aplicación Bookinfo y verificar que Bookinfo haya habilitado el acceso externo.

  1. Ejecute el siguiente comando para obtener la dirección de acceso externo de la aplicación Bookinfo.
kubectl get svc istio-ingressgateway -n istio-system


curl ceph1:31479/productpage



for i in `seq 1 100`; do curl -s -o /dev/null http://ceph1:31479/productpage; done


Copie y pegue la dirección de salida del comando anterior en el navegador y acceda a él para confirmar si se puede abrir la página del producto de la aplicación Bookinfo.

5. Ver el panel

Istio se integra con varias aplicaciones de telemetría. La telemetría puede ayudarle a comprender la estructura de la malla de servicios, mostrar la topología de la red y analizar el estado de la malla.
Utilice las instrucciones a continuación para implementar un panel de Kiali , así como Prometheus , Grafana y Jaeger .

  1. Instale Kiali y otros complementos y espere a que se complete la implementación.
kubectl apply -f samples/addons

kubectl rollout status deployment/kiali -n istio-system


2. Modificar el acceso externo de Kiali NodePort

kubectl -n istio-system get svc

kubectl -n istio-system edit svc kiali

#type: NodePort


kubectl -n istio-system get svc |grep kiali

#访问 Kiali 仪表板  
http://ceph1:32514

En el menú de navegación de la izquierda, seleccione Gráfico y luego, en la lista desplegable Espacio de nombres , seleccione predeterminado .
Para ver los datos de seguimiento, debe enviar una solicitud al servicio. La cantidad de solicitudes depende de la frecuencia de muestreo de Istio. La frecuencia de muestreo se establece al instalar Istio y la frecuencia de muestreo predeterminada es del 1%. Debe enviar al menos 100 solicitudes antes de que el primer seguimiento sea visible. Utilice el siguiente comando para enviar 100 solicitudes al servicio de página de producto:

URL de prueba

for i in `seq 1 100`; do curl -s -o /dev/null http://ceph1:31479/productpage; done

Configuración de Kiali
imagen.png

6. Pruebe la istio

1. Aplicar reglas de destino predeterminadas

Cree una regla de destino
para cada servicio . Antes de usar Istio para controlar el enrutamiento de la versión de Bookinfo, debe definir las versiones disponibles en la regla de destino y nombrarlas como subconjuntos.

#设置
kubectl apply -f samples/bookinfo/networking/destination-rule-all.yaml

#查询
kubectl get destinationrules -o yaml

En este punto, Istio ha completado todas las adquisiciones y se completa la implementación del primer ejemplo.

2. Solicitar enrutamiento

Ruta por versión

Actualmente hay tres versiones de reseñas. Visita la página /product de la aplicación Bookinfo en tu navegador y actualízala varias veces. Hemos descubierto que a veces el resultado de las reseñas de libros incluye calificaciones con estrellas y otras no. Esto se debe a que no existe una ruta de versión de servicio predeterminada explícita.

Lo que debemos hacer ahora es dejar que istio se haga cargo del enrutamiento, como enrutar todo el tráfico a la versión v1 de cada microservicio. Istio es muy simple de implementar, solo agregue un servicio virtual (VirtualService).

3. Ejemplo: enrutar todo el tráfico a la versión v1 de cada microservicio

#virtual-service-all-v1.yaml是官方提供的示例文件

kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

Su contenido es el siguiente:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: productpage
spec:
  hosts:
  - productpage
  http:
  - route:
    - destination:
        host: productpage
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1  #在这里指定了所有的http请求都通过v1完成,而v1在默认的规则中有定义
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: details
spec:
  hosts:
  - details
  http:
  - route:
    - destination:
        host: details
        subset: v1
---

Después de las pruebas, se descubrió que las reseñas ya no cambian de estilo.

4. Enrutamiento según diferentes identidades de usuario

  接下来,您将更改路由配置,以便将来自特定用户的所有流量路由到特定服务版本。在这,来自名为 Jason 的用户的所有流量将被路由到服务 reviews:v2。
  请注意,Istio 对用户身份没有任何特殊的内置机制。事实上,productpage 服务在所有到 reviews 服务的 HTTP 请求中都增加了一个自定义的 end-user 请求头,从而达到了本例子的效果。

Recuerde, reviews:v2 es la versión que incluye la función de calificación por estrellas.

  1. Ejecute el siguiente comando para habilitar el enrutamiento basado en usuarios:
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-test-v2.yaml

2. Confirme que la regla ha sido creada.

kubectl get virtualservice reviews -o yaml

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
  ...
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1

3. En la página /producto de la aplicación Bookinfo, inicie sesión como usuario jason.
Actualiza el navegador. ¿Que ves? Aparece una calificación de estrellas al lado de cada reseña.

4. Inicie sesión como un usuario diferente (elija el nombre que desee).
Actualiza el navegador. Ahora las estrellas se han ido. Esto se debe a que el tráfico de todos los usuarios, excepto Jason, se dirige a reseñas: v1.

Ha configurado Istio correctamente para enrutar el tráfico según la identidad del usuario.

5. Lanzamiento de transferencia de tráfico en escala de grises

También puede transferir parte del tráfico de reseñas a la versión v3, en función de la cual se pueden implementar publicaciones en escala de grises, pruebas A/B, etc.:

#将所有流量都路由到每个服务的v1版本
kubectl apply -f samples/bookinfo/networking/virtual-service-all-v1.yaml

#将reviews服务 50%的流量转移到v3
kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-50-v3.yaml

El contenido es el siguiente:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
    - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1
      weight: 50
    - destination:
        host: reviews
        subset: v3
      weight: 50

Actualice la página /productpage en el navegador y habrá aproximadamente un 50 % de posibilidades de que vea contenido de evaluación con estrellas rojas en la página. Esto se debe a que las reseñas de la versión 3 acceden al servicio de calificaciones con calificaciones de estrellas, pero la versión 1 no.

Si cree que el microservicio reviews:v3 es estable, puede dirigir el 100% del tráfico a reviews:v3 aplicando esta regla de servicio virtual:

#将reviews服务的全部流量都切换到v3版本

kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v3.yaml

De esta forma, todas las solicitudes se reenvían a la versión 3.
Si necesita eliminar la red virtual de todos los servicios, puede ejecutar:

kubectl delete -f samples/bookinfo/networking/virtual-service-all-v1.yaml

La información de enrutamiento de todos los servicios se configura en el archivo de configuración virtual-service-all-v1.yaml. Si se elimina, se eliminará toda la información de enrutamiento.

6. Tiempo de espera

El tiempo de espera para las solicitudes http se puede especificar utilizando el campo de tiempo de espera de las reglas de enrutamiento. De forma predeterminada, los tiempos de espera están deshabilitados

Aquí experimentaremos con el tiempo de espera de solicitud del servicio de revisiones y enrutaremos la solicitud a la versión v2 del servicio de revisiones, que llamará al servicio de calificaciones. Primero introducimos artificialmente un retraso de 2 segundos (inyección de fallas) en el servicio de calificaciones, y luego configure el tiempo de espera para el servicio de reseñas timeout
1. Cree un archivo de configuración en el directorio /samples/bookinfo/networking

#创建配置文件
cat > samples/bookinfo/networking/virtual-service-reviews-v2-timeout.yaml <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      delay:
        percent: 100
        fixedDelay: 2s
    route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
    #timeout: 0.5s
EOF

Inyecte un retraso de 2 segundos en el servicio de calificaciones,

2. Para aplicar la configuración de enrutamiento, simplemente ejecútela en el directorio actual.

kubectl apply -f samples/bookinfo/networking/virtual-service-reviews-v2-timeout.yaml

3. Visite el sitio web. Puede ver que la aplicación Bookinfo se está ejecutando normalmente (se muestra el símbolo de estrella de la calificación), pero habrá un retraso de 2 segundos cada vez que se actualice la página.

4. Vuelva a editar el archivo, libere la llamada al servicio de revisiones y agregue un tiempo de espera de solicitud de medio segundo (elimine el comentario de tiempo de espera)

5. Vuelva a aplicar la configuración o ejecute el comando en el paso 2 y luego verifique si la configuración se actualiza mediante el siguiente comando

kubectl get virtualservice -o yaml

6. Actualice la página web nuevamente.
En este momento, debería ver que regresará en 1 segundo en lugar de los 2 segundos anteriores, pero las reseñas no están disponibles (la página no tiene datos de reseñas).

Aunque el tiempo de espera está configurado en medio segundo, la respuesta aún demora 1 segundo porque hay reintentos codificados en el servicio de página del producto, por lo que llama al servicio de revisiones para que expire el tiempo de espera (reintento) dos veces antes de regresar.

7. Inténtalo de nuevo

Describe la estrategia de reintento que se utilizará cuando falla una solicitud HTTP. Por ejemplo, la siguiente regla establece el máximo de reintentos en 3 al llamar a la calificación: Servicio V1, el tiempo de espera de cada reintento es de 2 segundos.

#创建配置文件
cat > samples/bookinfo/networking/ratings-route-v1-request-timeout.yaml <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings-route
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
    retries:
      attempts: 3
      perTryTimeout: 2s
      retryOn: gateway-error,connect-failure,refused-stream
EOF


kubectl apply -f samples/bookinfo/networking/ratings-route-v1-request-timeout.yaml

8. Fusión

Los disyuntores son un mecanismo útil proporcionado por Istio para crear aplicaciones de microservicios resistentes. En un disyuntor, establezca un límite para una sola llamada de host en el servicio, como la cantidad de conexiones simultáneas o la cantidad de llamadas fallidas a ese host. Una vez que se activa el límite, el fusible "se dispara" y deja de conectarse a ese host.

Utilice el modo de disyuntor para fallar rápidamente sin que los clientes intenten conectarse a un host sobrecargado o defectuoso.
Implementar httpbin

httpbin es un proyecto de código abierto escrito en Python+Flask, que se puede utilizar para probar varias solicitudes y respuestas HTTP. Sitio web oficial: http://httpbin.org/

kubectl apply -f samples/httpbin/httpbin.yaml

El contenido de este archivo de configuración es:

##################################################################################################
# httpbin service
##################################################################################################
apiVersion: v1
kind: ServiceAccount
metadata:
  name: httpbin
---
apiVersion: v1
kind: Service
metadata:
  name: httpbin
  labels:
    app: httpbin
spec:
  ports:
  - name: http
    port: 8000
    targetPort: 80
  selector:
    app: httpbin
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: httpbin
spec:
  replicas: 1
  selector:
    matchLabels:
      app: httpbin
      version: v1
  template:
    metadata:
      labels:
        app: httpbin
        version: v1
    spec:
      serviceAccountName: httpbin
      containers:
      - image: docker.io/kennethreitz/httpbin
        imagePullPolicy: IfNotPresent
        name: httpbin
        ports:
        - containerPort: 80

8.1 Configurar el disyuntor.
Cree una regla de disyuntor de destino (DestinationRule) y aplique la configuración del disyuntor al llamar al servicio httpbin:

kubectl apply -f - <<EOF
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1  #最大连接数
      http:
        http1MaxPendingRequests: 1  #http请求pending状态的最大请求数
        maxRequestsPerConnection: 1  #在一定时间内限制对后端服务发起的最大请求数
    outlierDetection:  #熔断设置
      consecutiveErrors: 1  #从连接池开始拒绝连接,已经连接失败的次数,当通过HTTP访问时,返回代码是502、503或504则视为错误。
      interval: 1s  #拒绝访问扫描的时间间隔,即在interval(1s)内连续发生1个consecutiveErrors错误,则触发服务熔断,格式是1h/1m/1s/1ms,但必须大于等于1ms。即分析是否需要剔除的频率,多久分析一次,默认10秒。
      baseEjectionTime: 3m  #最短拒绝访问时长。这个时间主机将保持拒绝访问,且如果决绝访问达到一定的次数。格式:1h/1m/1s/1ms,但必须大于等于1ms。实例被剔除后,至少多久不得返回负载均衡池,默认是30秒。
      maxEjectionPercent: 100  #服务在负载均衡池中被拒绝访问(被移除)的最大百分比,负载均衡池中最多有多大比例被剔除,默认是10%。
EOF

Verifique que la regla de destino se haya creado correctamente:

kubectl get destinationrule httpbin -o yaml

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
  ...
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
      tcp:
        maxConnections: 1
    outlierDetection:
      baseEjectionTime: 180.000s
      consecutiveErrors: 1
      interval: 1.000s
      maxEjectionPercent: 100

cliente

Cree un programa cliente para enviar tráfico al servicio httpbin. Este es un cliente de prueba de carga llamado Fortio, que puede controlar la cantidad de conexiones, la cantidad de concurrencia y el retraso en el envío de solicitudes HTTP. Fortio puede activar efectivamente la política de disyuntor establecida previamente en DestinationRule.

kubectl apply -f samples/httpbin/sample-client/fortio-deploy.yaml

kubectl get po


¡Espere un momento hasta que el cliente se implemente exitosamente! ! !

Inicie sesión en el Pod del cliente y utilice la herramienta Fortio para llamar al servicio httpbin. El parámetro -curl indica el envío de una llamada:

$ FORTIO_POD=$(kubectl get pod | grep fortio | awk '{ print $1 }')
$ kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -curl  http://httpbin:8000/get
HTTP/1.1 200 OK
server: envoy
date: Tue, 16 Jan 2018 23:47:00 GMT
content-type: application/json
access-control-allow-origin: *
access-control-allow-credentials: true
content-length: 445
x-envoy-upstream-service-time: 36

{
    
    
  "args": {
    
    },
  "headers": {
    
    
    "Content-Length": "0",
    "Host": "httpbin:8000",
    "User-Agent": "istio/fortio-0.6.2",
    "X-B3-Sampled": "1",
    "X-B3-Spanid": "824fbd828d809bf4",
    "X-B3-Traceid": "824fbd828d809bf4",
    "X-Ot-Span-Context": "824fbd828d809bf4;824fbd828d809bf4;0000000000000000",
    "X-Request-Id": "1ad2de20-806e-9622-949a-bd1d9735a3f4"
  },
  "origin": "127.0.0.1",
  "url": "http://httpbin:8000/get"
}

¡Puede ver que la solicitud para llamar al servicio backend ha sido exitosa! A continuación, puede probar la fusión.

Activación del disyuntor
En la configuración de DestinationRule, se definen maxConnections: 1 y http1MaxPendingRequests: 1. Estas reglas significan que si hay más de una conexión y solicitud simultáneas, las solicitudes o conexiones posteriores se bloquearán mientras istio-proxy realiza más solicitudes y conexiones.

发送并发数为 2 的连接(-c 2),请求 20 次(-n 20):
[root@node1 istio-1.6.5]# kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -c 2 -qps 0 -n 20 -loglevel Warning http://httpbin:8000/get
...
Code 200 : 14 (70.0 %)
Code 503 : 6 (30.0 %)
...

Aumente el número de conexiones simultáneas a 3:

[root@node1 istio-1.6.5]# kubectl exec -it $FORTIO_POD  -c fortio -- /usr/bin/fortio load -c 3 -qps 0 -n 30 -loglevel Warning http://httpbin:8000/get
...
Code 200 : 11 (36.7 %)
Code 503 : 19 (63.3 %)
...

Consulte el estado de istio-proxy para obtener más detalles del disyuntor:

[root@ceph1 istio-1.11.7]# kubectl exec $FORTIO_POD -c istio-proxy -- pilot-agent request GET stats | grep httpbin | grep pending
cluster.outbound|8000||httpbin.default.svc.cluster.local.circuit_breakers.default.remaining_pending: 1
cluster.outbound|8000||httpbin.default.svc.cluster.local.circuit_breakers.default.rq_pending_open: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.circuit_breakers.high.rq_pending_open: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_active: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_failure_eject: 0
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_overflow: 89
cluster.outbound|8000||httpbin.default.svc.cluster.local.upstream_rq_pending_total: 114

Puede ver que el valor upstream_rq_pending_overflow es 89, lo que significa que hasta ahora se han marcado 89 llamadas como fallidas.

9. Limpiar httpbin

#清理规则:
kubectl delete destinationrule httpbin


#下线 httpbin 服务和客户端:
kubectl delete deploy httpbin fortio-deploy
kubectl delete svc httpbin

Blog de referencia
https://blog.csdn.net/bxg_kyjgs/article/details/125599452?utm_source=miniapp_weixin

Supongo que te gusta

Origin blog.csdn.net/qq_35583325/article/details/132564350
Recomendado
Clasificación