{"id":97982,"date":"2020-10-23T14:42:15","date_gmt":"2020-10-23T12:42:15","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes"},"modified":"2020-11-18T00:58:47","modified_gmt":"2020-11-17T22:58:47","slug":"devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-kubernetes","title":{"rendered":"Nueve consejos para mejorar el rendimiento de Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Nueve consejos para mejorar el rendimiento de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/92dc510aa9d785a31d310816b18bf854.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u00a1Hola a todos! Me llamo Oleg Sidorenkov, trabajo en la empresa DomKlik como l\u00edder del equipo de infraestructura. Hemos estado utilizando \"Cubo\" en producci\u00f3n durante m\u00e1s de tres a\u00f1os, y durante este tiempo hemos vivido muchos momentos interesantes con \u00e9l. Hoy les contar\u00e9 c\u00f3mo, con el enfoque correcto, se puede extraer a\u00fan m\u00e1s rendimiento de un Kubernetes \"vanilla\" para su cl\u00faster. \u00a1Listos, listos, ya! <\/p>\n<p>Todos ustedes saben muy bien que Kubernetes es un sistema escalable de c\u00f3digo abierto para la orquestaci\u00f3n de contenedores; bien, o 5 binarios que hacen magia, gestionando el ciclo de vida de sus microservicios en un entorno de servidor. Adem\u00e1s, es una herramienta bastante flexible, que se puede ensamblar como un juguete de Lego, para una m\u00e1xima personalizaci\u00f3n para diferentes tareas.<\/p>\n<p>Y, aparentemente, todo est\u00e1 bien: simplemente a\u00f1ade servidores al cl\u00faster como si fueran le\u00f1a a la chimenea y no habr\u00e1 problemas. Pero si te preocupas por el medio ambiente, te preguntar\u00e1s: \"\u00bfC\u00f3mo puedo mantener el fuego en la estufa y cuidar el bosque?\". En otras palabras, \u00bfc\u00f3mo encontrar formas de mejorar la infraestructura y reducir costos?<\/p>\n<h2>1. Supervise los recursos de los equipos y aplicaciones.<\/h2>\n<p><img decoding=\"async\" alt=\"Nueve consejos para mejorar el rendimiento de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/91e2e60b47ee985b024532c8b685230c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Uno de los m\u00e9todos m\u00e1s simples, pero efectivos, es implementar requests\/limits. Separa las aplicaciones por namespaces, y los namespaces por equipos de desarrollo. Establece valores de consumo de tiempo de CPU, memoria, y almacenamiento ef\u00edmero antes de desplegar la aplicaci\u00f3n.<\/p>\n<pre><code>resources:\n   requests:\n     memory: 2Gi\n     cpu: 250m\n   limits:\n     memory: 4Gi\n     cpu: 500m<\/code><\/pre>\n<p>Por experiencia, hemos llegado a la conclusi\u00f3n: no se deben inflar los requests por encima de los l\u00edmites m\u00e1s de dos veces. El tama\u00f1o del cl\u00faster se calcula a partir de los requests, y si estableces diferencias de recursos en las aplicaciones, por ejemplo, de 5 a 10 veces, imagina qu\u00e9 pasar\u00e1 con tu nodo cuando se llene de pods y de repente reciba carga. Nada bueno. Como m\u00ednimo, tendr\u00e1s throttling, y como m\u00e1ximo, dir\u00e1s adi\u00f3s a un worker y tendr\u00e1s carga c\u00edclica en los dem\u00e1s nodos una vez que los pods empiecen a migrar.<\/p>\n<p>Adem\u00e1s, con <code>limitranges<\/code> puedes establecer inicialmente los valores de recursos para el contenedor \u2014 m\u00ednimos, m\u00e1ximos y por defecto:<\/p>\n<pre><code>\u279c  ~ kubectl describe limitranges --namespace ops\nName:       limit-range\nNamespace:  ops\nType        Resource           Min   Max   Default Request  Default Limit  Max Limit\/Request Ratio\n----        --------           ---   ---   ---------------  -------------  -----------------------\nContainer   cpu                50m   10    100m             100m           2\nContainer   ephemeral-storage  12Mi  8Gi   128Mi            4Gi            -\nContainer   memory             64Mi  40Gi  128Mi            128Mi          2<\/code><\/pre>\n<p>No olvides limitar los recursos del namespace para que un equipo no pueda acaparar todos los recursos del cl\u00faster:<\/p>\n<pre><code>\u279c  ~ kubectl describe resourcequotas --namespace ops\nName:                   resource-quota\nNamespace:              ops\nResource                Used          Hard\n--------                ----          ----\nlimits.cpu              77250m        80\nlimits.memory           124814367488  150Gi\npods                    31            45\nrequests.cpu            53850m        80\nrequests.memory         75613234944   150Gi\nservices                26            50\nservices.loadbalancers  0             0\nservices.nodeports      0             0<\/code><\/pre>\n<p>Como se observa en la descripci\u00f3n <code>resourcequotas<\/code>, si el equipo ops quiere desplegar pods que consumir\u00e1n otros 10 cpu, el programador no permitir\u00e1 que esto suceda y generar\u00e1 un error:<\/p>\n<pre><code>Error creando: pods \"nginx-proxy-9967d8d78-nh4fs\" est\u00e1 prohibido: cuota excedida: resource-quota, solicitado: limits.cpu=5, requests.cpu=5, usado: limits.cpu=77250m, requests.cpu=53850m, limitado: limits.cpu=10, requests.cpu=10<\/code><\/pre>\n<p>Para resolver este tipo de problemas, se puede escribir una herramienta, como <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/pauljamm\/team-operator\">este<\/a><\/noindex>, que pueda almacenar y confirmar el estado de los recursos de los equipos.<\/p>\n<h2>2. Selecciona un almacenamiento de archivos \u00f3ptimo<\/h2>\n<p><img decoding=\"async\" alt=\"Nueve consejos para mejorar el rendimiento de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c7f8bdbf5490acc9061695a6d608015e.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Aqu\u00ed quisiera tocar el tema de vol\u00famenes persistentes y el subsistema de disco de los nodos worker de Kubernetes. Espero que nadie est\u00e9 usando \u00abCube\u00bb en HDD en producci\u00f3n, pero a veces un SSD convencional ya no es suficiente. Nos hemos encontrado con el problema de que los registros mataban el disco debido a las operaciones de E\/S, y aqu\u00ed no hay muchas opciones disponibles: <\/p>\n<ul>\n<li>\n<p>Utilizar SSD de alto rendimiento o cambiar a NVMe (si est\u00e1s gestionando tu propio hardware).<\/p>\n<\/li>\n<li>\n<p>Reducir el nivel de registro.<\/p>\n<\/li>\n<li>\n<p>Hacer un balanceo \u00abinteligente\u00bb de los pods que est\u00e1n sobrecargando el disco (<code>podAntiAffinity<\/code>).<\/p>\n<\/li>\n<\/ul>\n<p>La captura de pantalla anterior muestra lo que sucede con el disco del nginx-ingress-controller cuando est\u00e1 habilitado el registro de access_logs (~12 mil registros\/seg). Este estado, por supuesto, puede llevar a la degradaci\u00f3n de todas las aplicaciones en este nodo.<\/p>\n<p>En lo que respecta a PV, desgraciadamente, no he probado todos <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/concepts\/storage\/persistent-volumes\/#types-of-persistent-volumes\">los tipos<\/a><\/noindex> Vol\u00famenes Persistentes. Utiliza la mejor opci\u00f3n que se adapte a ti. Hist\u00f3ricamente, una peque\u00f1a parte de los servicios ha necesitado vol\u00famenes RWX, y hace tiempo que comenzamos a utilizar el almacenamiento NFS para esta tarea. Econ\u00f3mico y\u2026 suficiente. Claro, hemos tenido nuestras dificultades \u2014 \u00a1vaya que s\u00ed!, pero aprendimos a optimizarlo y ya no tenemos problemas. Si es posible, considera migrar a almacenamiento de objetos S3.<\/p>\n<h2>3. Re\u00fana im\u00e1genes optimizadas<\/h2>\n<p><img decoding=\"async\" alt=\"Nueve consejos para mejorar el rendimiento de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/c25ce405d1eb4c01f031e18b0bfa4836.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Es mejor utilizar im\u00e1genes optimizadas para contenedores, para que Kubernetes pueda extraerlas m\u00e1s r\u00e1pido y ejecutarlas de manera m\u00e1s eficiente.&nbsp;<\/p>\n<p>La optimizaci\u00f3n significa que las im\u00e1genes:<\/p>\n<ul>\n<li>\n<p>contienen solo una aplicaci\u00f3n o realizan una sola funci\u00f3n;<\/p>\n<\/li>\n<li>\n<p>tienen un tama\u00f1o peque\u00f1o, ya que las im\u00e1genes grandes se transmiten peor por la red;<\/p>\n<\/li>\n<li>\n<p>tienen puntos finales para verificar la disponibilidad y la preparaci\u00f3n, con los cuales Kubernetes puede tomar acciones en caso de inactividad;<\/p>\n<\/li>\n<li>\n<p>utilizan sistemas operativos amigables con los contenedores (como Alpine o CoreOS), que son m\u00e1s resistentes a errores de configuraci\u00f3n;<\/p>\n<\/li>\n<li>\n<p>utilizan compilaciones de m\u00faltiples etapas, para que pueda desplegar solo aplicaciones compiladas y no los c\u00f3digos fuente asociados.<\/p>\n<\/li>\n<\/ul>\n<p>Hay muchas herramientas y servicios que permiten verificar y optimizar im\u00e1genes sobre la marcha. Es importante mantenerlas siempre actualizadas y comprobadas en cuanto a seguridad. Como resultado, usted obtiene: <\/p>\n<ol>\n<li>\n<p>Reducci\u00f3n de la carga de red en todo el cl\u00faster.<\/p>\n<\/li>\n<li>\n<p>Disminuci\u00f3n del tiempo de inicio del contenedor.<\/p>\n<\/li>\n<li>\n<p>Menor volumen de todo su registro de Docker.<\/p>\n<\/li>\n<\/ol>\n<h2>4. Utilice la cach\u00e9 de DNS<\/h2>\n<p><img decoding=\"async\" alt=\"Nueve consejos para mejorar el rendimiento de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/9f4384462a77dc528d7911c56f684f2d.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Hablando de altas cargas, vivir sin optimizar el sistema DNS del cl\u00faster es bastante dif\u00edcil. Hace mucho tiempo, los desarrolladores de Kubernetes manten\u00edan su soluci\u00f3n kube-dns. Se implement\u00f3 tambi\u00e9n en nuestro caso, pero este software no se optimiz\u00f3 como se deb\u00eda y no daba el rendimiento requerido, aunque la tarea parec\u00eda simple. Despu\u00e9s apareci\u00f3 coredns, al que migramos y que funcion\u00f3 sin problemas; posteriormente se convirti\u00f3 en el servicio DNS predeterminado en K8s. En alg\u00fan momento, alcanzamos 40 mil rps hacia el sistema DNS, y esa soluci\u00f3n tambi\u00e9n se qued\u00f3 corta. Pero, por suerte, se lanz\u00f3 Nodelocaldns, tambi\u00e9n conocido como cach\u00e9 local de nodo, tambi\u00e9n <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/administer-cluster\/nodelocaldns\/\">NodeLocal DNSCache<\/a><\/noindex>.<\/p>\n<p>\u00bfPor qu\u00e9 usamos esto? Hay un bug en el n\u00facleo de Linux que, al acceder m\u00faltiples veces a trav\u00e9s de conntrack NAT por UDP, provoca una condici\u00f3n de carrera en la escritura en las tablas de conntrack, y parte del tr\u00e1fico a trav\u00e9s de NAT se pierde (cada acceso a trav\u00e9s del Service implica NAT). Nodelocaldns resuelve este problema al eliminar el NAT y actualizar la conexi\u00f3n a TCP con los DNS upstream, adem\u00e1s de cach\u00e9 local de consultas DNS a upstream (incluyendo un corto cach\u00e9 negativo de 5 segundos).<\/p>\n<h2>5. Escale los pods horizontal y verticalmente de manera autom\u00e1tica<\/h2>\n<p><img decoding=\"async\" alt=\"Nueve consejos para mejorar el rendimiento de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3804a14685a55160fa7d9f3226eab1fa.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u00bfPuede afirmar con confianza que todos sus microservicios est\u00e1n listos para un aumento de carga de dos a tres veces? \u00bfC\u00f3mo asignar correctamente los recursos a sus aplicaciones? Mantener un par de pods en ejecuci\u00f3n m\u00e1s all\u00e1 de la carga de trabajo puede resultar excesivo, y mantenerlos justos puede arriesgarse a causar inactividad por un aumento repentino del tr\u00e1fico en el servicio. La soluci\u00f3n intermedia puede alcanzarse con el encantamiento de la multiplicaci\u00f3n de servicios como <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/docs\/tasks\/run-application\/horizontal-pod-autoscale\/\">Horizontal Pod Autoscaler<\/a><\/noindex> y <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kubernetes\/autoscaler\/tree\/master\/vertical-pod-autoscaler\">Vertical Pod Autoscaler<\/a><\/noindex>. <\/p>\n<p><strong>VPA<\/strong> permite aumentar autom\u00e1ticamente los requests\/limits de sus contenedores en el pod seg\u00fan el uso real. \u00bfC\u00f3mo puede ser \u00fatil? Si tiene pods que no se pueden escalar horizontalmente por alguna raz\u00f3n (lo que no es completamente confiable), puede intentar confiar en el VPA para cambiar sus recursos. Su caracter\u00edstica clave es el sistema de recomendaciones basado en datos hist\u00f3ricos y actuales del metric-server, por lo que, si no desea cambiar autom\u00e1ticamente los requests\/limits, puede simplemente rastrear los recursos recomendados para sus contenedores y optimizar la configuraci\u00f3n para ahorrar CPU y memoria en el cl\u00faster. <\/p>\n<p><img decoding=\"async\" alt=\"Nueve consejos para mejorar el rendimiento de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/3965950aa3315faa4bb3e3ff5bd61955.png\" style=\"display:block;margin: 0 auto;\" \/>La imagen es tomada de https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>El programador en Kubernetes siempre se basa en los requests. Cualquiera que sea el valor que coloque, el programador buscar\u00e1 un nodo adecuado bas\u00e1ndose en \u00e9l. Los valores de limits son necesarios para que el kubelet entienda cu\u00e1ndo limitar o eliminar un pod. Y dado que el \u00fanico par\u00e1metro importante es el valor de requests, el VPA trabajar\u00e1 con \u00e9l. Cada vez que establece el escalamiento vertical de una aplicaci\u00f3n, est\u00e1 definiendo cu\u00e1les deber\u00edan ser los requests. \u00bfY qu\u00e9 pasar\u00e1 con los limits? Este par\u00e1metro tambi\u00e9n ser\u00e1 escalado proporcionalmente.<\/p>\n<p>Por ejemplo, aqu\u00ed est\u00e1n la configuraciones est\u00e1ndar de un pod:<\/p>\n<pre><code>recursos:\n   solicitudes:\n     memoria: 250Mi\n     cpu: 200m\n   l\u00edmites:\n     memoria: 500Mi\n     cpu: 350m<\/code><\/pre>\n<p>El mecanismo de recomendaciones determina que tu aplicaci\u00f3n necesita 300m de CPU y 500Mi para funcionar correctamente. Recibir\u00e1s estas configuraciones:<\/p>\n<pre><code>recursos:\n   solicitudes:\n     memoria: 500Mi\n     cpu: 300m\n   l\u00edmites:\n     memoria: 1000Mi\n     cpu: 525m<\/code><\/pre>\n<p>Como se mencion\u00f3 anteriormente, esta es una escalabilidad proporcional basada en la relaci\u00f3n solicitudes\/l\u00edmites en el manifiesto:<\/p>\n<ul>\n<li>\n<p>CPU: 200m \u2192 300m: relaci\u00f3n 1:1.75;<\/p>\n<\/li>\n<li>\n<p>Memoria: 250Mi \u2192 500Mi: relaci\u00f3n 1:2.<\/p>\n<\/li>\n<\/ul>\n<p>En cuanto a <strong>HPA<\/strong>, aqu\u00ed el mecanismo de trabajo es m\u00e1s transparente. Se establecen valores umbrales para las m\u00e9tricas, como CPU y memoria, y si el valor promedio de todas las r\u00e9plicas supera el umbral, la aplicaci\u00f3n se escala en +1 pod hasta que el valor caiga por debajo del umbral o hasta que se alcance el n\u00famero m\u00e1ximo de r\u00e9plicas.<\/p>\n<p><img decoding=\"async\" alt=\"Nueve consejos para mejorar el rendimiento de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f7a3fa28177d66be925867e38f5bbed6.png\" style=\"display:block;margin: 0 auto;\" \/>La imagen es tomada de https:\/\/levelup.gitconnected.com\/kubernetes-autoscaling-101-cluster-autoscaler-horizontal-pod-autoscaler-and-vertical-pod-2a441d9ad231<\/p>\n<p>Adem\u00e1s de las m\u00e9tricas est\u00e1ndar, como CPU y memoria, puedes configurar umbrales en tus m\u00e9tricas personalizadas de Prometheus y trabajar con ellas si consideras que es la definici\u00f3n m\u00e1s precisa de cu\u00e1ndo escalar tu aplicaci\u00f3n. Despu\u00e9s de que la aplicaci\u00f3n se estabilice por debajo del l\u00edmite de m\u00e9tricas establecido, el HPA comenzar\u00e1 a escalar los pods hacia abajo hasta el n\u00famero m\u00ednimo de r\u00e9plicas o hasta que la carga cumpla con el umbral establecido.<\/p>\n<h2>6. No olvides sobre la Afinidad de Nodos y la Afinidad de Pods<\/h2>\n<p><img decoding=\"async\" alt=\"Nueve consejos para mejorar el rendimiento de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/e718191d9e8ff25fd3b2d65cba9b3b73.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>No todos los nodos funcionan con el mismo hardware, y no todos los pods necesitan ejecutar aplicaciones que requieren intensivos c\u00e1lculos. Kubernetes permite definir la especializaci\u00f3n de nodos y pods usando <strong>Afinidad de Nodos<\/strong> y <strong>Afinidad de Pods<\/strong>.<\/p>\n<p>Si tienes nodos adecuados para operaciones con intensivos c\u00e1lculos, es mejor vincular aplicaciones a nodos correspondientes para obtener la m\u00e1xima eficiencia. Para ello, utiliza <code>nodeSelector<\/code> con la etiqueta del nodo.<\/p>\n<p>Supongamos que tienes dos nodos: uno con <code>CPUType=HIGHFREQ<\/code> y un gran n\u00famero de n\u00facleos r\u00e1pidos, otro con <code>MemoryType=HIGHMEMORY<\/code> con gran cantidad de memoria y rendimiento superior. Es m\u00e1s sencillo asignar el despliegue del pod al nodo <code>HIGHFREQ<\/code>, agregando en la secci\u00f3n <code>spec<\/code> el siguiente selector:<\/p>\n<pre><code>\u2026\nnodeSelector:\n\tCPUType: HIGHFREQ<\/code><\/pre>\n<p>Una forma m\u00e1s costosa y espec\u00edfica de hacerlo es utilizar <code>nodeAffinity<\/code> en el campo <code>afinidad<\/code> la secci\u00f3n <code>spec<\/code>. Hay dos opciones:<\/p>\n<ul>\n<li>\n<p><code>requiredDuringSchedulingIgnoredDuringExecution<\/code>: configuraci\u00f3n r\u00edgida (el programador solo desplegar\u00e1 pods en nodos espec\u00edficos (y en ning\u00fan otro lugar));<\/p>\n<\/li>\n<li>\n<p><code>preferredDuringSchedulingIgnoredDuringExecution<\/code>: configuraci\u00f3n suave (el programador intentar\u00e1 desplegar en nodos espec\u00edficos, y si no puede, intentar\u00e1 desplegar en el siguiente nodo disponible).<\/p>\n<\/li>\n<\/ul>\n<p>Puedes especificar una sintaxis particular para controlar las etiquetas de los nodos, por ejemplo, <code>En<\/code>, <code>NoEn<\/code>, <code>Existe<\/code>, <code>NoExiste<\/code>, <code>Gt<\/code> o <code>Lt<\/code>. Sin embargo, ten en cuenta que los m\u00e9todos complejos en listas largas de etiquetas ralentizar\u00e1n la toma de decisiones en situaciones cr\u00edticas. En otras palabras, no lo compliques.<\/p>\n<p>Como se mencion\u00f3 antes, Kubernetes permite asociar los pods actuales. Es decir, puedes hacer que ciertos pods funcionen junto a otros pods en la misma zona de disponibilidad (relevante para la nube) o nodos.<\/p>\n<p>En <code>podAffinity<\/code> los campos <code>afinidad<\/code> la secci\u00f3n <code>spec<\/code> disponibles son los mismos que en el caso de <code>nodeAffinity<\/code>: <code>requiredDuringSchedulingIgnoredDuringExecution<\/code><strong> <\/strong>y <code>preferredDuringSchedulingIgnoredDuringExecution<\/code>. La \u00fanica diferencia es que <code>matchExpressions<\/code> asociar\u00e1 pods a un nodo donde ya se est\u00e9 ejecutando un pod con esa etiqueta.<\/p>\n<p>Adem\u00e1s, Kubernetes ofrece el campo <code>podAntiAffinity<\/code>, que, por el contrario, no asocia un pod a un nodo con ciertos pods.<\/p>\n<p>Con respecto a las expresiones <code>nodeAffinity<\/code> se puede dar el mismo consejo: intenta mantener la simplicidad y la l\u00f3gica en las reglas, no intentes sobrecargar la especificaci\u00f3n de los pods con un conjunto complicado de reglas. Es muy f\u00e1cil crear una regla que no cumplir\u00e1 con las condiciones del cl\u00faster, creando una carga innecesaria para el programador y reduciendo el rendimiento general.<\/p>\n<h2>7. Taints &amp; Tolerations<\/h2>\n<p>Hay otra forma de gestionar el programador. Si tienes un gran cl\u00faster con cientos de nodos y miles de microservicios, es muy dif\u00edcil evitar que ciertos pods se coloquen en nodos espec\u00edficos.<\/p>\n<p>Aqu\u00ed es donde ayuda el mecanismo de taints \u2014 reglas prohibitorias. Por ejemplo, en ciertos escenarios, puedes prohibir a ciertos nodos ejecutar pods. Para aplicar un taint a un nodo espec\u00edfico, debes usar la opci\u00f3n <code>taint<\/code> en kubectl. Indica la clave y el valor, y luego el taint como <code>NoSchedule<\/code> o <code>NoExecute<\/code>:<\/p>\n<pre><code>$ kubectl taint nodes node10 node-role.kubernetes.io\/ingress=true:NoSchedule<\/code><\/pre>\n<p>Tambi\u00e9n vale la pena mencionar que el mecanismo de taint admite tres efectos principales: <code>NoSchedule<\/code>, <code>NoExecute<\/code> y <code>PreferNoSchedule<\/code><strong>. <\/strong><\/p>\n<ul>\n<li>\n<p><code>NoSchedule<\/code><strong> <\/strong>significa que mientras no haya una entrada correspondiente en la especificaci\u00f3n del pod <code>tolerations<\/code>, no podr\u00e1 ser desplegado en el nodo (en este ejemplo <code>node10<\/code>).<\/p>\n<\/li>\n<li>\n<p><code>PreferNoSchedule <\/code>\u2014 una versi\u00f3n simplificada <code>NoSchedule<\/code>. En este caso, el programador intentar\u00e1 no distribuir pods que no tengan la entrada correspondiente <code>tolerations<\/code> en el nodo, pero esto no es una restricci\u00f3n r\u00edgida. Si no hay recursos en el cl\u00faster, los pods comenzar\u00e1n a desplegarse en ese nodo.<\/p>\n<\/li>\n<li>\n<p><code>NoExecute<\/code><strong> <\/strong>\u2014 este efecto activa la evacuaci\u00f3n inmediata de los pods que no tienen un registro correspondiente <code>tolerations<\/code>.<\/p>\n<\/li>\n<\/ul>\n<p>Curiosamente, este comportamiento se puede anular mediante el mecanismo de tolerancias. Esto es conveniente cuando hay un nodo \"prohibido\" y necesitas desplegar solo servicios de infraestructura en \u00e9l. \u00bfC\u00f3mo hacerlo? Permitir solo aquellos pods para los que existe una tolerancia adecuada.<\/p>\n<p>As\u00ed es como se ver\u00e1 la especificaci\u00f3n del pod:<\/p>\n<pre><code>spec:\n   tolerations:\n     - key: \"node-role.kubernetes.io\\\/ingress\"\n        operator: \"Equal\"\n        value: \"true\"\n        effect: \"NoSchedule\"<\/code><\/pre>\n<p>Esto no significa que en el pr\u00f3ximo redeploy el pod necesariamente se asignar\u00e1 a este nodo, no es un mecanismo de afinidad de nodo y <code>nodeSelector<\/code>. Pero al combinar varias caracter\u00edsticas, puedes lograr una configuraci\u00f3n muy flexible del programador.<\/p>\n<h2>8. Configura la prioridad de despliegue de los pods<\/h2>\n<p>El hecho de que hayas configurado el enlace de los pods a los nodos no significa que todos los pods deban ser procesados con la misma prioridad. Por ejemplo, podr\u00edas querer desplegar algunos pods antes que otros.<\/p>\n<p>Kubernetes ofrece diferentes formas de configurar la prioridad de los pods (Prioridad y Preempci\u00f3n de Pods). La configuraci\u00f3n consta de varias partes: el objeto <code>PriorityClass<\/code><strong> <\/strong>y la descripci\u00f3n del campo <code>priorityClassName<\/code><strong> <\/strong>en la especificaci\u00f3n del pod. Veamos un ejemplo:<\/p>\n<pre><code>apiVersion: scheduling.k8s.io\\\/v1\nkind: PriorityClass\nmetadata:\n  name: high-priority\nvalue: 99999\nglobalDefault: false\ndescription: \"Esta clase de prioridad debe ser utilizada solo para pods muy importantes\"<\/code><\/pre>\n<p>Estamos creando <code>PriorityClass<\/code>, asign\u00e1ndole un nombre, descripci\u00f3n y valor.<strong> <\/strong>Cuanto mayor sea <code>value<\/code>, mayor ser\u00e1 la prioridad. El valor puede ser cualquier n\u00famero entero de 32 bits, menor o igual a 1,000,000,000. Valores m\u00e1s altos est\u00e1n reservados para pods del sistema cr\u00edticos, que generalmente no pueden ser despojados.<strong> <\/strong>El desalojo solo ocurrir\u00e1 si no hay lugar para desplegar un pod de alta prioridad, entonces algunos pods de un nodo espec\u00edfico ser\u00e1n evacuados. Si este mecanismo te parece demasiado estricto, puedes agregar la opci\u00f3n <code>preemptionPolicy: Never<\/code>, y entonces no habr\u00e1 desalojo; el pod estar\u00e1 en primer lugar en la cola y esperar\u00e1 a que el programador encuentre recursos libres para \u00e9l.<\/p>\n<p>Luego creamos un pod, en el que especificamos el nombre <code>priorityClassName<\/code>:<\/p>\n<pre><code>apiVersion: v1\nkind: Pod\nmetadata:\n  name: static-web\n  labels:\n    role: myrole\n spec:\n  containers:\n    - name: web\n      image: nginx\n      ports:\n        - name: web\n          containerPort: 80\n          protocol: TCP\n  priorityClassName: high-priority\n          <\/code><\/pre>\n<p>Se pueden crear tantas clases de prioridad como se desee, aunque se recomienda no exagerar (por ejemplo, limitarse a prioridad baja, media y alta). <\/p>\n<p>De esta manera, si es necesario, podr\u00e1 aumentar la eficiencia del despliegue de servicios cr\u00edticos, como nginx-ingress-controller, coredns, etc.<\/p>\n<h2>9. Optimice el cl\u00faster ETCD<\/h2>\n<p><img decoding=\"async\" alt=\"Nueve consejos para mejorar el rendimiento de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/f5917adfa943c789b6c784f43305851b.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>ETCD se puede considerar el cerebro de todo el cl\u00faster. Es muy importante mantener el funcionamiento de esta base de datos a un alto nivel, ya que de ella depende la velocidad de las operaciones en el 'Kube'. Mantener el cl\u00faster ETCD en los nodos maestros ser\u00eda una soluci\u00f3n est\u00e1ndar y, a la vez, bastante buena para tener una latencia m\u00ednima hacia kube-apiserver. Si no se puede hacer as\u00ed, coloque ETCD lo m\u00e1s cerca posible, manteniendo una buena capacidad de ancho de banda entre los participantes. Tambi\u00e9n preste atenci\u00f3n a cu\u00e1ntos nodos de ETCD pueden fallar sin da\u00f1ar el cl\u00faster.<\/p>\n<p><img decoding=\"async\" alt=\"Nueve consejos para mejorar el rendimiento de Kubernetes\" src=\"\/wp-content\/uploads\/2020\/10\/cdd2c32eefed253c6ff774899c367ccc.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tenga en cuenta que un aumento excesivo en el n\u00famero de participantes en el cl\u00faster puede mejorar la tolerancia a fallos a expensas del rendimiento, todo debe estar en equilibrio.<\/p>\n<p>En cuanto a la configuraci\u00f3n del servicio, hay pocas recomendaciones:<\/p>\n<ol>\n<li>\n<p>Tener buen hardware, seg\u00fan el tama\u00f1o del cl\u00faster (puede leer <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/op-guide\/hardware.md\">aqu\u00ed<\/a><\/noindex>).<\/p>\n<\/li>\n<li>\n<p>Ajustar algunos par\u00e1metros si ha distribuido el cl\u00faster entre un par de centros de datos o si su red y discos dejan mucho que desear (puede leer <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/etcd-io\/etcd\/blob\/master\/Documentation\/tuning.md\">aqu\u00ed<\/a><\/noindex>).<\/p>\n<\/li>\n<\/ol>\n<h2>Conclusi\u00f3n<\/h2>\n<p>En este art\u00edculo se describen los puntos que nuestro equipo intenta seguir. No es una descripci\u00f3n paso a paso de acciones, sino opciones que pueden ser \u00fatiles para optimizar los costos operativos del cl\u00faster. Est\u00e1 claro que cada cl\u00faster es \u00fanico, y las decisiones de configuraci\u00f3n pueden variar mucho, por lo que ser\u00eda interesante recibir su retroalimentaci\u00f3n: \u00bfc\u00f3mo supervisa su cl\u00faster de Kubernetes, qu\u00e9 herramientas utiliza para mejorar su funcionamiento? Comparta su experiencia en los comentarios, ser\u00e1 interesante conocerla. <\/p>\n<p>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/domclick\/blog\/520968\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 \u041e\u043b\u0435\u0433 \u0421\u0438\u0434\u043e\u0440\u0435\u043d\u043a\u043e\u0432, \u044f \u0440\u0430\u0431\u043e\u0442\u0430\u044e \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0414\u043e\u043c\u041a\u043b\u0438\u043a \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b. \u041c\u044b \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0438\u0440\u0443\u0435\u043c \u00ab\u041a\u0443\u0431\u0438\u043a\u00bb \u0432 \u043f\u0440\u043e\u0434\u0435 \u0443\u0436\u0435 \u0431\u043e\u043b\u044c\u0448\u0435 \u0442\u0440\u0451\u0445 \u043b\u0435\u0442, \u0438 \u0437\u0430 \u044d\u0442\u043e \u0432\u0440\u0435\u043c\u044f \u043f\u0435\u0440\u0435\u0436\u0438\u043b\u0438 \u0441 \u043d\u0438\u043c \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u0445 \u043c\u043e\u043c\u0435\u043d\u0442\u043e\u0432. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f \u043f\u043e\u0432\u0435\u0434\u0430\u044e \u0432\u0430\u043c, \u043a\u0430\u043a \u043f\u0440\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u043f\u043e\u0434\u0445\u043e\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0436\u0430\u0442\u044c \u0438\u0437 \u00ab\u0432\u0430\u043d\u0438\u043b\u044c\u043d\u043e\u0433\u043e\u00bb Kubernetes \u0435\u0449\u0451 \u0431\u043e\u043b\u044c\u0448\u0435 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. Ready steady [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":97983,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-97982","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=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\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\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-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\udd47\u0414\u0435\u0432\u044f\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043f\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-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-10-23T12:42:15+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-11-17T22:58:47+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\udd47Nueve consejos para mejorar el rendimiento de Kubernetes | ProHoster","description":"\u00a1Hola a todos!","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-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\udd47\u0414\u0435\u0432\u044f\u0442\u044c \u0441\u043e\u0432\u0435\u0442\u043e\u0432 \u043f\u043e \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u0438\u044e \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 Kubernetes | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442!","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/devyat-sovetov-po-povysheniyu-proizvoditelnosti-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-10-23T12:42:15+00:00","article:modified_time":"2020-11-17T22:58:47+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"97982","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 10:08:27","updated":"2022-09-30 17:30:03","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\/97982","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=97982"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/97982\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/97983"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=97982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=97982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=97982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}