Una exploración detallada de la gobernanza de recursos en la nube de Jikr Automobile

Autor: Wu Chao de Extreme Krypton Automobile

imagen

Prefacio

En 2021, Jikrypton 001 surgió rápidamente, estableciendo un récord de entrega del primer modelo "más rápido en superar los 10.000" en solo 110 días. En noviembre de 2022, Jikrypton 009 tomó la delantera al completar el primer lote de entregas en solo 76 días, estableciendo un nuevo récord en la velocidad de entrega de las marcas eléctricas puras de lujo de China. En junio de 2023, Jikr Auto entregó otros 10.620 vehículos, convirtiéndose en la única marca de lujo puramente eléctrica que ha mantenido un crecimiento interanual durante cinco meses consecutivos. Hasta ahora, Jikrypton 001 se ha convertido en el automóvil de lujo más rápido del mundo en superar las 100.000 ventas y una vez más ocupa el primer lugar en las ventas de vehículos eléctricos puros por encima de los 300.000 yuanes.

En los últimos dos años, el negocio de Jikrypton Automotive ha acelerado su desarrollo y el departamento de desarrollo digital se ha enfrentado a enormes desafíos. Como departamento técnico que respalda muchos sistemas centrales, como el cumplimiento y entrega de contratos de la empresa, la entrega de vehículos, el pago y la liquidación, etc., el equipo necesita lidiar con lanzamientos de aplicaciones de diferentes escalas casi todos los días y el consumo de recursos de la nube requerido por El sistema de aplicaciones aumenta día a día. Anteriormente, para garantizar un apoyo eficaz al rápido desarrollo empresarial, la estructura general de la infraestructura carecía de una planificación general de alto nivel y la situación era como de crecimiento salvaje. Aunque la empresa sigue batiendo récords de entrega en el sector, detrás de este loco crecimiento se esconde un marco de infraestructura y unos gastos de costes que están a punto de salirse de control, lo que conlleva grandes riesgos y peligros ocultos para el desarrollo sostenible de los negocios futuros. .

Por lo tanto, a partir del año pasado, el equipo técnico de nivel medio estableció objetivos técnicos claros y se esforzó por establecer un equipo especial lo antes posible para rectificar profundamente los problemas de infraestructura existentes. El equipo espera acompañar el desarrollo sostenible de la futura infraestructura de Jikr Auto mejorando la infraestructura.

desafíos de gestión

El primer problema que tenemos ante nosotros es la gestión de recursos en escenarios nativos de la nube.

De hecho, desde 2021 hemos iniciado un plan de transformación de microservicios y contenerización, y más del 90% de los servicios se construyen e implementan en forma de contenedores. Cuando se discutía cómo optimizar la configuración de los recursos informáticos en los primeros días, el enfoque convencional era detectar la utilización de recursos del servidor y ajustar los recursos de acuerdo con el uso máximo de CPU/memoria para los recursos cuya utilización no excediera un cierto umbral. Sin embargo, en un entorno nativo de la nube, debido a que Kubernetes proporciona descripciones semánticas de solicitudes de recursos (Solicitudes) y límites de recursos (Límites) para la gestión de recursos del contenedor, las aplicaciones pueden sobreasignarse en los recursos del servidor correspondientes. Si es solo un análisis simple La tasa de utilización de recursos informáticos, al ignorar la tasa de asignación de recursos, puede resultar en la imposibilidad de programar contenedores para los nodos correspondientes debido a recursos insuficientes cuando se lanza la siguiente aplicación.

Actualmente, la compañía utiliza Alibaba Cloud y múltiples plataformas de nube privada para ejecutar docenas de clústeres K8. Al mismo tiempo, estos clústeres transportan miles de nodos Pod. Cuando realmente se ejecuta el sistema de aplicaciones, la tasa de utilización de muchos servicios no es alta, lo que resulta en Un enorme desperdicio de recursos. Pero cuando comenzamos a hacer planes para optimizar estos recursos, encontramos muchos desafíos:

  1. La complejidad de la gestión de recursos es alta: en comparación con las aplicaciones implementadas directamente en servidores, la ventaja de la arquitectura nativa de la nube es que la gestión de los recursos informáticos subyacentes es más refinada y el método de programación de recursos basado en clústeres tiene un impacto significativo en la mejora de la utilización del clúster. Pero el problema que trae consigo es el de la complejidad de la gestión. La gestión unificada de aplicaciones a través de un clúster reduce el costo general de los recursos, pero complica la contabilidad y la división de cuentas. Al principio, para resolver escenarios como la contabilidad y el control de permisos para cada negocio, los equipos funcionales creaban diferentes clústeres K8 respectivamente. Se entregó al equipo del proyecto correspondiente para implementar el sistema de aplicaciones, pero la utilización de recursos del clúster no se mejoró de manera efectiva. Al mismo tiempo, a medida que el negocio continúa expandiéndose, estos grupos involucran diferentes departamentos y diferentes entornos, y las versiones se han vuelto cada vez más diferentes. Durante la implementación de la aplicación, debido al nivel desigual del personal de administración, la operación y el mantenimiento diarios y el diagnóstico de problemas consumen mucho tiempo.
  2. La asignación de recursos no es lo suficientemente inteligente: las categorías comerciales varían ampliamente, incluida la administración de operaciones del lado B y las aplicaciones de alta concurrencia del lado C. Aunque K8 proporciona un método de asignación de recursos, es difícil para el personal de operación y mantenimiento predecir la situación real del tráfico. Como resultado, es difícil asignar razonablemente tamaños de recursos de CPU/memoria, y solo se dan especificaciones predeterminadas basadas en parámetros empíricos.
  3. Cómo lograr el largo plazo: al formular estrategias, nos preocupa que tales actividades de optimización de la arquitectura de estilo deportivo, incluso si se invierte una gran cantidad de costos laborales, solo puedan hacer que la gestión de recursos "luzca hermosa" en el corto plazo y con la arquitectura empresarial Después de ajustes continuos, o el impacto en la estabilidad de la optimización de recursos, la confianza en la operación continua y la gestión de recursos en el futuro disminuirá, haciendo que el beneficio marginal de la inversión de costos original tienda a cero.

objetivo de negocio

Para hacer frente a las deficiencias en la gobernanza de los recursos de la nube y las diferencias en las capacidades de las diferentes plataformas de la nube, hemos considerado si necesitamos establecer una plataforma de administración de múltiples nubes CMP para administrar de manera uniforme las plataformas de la nube y las cuentas involucradas. Sin embargo, al evaluar si iniciar un proyecto, creemos que el concepto de gestión de múltiples nubes "centrado en recursos" en la era nativa de la nube no puede cumplir con nuestras expectativas para el diseño de arquitectura de aplicaciones. Este método de gestión no solo tiene costos de desarrollo extremadamente altos, sino que también necesita adaptarse a diferentes interfaces de múltiples proveedores de nube. Su importancia para la gestión de recursos no es tan grande como se imagina, solo resuelve parte del trabajo de activación y creación de recursos, pero Estos no son los escenarios centrales y el trabajo de gestión de aplicaciones en un entorno nativo de la nube.

La arquitectura de infraestructura actual de Jikrypton se basa principalmente en clústeres K8, lo que significa que siempre que estos clústeres se puedan administrar bien, los recursos se pueden administrar bien, lo que proporciona un mayor valor al sistema empresarial de capa superior. Por lo tanto, cuando diseñamos la solución de gestión de recursos, abandonamos por completo el concepto de gestión de recursos de múltiples nubes centrado en los recursos de CMP y nos centramos en la gestión de la infraestructura nativa de la nube.

El equipo de tecnología de la plataforma define los objetivos del proyecto en el dominio de gestión de recursos como: costos visibles, uso controlable y configuraciones manejables. Los problemas actuales que deben resolverse incluyen:

1. Conocimiento y análisis de costos: diseñe un modelo de amortización de costos más refinado para ver claramente los gastos de costos de cada negocio. Al mismo tiempo, proporciona un análisis inteligente de la utilización de recursos Pod para diferentes negocios, ayudando a los ingenieros de implementación de operación y mantenimiento a hacer razonables decisiones al lanzar aplicaciones Establecer especificaciones de recursos;

2. Verificación de la línea de base de la configuración: realice una verificación de la línea de base para detectar problemas de cumplimiento de la configuración del script de implementación existente para garantizar que la configuración ajustada y optimizada pueda cumplir con el monitoreo diario, la autorreparación de fallas y otros escenarios;

3. Convergencia de la cantidad de clústeres K8: sin afectar el negocio, algunos clústeres K8 inactivos con pequeños volúmenes de negocios se fusionarán para converger la cantidad de clústeres y reducir la complejidad arquitectónica y los costos de administración;

4. Infraestructura apátrida: teniendo en cuenta que en el futuro los negocios en el extranjero pueden implementarse en proveedores de nube que actualmente no están cubiertos, esperamos utilizar K8 como base tecnológica estándar para hacer que la infraestructura sea lo más apátrida posible. Durante el proceso de lanzamiento de la aplicación, solo unos pocos Es necesario cambiar los parámetros para completar el trabajo de la solicitud en línea.

Selección de solución

Amortización de costos

Dado que la mayoría de las aplicaciones actuales de Jikrpton se implementan en Alibaba Cloud, según el principio 28-20, primero investigamos la solución ACK FinOps de Alibaba Cloud. Para el estado actual de la infraestructura de Krypton, la suite ACK FinOps es una buena opción, que incluye soluciones de análisis de costos en cuatro dimensiones: clúster, espacio de nombres (Namespace), grupo de nodos y aplicación.

Con la ayuda del análisis de costos en las dimensiones del espacio de nombres y la aplicación, este tipo de lógica contable basada en el uso real de recursos hace que la asignación de facturas ya no se limite a la unidad del servidor, proporcionando así también el soporte de capacidad necesario para la futura convergencia de la cantidad de clústeres K8. .

Sin embargo, en un escenario nativo de la nube, es necesario considerar más dimensiones de escenarios comerciales para la amortización de costos a nivel de contenedor. Por ejemplo, para un servidor 4C32G, los recursos se asignan a 3C/8G, en este momento los recursos de la CPU afectan el cuello de botella de los recursos restantes del servidor y viceversa. Además, el modelo de recursos de pod de K8 admite la asignación de recursos en dos dimensiones: solicitud y límite, y es la solicitud la que afecta la programación de recursos. Para algunos nodos que están configurados en niveles BestEffort o Burstable QoS y cuyos recursos están sobrevendidos, es difícil juzgar la racionalidad lógica basándose enteramente en un determinado indicador.

El modelo de asignación de costos de ACK FinOps nos brinda opciones más ricas y puede proporcionar una variedad de implementaciones lógicas diferentes, como modelos de asignación de recursos unidimensionales y modelos de asignación de recursos mixtos ponderados basados ​​en CPU y memoria.

La ventaja del modelo de asignación de recursos unidimensional es el bajo costo de interpretación. La lógica de cálculo del costo de Pod es aproximadamente la siguiente:

* Costo del pod = (solicitud de recursos del pod (Solicitud) / recurso total del nodo) precio unitario del nodo.

El equipo empresarial solo paga por el uso real. Cuando la escala del clúster K8 es grande, la cantidad de recursos inactivos restantes que no se han asignado es menor, lo que también ilustra las capacidades de gobernanza del equipo de la plataforma en la nube.

Con respecto al modelo de intercambio de recursos mixto ponderado, lo que esencialmente debe resolverse es que dentro del mismo clúster, está lleno de diversos escenarios comerciales y pilas de tecnología de desarrollo. Por ejemplo, para un servidor 4C8G, se implementan un servicio 1C6G y un servicio 2C1G al mismo tiempo. Este uso, ya sea basado en la memoria o los recursos de la aplicación de la CPU como base para la amortización de costos, obviamente no es razonable.

Después de investigar dos modelos de asignación diferentes, considerando que el lenguaje de desarrollo empresarial actual de Jikrypton es principalmente una pila de tecnología Java, los Pods de aplicaciones solicitarán una gran cantidad de recursos de memoria del clúster, lo que provocará un aumento en el nivel de programación de la memoria. Aunque el costo unitario de la memoria es mucho más barato que el de la CPU, para este escenario empresarial, la memoria se ha convertido en el cuello de botella que determina si es necesario expandir el clúster. Al mismo tiempo, a diferencia de la QoS de la CPU, que tiene una sobreventa explícita, la tasa de utilización de los recursos de memoria es casi igual a la tasa de asignación, por lo que en este escenario utilizamos un modelo de recurso único como modelo de asignación de costos del departamento.

Otro problema es la granularidad de la contabilidad de costos. En el futuro, después de que la arquitectura general de la plataforma haya completado la convergencia del número de clústeres, el aislamiento lógico se realizará en el nivel del espacio de nombres de acuerdo con la dimensión del sistema. El método de contabilidad del espacio de nombres puede satisfacer las necesidades comerciales. necesidades.

imagen
Información sobre costos de ACK

En este punto, básicamente se ha determinado la dirección estratégica general del costo compartido de los contenedores de aplicaciones nativas de la nube.

Análisis del nivel de recursos hídricos.

En cuanto a la optimización de las cuotas de recursos del contenedor de aplicaciones, se centra principalmente en dos aspectos: CPU y memoria:

  • Optimización de recursos de CPU: si solo ajusta el nivel de QoS del Pod y ajusta el valor de Solicitud de la CPU, aunque se pueden sobrevender más recursos de CPU para la implementación de recursos en el corto plazo, para aplicaciones en línea, una vez que la carga de trabajo es demasiado alta, Es fácil que se produzca una contención de recursos, lo que resulta en el desalojo de los servicios.
  • Optimización de recursos de memoria: dado que los recursos de memoria de Java estarán ocupados durante mucho tiempo al iniciar la JVM, a medida que aumenta el tiempo de ejecución de la aplicación, algunos servicios con código de mala calidad gradualmente tendrán memoria que no se recuperará a tiempo, lo que provocará un desbordamiento de la memoria OOM. Para evitar daños comerciales causados ​​por una asignación insuficiente de recursos de memoria del Pod, la solicitud/límite establecido por los ingenieros al iniciar un Pod suele ser un cierto porcentaje mayor que la memoria de pila de la JVM. Al optimizar la memoria, también es necesario considerar los riesgos potenciales de OOM del negocio.

 La capacidad de creación de perfiles de recursos proporcionada por el servicio de contenedor ACK, que viene con el paquete gratuito ack-koordinator, puede ayudarnos a identificar recursos en el clúster que no se utilizan razonablemente de manera continua y a largo plazo, y proporcionar valores recomendados como una base de referencia para implementar lacontenedores.Las

El retrato de recursos ACK generará un valor de retrato para cada especificación de recurso de contenedor de la carga de trabajo. Al comparar el valor de retrato (Recomendar), la cantidad de solicitud de recursos original (Solicitud) y la redundancia de consumo de recursos (Buffer) de la configuración del perfil, el recurso La consola vertical generará solicitudes de acciones para cargas de trabajo, como aumentar o disminuir las solicitudes de recursos (es decir, actualizar o degradar). Si la carga de trabajo tiene varios contenedores, se mostrará el contenedor con la mayor desviación.

Cuando el valor del retrato es mayor que la cantidad de solicitud de recursos original: significa que el contenedor ha estado en un estado de uso excesivo de recursos durante mucho tiempo y existe un riesgo de estabilidad. Las especificaciones de recursos deben aumentarse de manera oportuna. Se recomienda actualizar la consola. una actualización para evitar riesgos de estabilidad en futuras operaciones. Cuando el valor del retrato es menor que la cantidad de solicitud de recursos original, significa que el contenedor puede desperdiciar recursos hasta cierto punto y las especificaciones de recursos se pueden reducir.

imagen

Su algoritmo subyacente recopilará continuamente los datos de uso de recursos del contenedor, tomará los valores estadísticos agregados de CPU y memoria para generar resultados retratos y adoptará un algoritmo de decadencia periódica para el factor tiempo; al agregar estadísticas, se utilizarán muestreos de datos más nuevos. Se asignarán puntos. El mayor peso también se refiere a la información del estado de ejecución, como OOM del contenedor, lo que mejora aún más la precisión del valor recomendado proporcionado por el retrato de la aplicación. Finalmente, desde la perspectiva de la gestión sostenible de los recursos, esperamos conectar la plataforma de publicación existente con las funciones de retratos de recursos para recomendar automáticamente ajustes de configuración, evitando así una respuesta relativamente retrasada a los ajustes cuando el volumen de negocios cambie en el futuro. Por lo tanto, después de plantear este requisito al equipo de plataforma de aplicaciones nativas en la nube de Alibaba Cloud, recibimos rápidamente una respuesta y ahora podemos proporcionar capacidades API para vincularnos con el proceso de lanzamiento existente de Jikrypton.

imagen
Optimización de la cuota de recursos de lanzamiento de aplicaciones

Administracion de recursos

Gestión de múltiples clústeres de K8 en un entorno de múltiples nubes y, finalmente, sobre cómo resolver los problemas de gestión de recursos en la situación actual de la nube distribuida de Krypton. Dado que actualmente tenemos nubes privadas e IDC, los modelos de facturación en diferentes entornos son bastante diferentes y los modelos financieros también son diferentes, lo que plantea más desafíos para las capacidades de análisis de costos del plano de operación y gestión de múltiples nubes.

Con este fin, hemos elegido ACK One para administrar de manera unificada las docenas de clústeres K8 en línea y fuera de línea involucrados actualmente en Jikrypton, a fin de brindar una mejor coherencia en la gestión de aplicaciones nativas de la nube a los ingenieros que administran clústeres durante el proceso de desarrollo empresarial. ACK One es una plataforma de contenedores de nube distribuida lanzada por Alibaba Cloud para escenarios de nube híbrida, multiclúster y computación distribuida, que puede administrar de manera uniforme clústeres de Kubernetes en Alibaba Cloud, en el borde, implementados en centros de datos de clientes y otras nubes, y Simplifique los clústeres.Interfaz de administración, para satisfacer de manera flexible sus propias necesidades de control y administración de datos y negocios.

Combinado con ACK One, la suite FinOps de Alibaba Cloud Container Service proporciona acceso unificado e implementación predeterminada de facturación y consultas de proveedores de servicios en la nube, admite el acceso a datos de costos de los principales proveedores de servicios en la nube y salas de computadoras de construcción propia de IDC, y utiliza contenedores nativos en la nube consistentes. Modelo de estimación y asignación de costos de escenarios para la gestión de costos. Además, también proporciona gestión de clústeres unificada, programación de recursos unificada, recuperación de desastres de datos unificada y capacidades de entrega de aplicaciones unificadas para múltiples clústeres y múltiples entornos, así como capacidades de gestión financiera unificadas.

imagen
Escenarios de aplicaciones de administración de múltiples clústeres ACK One

Finalmente, la suite ACK FinOps se puede distribuir a entornos de nube híbrida y fuera de línea, lo cual es muy adecuado para analizar el costo de los nodos y aplicaciones IDC en la nube. Dado que ACK FinOps no puede obtener los precios unitarios de los proveedores fuera de línea y de otros proveedores de la nube, ACK One proporciona a cada nodo un método basado en etiquetas para configurar planes de configuración individuales relacionados con los precios.

kubectl label nodes  node.kubernetes.io/price-per-day="100"

Al elegir ACK One como la solución de administración de múltiples clústeres K8 nativa de Krypton Cloud, además del control de costos, funciones como la verificación de configuración y la administración de copias de seguridad también son nuestro enfoque actual. Tomando la verificación de configuración como ejemplo, según las mejores prácticas de seguridad de contenedores de Alibaba Cloud, los riesgos de seguridad de la configuración de aplicaciones de clústeres de nubes múltiples/híbridas se pueden verificar de forma gratuita con un solo clic para garantizar la seguridad, efectividad y estabilidad de la nube híbrida/multinube. aplicaciones de contenedor de clúster, y de manera oportuna se descubrieron posibles riesgos de seguridad y estabilidad en configuraciones de aplicaciones de stock anteriores.

imagen

Las comprobaciones de configuración del módulo de aplicaciones incluyen:

  • Seguridad: configuración de parámetros privilegiados, capacidades del kernel de alto riesgo, inicio del usuario root, ingreso sin TLS habilitado, enlace de permisos de usuarios anónimos, etc.
  • Validez: faltan límites de cuota de recursos de memoria/CPU, etc.
  • Estabilidad: falta de sondas de vida y preparación, inicio de copia única, etc.

Resultados de construcción

A través de la gestión de múltiples clústeres ACK One, el retrato de recursos nativos de la nube y otras funciones proporcionadas por Alibaba Cloud Container Service, JiKr puede lograr una gestión unificada de casi 30 clústeres K8 en línea y fuera de línea. Se han logrado una serie de resultados comerciales sustanciales:

  • Utilización eficiente de recursos

    Al aprovechar la función de creación de perfiles de recursos para analizar el uso de recursos de miles de Pods, las empresas identifican y examinan los recursos inactivos y encuentran posibles problemas de asignación de recursos. Después de solucionar estos problemas, se optimizó la estrategia de implementación, lo que redujo el uso de recursos en casi un 25 % para la empresa. Esta iniciativa ayuda a las empresas a ahorrar millones de dólares en inversiones en costos de TI cada año y mejora significativamente la eficiencia en la utilización de recursos.

  • Garantía de estabilidad del sistema y continuidad del negocio.

    Según las necesidades comerciales, las empresas han desarrollado una variedad de estrategias de respaldo. Para estas políticas, las operaciones de respaldo y recuperación de datos se realizan en la plataforma ACK One. Este enfoque mejora la continuidad del negocio y la seguridad de los datos de la empresa y fortalece aún más la estabilidad del sistema.

  • Gestión centralizada de recursos en nubes y nubes híbridas

    La función de gestión de múltiples clústeres de ACK One permite a las empresas lograr una gestión y mantenimiento centralizados de múltiples clústeres K8 en la plataforma de gestión de contenedores Alibaba Cloud, incluidos entornos en línea y fuera de línea. Esta estructura de gestión unificada reduce la complejidad de las operaciones empresariales y mejora la eficiencia del trabajo.

  • Desarrollo empresarial ágil y respuesta rápida

    Al optimizar la configuración de recursos y clústeres de K8, las empresas pueden ajustar y ampliar los recursos de manera más ágil cuando cambian las necesidades comerciales. Esta arquitectura flexible garantiza que las empresas puedan ajustar rápidamente sus estrategias y mejorar la competitividad cuando cambia el entorno del mercado.

  • Optimización de la estrategia de lanzamiento de aplicaciones

    Con la ayuda de las capacidades de análisis de ACK One, las empresas pueden optimizar las estrategias de lanzamiento de aplicaciones, haciendo así que el sistema sea más estable y eficiente. Las empresas no sólo reducen las tasas de fracaso, sino que también liberan más tiempo y energía para centrarse en la innovación y el desarrollo de su negocio principal.

  • Mejorar las habilidades del equipo y la eficiencia de la cooperación.

    En el proceso de utilizar ACK One para la gestión unificada, el equipo interno de la empresa ha mejorado gradualmente su dominio de los clústeres K8 y las tecnologías de productos relacionados. Además, debido a la colaboración entre varios equipos funcionales en la plataforma ACK One, también se ha mejorado la eficiencia de la cooperación del equipo.

perspectiva del futuro

Hoy en día, la computación en la nube se ha convertido en la infraestructura económica digital de toda la sociedad, y la tecnología nativa de la nube está cambiando profundamente la forma en que las empresas migran y utilizan la nube. Como una de las empresas líderes en vehículos de nueva energía, Jikrypton Automobile ha realizado muchas selecciones clave de tecnologías, arquitecturas y productos en torno a la arquitectura de infraestructura nativa de la nube durante su rápido desarrollo en los últimos dos años, y ha implementado servicios nativos de micro nube. , K8, DevOps, etc. representan tecnologías y capacidades. Al mismo tiempo, en el contexto de la arquitectura de las instalaciones de tecnología de nube distribuida, también ha enfrentado múltiples desafíos y encontrado muchas trampas.

La gobernanza de costos de FinOps en la era nativa de la nube es un gran tema: la Fundación FinOps lo define en tres etapas: análisis de costos (Informar), optimización de costos (Optimizar) y operación continua (Operar). Aunque las dos primeras etapas pueden lograr el objetivo de una rápida reducción de costos de manera más explícita, si no hay una administración y un control de recursos consistentes y refinados, pronto volverá al estado original. Solo incorporando la administración de recursos en el control del proceso de lanzamiento de la aplicación se puede Realmente gestionamos bien la nube y la utilizamos bien. De cara al futuro, aún queda un largo camino por recorrer para garantizar que la arquitectura de la infraestructura tenga la capacidad de lograr un desarrollo sostenible, permitir que las empresas funcionen de manera más estable, eficiente y de bajo costo, aprovechar plenamente el enorme valor de la nube y liberar dividendos tecnológicos.

Supongo que te gusta

Origin blog.csdn.net/alisystemsoftware/article/details/132541160
Recomendado
Clasificación