{"id":77693,"date":"2020-04-13T01:42:39","date_gmt":"2020-04-12T23:42:39","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes"},"modified":"2020-04-13T01:42:39","modified_gmt":"2020-04-12T23:42:39","slug":"cpu-limity-i-agressivnyj-trottling-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes","title":{"rendered":"L\u00edmites de CPU y throttling agresivo en Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><i><b>Nota de traducci\u00f3n.<\/b>: Esta instructiva historia de Omio, un agregador de viajes europeo, lleva a los lectores desde la teor\u00eda b\u00e1sica hasta los emocionantes matices pr\u00e1cticos de la configuraci\u00f3n de Kubernetes. Familiarizarse con tales casos no solo ayuda a ampliar horizontes, sino tambi\u00e9n a prevenir problemas no trivialidades.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"L\u00edmites de CPU y throttling agresivo en Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/1175c9df746e43b5a7d81476164929db.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n\u00bfAlguna vez se ha encontrado con que una aplicaci\u00f3n se \"congela\", deja de responder a las solicitudes de verificaci\u00f3n de estado (health checks) y no puede entender la causa de este comportamiento? Una de las posibles explicaciones est\u00e1 relacionada con el l\u00edmite de cuotas en los recursos de CPU. De eso trata este art\u00edculo.<\/p>\n<p><b>TL;DR:<br \/>\nRecomendamos encarecidamente deshacerse de los l\u00edmites de CPU en Kubernetes (o desactivar las cuotas CFS en Kubelet), si se utiliza una versi\u00f3n del kernel de Linux con el error de cuotas CFS. En el n\u00facleo. <noindex><a rel=\"nofollow\" href=\"https:\/\/bugzilla.kernel.org\/show_bug.cgi?id=198197\">tenemos<\/a><\/noindex> hay un error grave y <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/67577\">bien conocido<\/a><\/noindex> que causa un exceso de throttling y retrasos<\/b>.<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>En Omio <b>toda la infraestructura est\u00e1 gestionada por Kubernetes<\/b>. Todas nuestras cargas de trabajo stateful y stateless funcionan exclusivamente en Kubernetes (utilizamos Google Kubernetes Engine). En los \u00faltimos seis meses, hemos notado pausas aleatorias. Las aplicaciones se cuelgan o dejan de responder a los health checks, pierden conexi\u00f3n con la red, etc. Este comportamiento nos mantuvo perplejos durante mucho tiempo, y finalmente decidimos abordar el problema en profundidad.<\/p>\n<p>Resumen del art\u00edculo:<\/p>\n<ul>\n<li> Algunas palabras sobre contenedores y Kubernetes;<\/li>\n<li> C\u00f3mo se implementan las solicitudes y l\u00edmites de CPU;<\/li>\n<li> C\u00f3mo funciona el l\u00edmite de CPU en entornos de m\u00faltiples n\u00facleos;<\/li>\n<li> C\u00f3mo monitorear el throttling de CPU;<\/li>\n<li> Soluci\u00f3n del problema y matices.<\/li>\n<\/ul>\n<p><\/p>\n<h2>Algunas palabras sobre contenedores y Kubernetes<\/h2>\n<p>\nKubernetes es, en esencia, el est\u00e1ndar moderno en el mundo de la infraestructura. Su principal tarea es la orquestaci\u00f3n de contenedores.<\/p>\n<h3>Contenedores<\/h3>\n<p>\nEn el pasado, ten\u00edamos que crear artefactos como Java JARs\/WARs, Python Eggs o ejecutables para su posterior ejecuci\u00f3n en servidores. Sin embargo, para hacerlos funcionar, hab\u00eda que realizar trabajo adicional: instalar entornos de ejecuci\u00f3n (Java\/Python), colocar los archivos necesarios en los lugares correctos, garantizar la compatibilidad con versiones espec\u00edficas del sistema operativo, etc. En otras palabras, hab\u00eda que prestar mucha atenci\u00f3n a la gesti\u00f3n de configuraciones (lo que a menudo causaba conflictos entre desarrolladores y administradores de sistemas).<\/p>\n<p><b>Los contenedores cambiaron todo.<\/b> Ahora, el artefacto es una imagen de contenedor. Se puede imaginar como un archivo ejecutable ampliado que contiene no solo el programa, sino tambi\u00e9n un entorno de ejecuci\u00f3n completo (Java\/Python\/\u2026), as\u00ed como los archivos\/paquetes necesarios, preinstalados y listos para ejecutarse. Los contenedores se pueden desplegar y ejecutar en varios servidores sin ninguna acci\u00f3n adicional.<\/p>\n<p>Adem\u00e1s, los contenedores funcionan en su propio entorno aislado. Tienen su propio adaptador de red virtual, su propio sistema de archivos con acceso restringido, su jerarqu\u00eda de procesos, sus l\u00edmites en CPU y memoria, etc. Todo esto se realiza gracias a una subsistema especial del n\u00facleo de Linux: namespaces.<\/p>\n<h3>Kubernetes<\/h3>\n<p>\nComo se mencion\u00f3 anteriormente, Kubernetes es un orquestador de contenedores. Funciona de la siguiente manera: usted le proporciona un conjunto de m\u00e1quinas y luego dice: 'Ey, Kubernetes, ejecuta diez instancias de mi contenedor con 2 procesadores y 3 GB de memoria cada una, \u00a1y mant\u00e9nlas en funcionamiento!'. Kubernetes se encargar\u00e1 de todo lo dem\u00e1s. Encontrar\u00e1 recursos disponibles, iniciar\u00e1 los contenedores y los reiniciar\u00e1 cuando sea necesario, implementar\u00e1 actualizaciones al cambiar de versiones, etc. En esencia, Kubernetes permite abstraerse del componente de hardware y hace que todas las diversas configuraciones de sistemas sean adecuadas para desplegar y ejecutar aplicaciones.<\/p>\n<p><img decoding=\"async\" alt=\"L\u00edmites de CPU y throttling agresivo en Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/6509bb1b66a4a0f5e9a479d0bd6ececb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Kubernetes desde la perspectiva del ciudadano com\u00fan<\/i><\/p>\n<h2>Qu\u00e9 son las solicitudes y l\u00edmites en Kubernetes<\/h2>\n<p>\nBien, hemos entendido sobre los contenedores y Kubernetes. Tambi\u00e9n sabemos que varios contenedores pueden estar en una misma m\u00e1quina.<\/p>\n<p>Se puede hacer una analog\u00eda con un departamento compartido. Se toma un espacio amplio (m\u00e1quinas\/nodos) y se alquila a varios inquilinos (contenedores). Kubernetes act\u00faa como el agente inmobiliario. Surge la pregunta de c\u00f3mo evitar que los inquilinos entren en conflicto entre s\u00ed. \u00bfQu\u00e9 pasa si uno de ellos, digamos, decide ocupar el ba\u00f1o durante medio d\u00eda?<\/p>\n<p>Aqu\u00ed es donde entran en juego las solicitudes y l\u00edmites de CPU. <b>Request<\/b> se necesita exclusivamente para la planificaci\u00f3n. Es algo as\u00ed como una 'lista de deseos' del contenedor y se utiliza para encontrar el nodo m\u00e1s adecuado. Al mismo tiempo, CPU <b>L\u00edmite<\/b> se puede comparar con un contrato de alquiler: una vez que seleccionamos un nodo para el contenedor, este <b>no podr\u00e1<\/b> superar los l\u00edmites establecidos. Y aqu\u00ed es donde surge el problema...<\/p>\n<h3>C\u00f3mo se implementan las solicitudes y l\u00edmites en Kubernetes<\/h3>\n<p>\nKubernetes utiliza un mecanismo de throttling (limitaci\u00f3n) incorporado en el n\u00facleo para implementar los l\u00edmites de CPU. Si una aplicaci\u00f3n excede el l\u00edmite, se activa el throttling (es decir, recibe menos ciclos de CPU). Las solicitudes y l\u00edmites para la memoria se organizan de manera diferente, por lo que son m\u00e1s f\u00e1ciles de detectar. Solo hay que comprobar el \u00faltimo estado de reinicio del pod: \u00bfha sido \"OOMKilled\"? Con el throttling de CPU las cosas no son tan simples, ya que K8s solo proporciona m\u00e9tricas de uso, no de cgroups.<\/p>\n<h4>Solicitud de CPU<\/h4>\n<p>\n<img decoding=\"async\" alt=\"L\u00edmites de CPU y throttling agresivo en Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/fbc8bf3f775ffd9513374ce94b20535d.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>\u00bfC\u00f3mo se implementa la solicitud de CPU?<\/i><\/p>\n<p>Para simplificar, consideremos el proceso utilizando una m\u00e1quina con un CPU de 4 n\u00facleos.<\/p>\n<p>K8s utiliza el mecanismo de grupos de control (cgroups) para gestionar la distribuci\u00f3n de recursos (memoria y CPU). Disponible tambi\u00e9n est\u00e1 un modelo jer\u00e1rquico: un hijo hereda los l\u00edmites de su grupo padre. Los detalles de la distribuci\u00f3n se almacenan en un sistema de archivos virtual (<code>\/sys\/fs\/cgroup<\/code>). En el caso de la CPU, esto es <code>\/sys\/fs\/cgroup\/cpu,cpuacct\/*<\/code>.<\/p>\n<p>K8s utiliza el archivo <code>cpu.share<\/code> para distribuir los recursos de CPU. En nuestro caso, el grupo de control ra\u00edz recibe 4096 partes de recursos de CPU, que equivale al 100% de la potencia de CPU disponible (1 n\u00facleo = 1024; este es un valor fijo). El grupo ra\u00edz distribuye los recursos de manera proporcional seg\u00fan las partes de los descendientes especificadas en <code>cpu.share<\/code>, y estos, a su vez, hacen lo mismo con sus descendientes, etc. En un nodo t\u00edpico de Kubernetes, el grupo de control ra\u00edz tiene tres descendientes: <code>system.slice<\/code>, <code>user.slice<\/code> y <code>kubepods<\/code>. Los dos primeros subgrupos se utilizan para distribuir recursos entre cargas cr\u00edticas del sistema y programas de usuario externos a K8s. El \u00faltimo \u2014 <code>kubepods<\/code> \u2014 creado por Kubernetes para distribuir recursos entre los pods.<\/p>\n<p>En el diagrama de arriba se puede ver que el primer y segundo subgrupo recibieron cada uno <b>1024<\/b> partes, mientras que al subgrupo kubepod se le asignaron <b>4096<\/b> partes. \u00bfC\u00f3mo es esto posible? Dado que al grupo ra\u00edz solo le est\u00e1n disponibles <b>4096<\/b> partes, y la suma de las partes de sus descendientes supera con creces este n\u00famero (<b>6144<\/b>)? La clave es que el valor tiene un sentido l\u00f3gico, por lo que el programador de Linux (CFS) lo utiliza para la distribuci\u00f3n proporcional de los recursos de CPU. En nuestro caso, los dos primeros grupos reciben cada uno <b>680<\/b> partes reales (16,6% de 4096), y kubepod recibe las restantes <b>2736<\/b> partes. En caso de inactividad, los dos primeros grupos no utilizar\u00e1n los recursos asignados.<\/p>\n<p>Afortunadamente, el programador tiene un mecanismo que permite evitar la p\u00e9rdida de recursos de CPU no utilizados. Transfiere las capacidades \"en espera\" a un grupo global, del cual se distribuyen a los grupos que necesitan capacidades de procesador adicionales (la transferencia se realiza por lotes para evitar p\u00e9rdidas por redondeo). Un m\u00e9todo similar se aplica a todos los descendientes.<\/p>\n<p>Este mecanismo asegura una distribuci\u00f3n equitativa de las capacidades de procesamiento y previene que un proceso \"robe\" recursos de otros.<\/p>\n<h4>L\u00edmite de CPU<\/h4>\n<p>\nAunque las configuraciones de l\u00edmites y solicitudes en K8s parecen similares, su implementaci\u00f3n es radicalmente diferente: esto es <b>la parte m\u00e1s enga\u00f1osa<\/b> y menos documentada.<\/p>\n<p>K8s utiliza <noindex><a rel=\"nofollow\" href=\"https:\/\/www.kernel.org\/doc\/Documentation\/scheduler\/sched-design-CFS.txt\">el mecanismo de cuotas CFS<\/a><\/noindex> para implementar l\u00edmites. Sus configuraciones se establecen en los archivos <code>cfs_period_us<\/code> y <code>cfs_quota_us<\/code> en el directorio cgroup (donde tambi\u00e9n se encuentra el archivo <code>cpu.share<\/code>).<\/p>\n<p>A diferencia de <code>cpu.share<\/code>, la cuota se basa en <b>un per\u00edodo de tiempo<\/b>, no en la capacidad de procesamiento disponible. <code>cfs_period_us<\/code> define la duraci\u00f3n del per\u00edodo (era) \u2014 siempre es 100000 \u00b5s (100 ms). En K8s hay opci\u00f3n de cambiar este valor, aunque por ahora est\u00e1 disponible solamente en la versi\u00f3n alfa. El programador utiliza la era para reiniciar las cuotas utilizadas. El segundo archivo, <code>cfs_quota_us<\/code>, define el tiempo disponible (cuota) en cada era. Nota que tambi\u00e9n se especifica en microsegundos. La cuota puede exceder la duraci\u00f3n de la era; en otras palabras, puede ser mayor a 100 ms.<\/p>\n<p>Veamos dos escenarios en m\u00e1quinas de 16 n\u00facleos (el tipo de computadora m\u00e1s com\u00fan que tenemos en Omio):<\/p>\n<p><img decoding=\"async\" alt=\"L\u00edmites de CPU y throttling agresivo en Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/61c6105320af3a92a91cec1007da0d45.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Escenario 1: 2 hilos y un l\u00edmite de 200 ms. Sin estrangulamiento.<\/i><\/p>\n<p><img decoding=\"async\" alt=\"L\u00edmites de CPU y throttling agresivo en Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/c33993341d5395bb73dda1f4c8482a11.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Escenario 2: 10 hilos y un l\u00edmite de 200 ms. El estrangulamiento comienza despu\u00e9s de 20 ms, el acceso a los recursos de CPU se reanuda otros 80 ms despu\u00e9s.<\/i><\/p>\n<p>Supongamos que estableciste un l\u00edmite de CPU en <b>2<\/b> n\u00facleos; Kubernetes convertir\u00e1 este valor a 200 ms. Esto significa que el contenedor puede usar un m\u00e1ximo de 200 ms de tiempo de CPU sin estrangulamiento.<\/p>\n<p>Y aqu\u00ed es donde comienza lo interesante. Como se mencion\u00f3 anteriormente, la cuota disponible es de 200 ms. Si tienes diez <b>hilos funcionando en una m\u00e1quina de 12 n\u00facleos (ver ilustraci\u00f3n del escenario 2), mientras todos los dem\u00e1s pods est\u00e1n inactivos, la cuota se agotar\u00e1 en solo 20 ms (ya que 10 * 20 ms = 200 ms), y todos los hilos de este pod \"se estrangular\u00e1n\"<\/b> flujos en una m\u00e1quina de 12 n\u00facleos (ver ilustraci\u00f3n del escenario 2), mientras todos los dem\u00e1s pods est\u00e1n inactivos, la cuota se consumir\u00e1 en solo 20 ms (ya que 10 * 20 ms = 200 ms), y todos los flujos de este pod se 'congelar\u00e1n' <i>(throttle)<\/i> en los siguientes 80 ms. Agrava la situaci\u00f3n el ya mencionado <noindex><a rel=\"nofollow\" href=\"https:\/\/bugzilla.kernel.org\/show_bug.cgi?id=198197\">error del planificador<\/a><\/noindex>, que provoca un throttling excesivo y el contenedor no puede utilizar ni siquiera su cuota existente.<\/p>\n<h2>\u00bfC\u00f3mo evaluar el throttling en pods?<\/h2>\n<p>\nSimplemente ingrese al pod y ejecute <code>cat \/sys\/fs\/cgroup\/cpu\/cpu.stat<\/code>.<\/p>\n<ul>\n<li> <code>nr_periods<\/code> \u2014 n\u00famero total de per\u00edodos del planificador;<\/li>\n<li> <code>nr_throttled<\/code> \u2014 n\u00famero de per\u00edodos throttled dentro de <code>nr_periods<\/code>;<\/li>\n<li> <code>throttled_time<\/code> \u2014 tiempo total en throttled en nanosegundos.<\/li>\n<\/ul>\n<p>\n<img decoding=\"async\" alt=\"L\u00edmites de CPU y throttling agresivo en Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/a1818614914a8c31f7f7f1331cc02e8b.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>\u00bfQu\u00e9 est\u00e1 sucediendo realmente?<\/h3>\n<p>\nAl final, tenemos un alto throttling en todas las aplicaciones. \u00a1A veces es <b>una vez y media<\/b> m\u00e1s fuerte de lo esperado!<\/p>\n<p>Esto conduce a varios errores: fallos en las comprobaciones de disponibilidad (readiness), bloqueos de contenedores, cortes en las conexiones de red, timeouts en las llamadas de servicio. En \u00faltima instancia, se traduce en un aumento de la latencia y un mayor n\u00famero de errores.<\/p>\n<h2>Soluci\u00f3n y consecuencias<\/h2>\n<p>\nEs simple. Hemos eliminado los l\u00edmites de CPU y nos hemos enfocado en actualizar el n\u00facleo del SO en los cl\u00fasteres a la versi\u00f3n m\u00e1s reciente, donde se corrigi\u00f3 el error. El n\u00famero de fallos (HTTP 5xx) en nuestros servicios descendi\u00f3 significativamente de inmediato:<\/p>\n<h3>Errores HTTP 5xx<\/h3>\n<p>\n<img decoding=\"async\" alt=\"L\u00edmites de CPU y throttling agresivo en Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/86ab1694b952b5451a4ae075cbda2788.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Errores HTTP 5xx de un servicio cr\u00edtico<\/i><\/p>\n<h3>Tiempo de respuesta p95<\/h3>\n<p>\n<img decoding=\"async\" alt=\"L\u00edmites de CPU y throttling agresivo en Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/63922c8eb468366a7d05154a3adf40e6.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Latencia de las solicitudes del servicio cr\u00edtico, percentil 95<\/i><\/p>\n<h3>Gastos de operaci\u00f3n<\/h3>\n<p>\n<img decoding=\"async\" alt=\"L\u00edmites de CPU y throttling agresivo en Kubernetes\" src=\"\/wp-content\/uploads\/2020\/04\/8405c26fcbd82853e296fa7e3bcba131.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>N\u00famero de horas de instancia gastadas<\/i><\/p>\n<h2>\u00bfCu\u00e1l es el truco?<\/h2>\n<p>\nComo se mencion\u00f3 al principio del art\u00edculo:<\/p>\n<blockquote><p>Se puede hacer una analog\u00eda con un apartamento compartido\u2026 Kubernetes act\u00faa como el agente inmobiliario. Pero, \u00bfc\u00f3mo evitar que los inquilinos tengan conflictos entre s\u00ed? \u00bfQu\u00e9 pasa si uno de ellos, digamos, decide ocupar el ba\u00f1o durante medio d\u00eda?<\/p><\/blockquote>\n<p>\nAqu\u00ed est\u00e1 el truco. Un contenedor descuidado puede consumir todos los recursos de CPU disponibles en la m\u00e1quina. Si tiene un stack de aplicaciones adecuado (por ejemplo, JVM, Go, Node VM correctamente configurados), entonces no es un problema: se puede trabajar en esas condiciones durante mucho tiempo. Pero si las aplicaciones est\u00e1n mal optimizadas o no est\u00e1n optimizadas en absoluto (<code>FROM java:latest<\/code>), la situaci\u00f3n puede salirse de control. En Omio tenemos Dockerfiles b\u00e1sicos automatizados con configuraciones predeterminadas razonables para los principales lenguajes de stack, as\u00ed que no existi\u00f3 ese problema.<\/p>\n<p>Recomendamos monitorear las m\u00e9tricas <noindex><a rel=\"nofollow\" href=\"http:\/\/www.brendangregg.com\/usemethod.html\">USE<\/a><\/noindex> (uso, saturaci\u00f3n y errores), retrasos de API y frecuencia de errores. Aseg\u00farese de que los resultados coincidan con las expectativas.<\/p>\n<h2>Enlaces<\/h2>\n<p>\nEsta es nuestra historia. Los siguientes materiales ayudaron mucho a entender lo que est\u00e1 sucediendo:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.kernel.org\/doc\/Documentation\/scheduler\/sched-design-CFS.txt\">kernel.org \u2192 Programador CFS<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.kernel.org\/doc\/Documentation\/scheduler\/sched-bwc.txt\">kernel.org \u2192 Control de Ancho de Banda CFS<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/engineering.squarespace.com\/blog\/2017\/understanding-linux-container-scheduling\">Entendiendo la Programaci\u00f3n de Contenedores en Linux<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/www.linuxjournal.com\/content\/everything-you-need-know-about-linux-containers-part-i-linux-control-groups-and-process\">Todo lo que Necesitas Saber sobre los Contenedores de Linux, Parte I: Grupos de Control de Linux y Aislamiento de Procesos<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/k8s.af\/\">Historias de fallos de Kubernetes<\/a><\/noindex> \u2014 busque \u00abcpu throttling\u00bb.<\/li>\n<\/ul>\n<p>\nInformes de errores de Kubernetes:<\/p>\n<ul>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/51135#issuecomment-373454012\">#51135: Avoid setting CPU limits for Guaranteed pods<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/kubernetes\/issues\/67577\">#67577: CFS quotas can lead to unnecessary throttling<\/a><\/noindex>;<\/li>\n<li> <noindex><a rel=\"nofollow\" href=\"https:\/\/gist.github.com\/bobrik\/2030ff040fad360327a5fab7a09c4ff1\">CFS excesivamente agresivo<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\n\u00bfHas encontrado problemas similares en tu pr\u00e1ctica o tienes experiencia relacionada con el throttling en entornos de producci\u00f3n containerizados? \u00a1Comparte tu historia en los comentarios!<\/p>\n<h2>P.D. del traductor<\/h2>\n<p>\nTambi\u00e9n puedes leer en nuestro blog:<\/p>\n<ul>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/459326\/\">Autoescalado y gesti\u00f3n de recursos en Kubernetes (resumen y video de la presentaci\u00f3n)<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/418269\/\">C\u00f3mo Funciona el Administrador de CPU en Kubernetes<\/a><\/noindex>\u00bb;<\/li>\n<li> \u00ab<noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/342822\/\">\u00bfQu\u00e9 sucede en Kubernetes cuando se ejecuta kubectl run? Parte 2<\/a><\/noindex>\u00bb.<\/li>\n<\/ul>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/flant\/blog\/489668\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u044d\u0442\u0430 \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f Omio \u2014 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0433\u043e \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439 \u2014 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0434\u043e \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Kubernetes. \u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 \u0442\u0430\u043a\u0438\u043c\u0438 \u0441\u043b\u0443\u0447\u0430\u044f\u043c\u0438 \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043a\u0440\u0443\u0433\u043e\u0437\u043e\u0440, \u043d\u043e \u0438 \u043f\u0440\u0435\u0434\u043e\u0442\u0432\u0440\u0430\u0449\u0430\u0442\u044c \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b. \u0414\u043e\u0432\u043e\u0434\u0438\u043b\u043e\u0441\u044c \u043b\u0438 \u0432\u0430\u043c \u0441\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0441 \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u00ab\u0437\u0430\u0441\u0442\u0440\u0435\u0432\u0430\u043b\u043e\u00bb \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u0432\u0430\u043b\u043e \u043e\u0442\u0432\u0435\u0447\u0430\u0442\u044c \u043d\u0430 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":77694,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-77693","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u044d\u0442\u0430 \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f Omio \u2014 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0433\u043e \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439 \u2014 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0434\u043e \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Kubernetes.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"es_ES\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47CPU-\u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0442\u0440\u043e\u0442\u0442\u043b\u0438\u043d\u0433 \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u044d\u0442\u0430 \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f Omio \u2014 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0433\u043e \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439 \u2014 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0434\u043e \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Kubernetes.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-04-12T23:42:39+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-04-12T23:42:39+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47L\u00edmites de CPU y throttling agresivo en Kubernetes | ProHoster","description":"Nota del traductor: esta instructiva historia de Omio, un agregador europeo de viajes, lleva a los lectores desde la teor\u00eda b\u00e1sica hasta los intrigantes matices pr\u00e1cticos en la configuraci\u00f3n de Kubernetes.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"es_ES","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47CPU-\u043b\u0438\u043c\u0438\u0442\u044b \u0438 \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0442\u0440\u043e\u0442\u0442\u043b\u0438\u043d\u0433 \u0432 Kubernetes | ProHoster","og:description":"\u041f\u0440\u0438\u043c. \u043f\u0435\u0440\u0435\u0432.: \u044d\u0442\u0430 \u043f\u043e\u0443\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f Omio \u2014 \u0435\u0432\u0440\u043e\u043f\u0435\u0439\u0441\u043a\u043e\u0433\u043e \u0430\u0433\u0440\u0435\u0433\u0430\u0442\u043e\u0440\u0430 \u043f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u0439 \u2014 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442 \u0447\u0438\u0442\u0430\u0442\u0435\u043b\u0435\u0439 \u043e\u0442 \u0431\u0430\u0437\u043e\u0432\u043e\u0439 \u0442\u0435\u043e\u0440\u0438\u0438 \u0434\u043e \u0443\u0432\u043b\u0435\u043a\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0435\u0439 \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 Kubernetes.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/cpu-limity-i-agressivnyj-trottling-v-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-04-12T23:42:39+00:00","article:modified_time":"2020-04-12T23:42:39+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"77693","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 17:13:23","updated":"2022-09-29 12:06:45","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/77693","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=77693"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/77693\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/77694"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=77693"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=77693"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=77693"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}