Kubernetes 1.11: una visión general de las principales innovaciones


Kubernetes 1.11 fue lanzado el miércoles . Continuamos nuestra tradición y hablamos sobre los cambios más significativos, basados ​​en datos de CHANGELOG-1.11 y numerosos temas, solicitudes de extracción y propuestas de diseño. ¿Qué hay de nuevo en K8s 1.11?

Redes


Comencemos con las redes, ya que el anuncio de Kubernetes 1.11 marcó la estabilización oficial (es decir, la transferencia al estado de Disponibilidad general) de dos innovaciones importantes presentadas en versiones anteriores. El primero de ellos es el equilibrio de carga de los servicios dentro del clúster, basado en IPVS (IP Virtual Server). Esta oportunidad vino de Huawei que la primavera pasada presentó a la comunidad los resultados de su trabajo para mejorar el equilibrio de carga de más de 50 mil servicios utilizando IPVS en lugar de iptables. Esta elección se explicó de manera bastante lógica: “Si las tablas ip se crean para firewalls y se basan en listas de reglas en el núcleo, entonces IPVS está diseñado para equilibrar la carga y se basa en tablas hash en el núcleo; Además, IPVS admite algoritmos de equilibrio de carga más avanzados que iptables, así como otras características útiles (por ejemplo, verificación de estado, reintentos, etc.) ".


Diapositiva de Scaling Kubernetes de Huawei para soportar la presentación de 50,000 servicios en KubeCon Europe 2017

¿Qué trajo en la práctica? "Mejor ancho de banda de red, menos latencia de software [hablando del tiempo que lleva agregar nuevos puntos finales a los servicios - aprox. perev. ] y una mejor escalabilidad para el equilibrador de carga en el clúster ". La versión alfa del modo IPVS para kube-proxy apareció en Kubernetes 1.8 y se ha estabilizado en la versión actual 1.11: aunque de forma predeterminada todavía no está habilitada, ya está oficialmente lista para servir tráfico en clústeres de producción.

La segunda característica madura es CoreDNS como el servidor DNS utilizado por el clúster Kubernetes. Escribimos más sobre esta solución en una revisión separada , y en resumen, es un servidor DNS flexible y fácilmente extensible, originalmente basado en el servidor web Caddy , que se convirtió en el sucesor de SkyDNS (por cierto, kube-dns se basa en él, reemplazado por CoreDNS) , escrito en Go y enfocado en el mundo de las aplicaciones en la nube (nativas de la nube). Otro hecho notable de CoreDNS es el hecho de que parece ser el único archivo ejecutable y el único proceso en el sistema. Ahora, esta no es solo otra opción de DNS para el clúster de Kubernetes, sino también la opción predeterminada para kubeadm . Las instrucciones para usar CoreDNS en Kubernetes están disponibles aquí (y para Cluster Federation, aquí ).

Entre otras actualizaciones en la red de Kubernetes "mundo":

  • en NetworkPolicies ahora es posible especificar subas específicas en otros espacios de nombres usando namespaceSelector y podSelector ;
  • los servicios ahora pueden escuchar en los mismos puertos de host en diferentes interfaces (especificadas en --nodeport-addresses );
  • Se corrigió un error por el cual Kubelet cuando usaba --node-ip dejaba de informar ExternalDNS , InternalDNS y ExternalIP .

Instalaciones de almacenamiento


Introducido en Kubernetes 1.9, la característica de protección contra la eliminación de PVC ( PersistentVolumeClaims ) utilizada por cualquier cápsula y PV ( PersistentVolumes ) atados a PVC, más tarde (en K8s 1.10) llamada StorageProtection , se declara estable.

La capacidad de cambiar el tamaño del volumen (PV) después de reiniciar el hogar se ha traducido al estado beta y, dentro de la versión alfa, ha vuelto a estar disponible el cambio de tamaño del volumen en tiempo real , es decir. sin la necesidad de reiniciar el hogar.

En apoyo de AWS EBS y GCE PD, se aumentó el límite para el número máximo posible de volúmenes conectados al host, y en los complementos AWS EBS, Azure Disk, GCE PD y Ceph RBD implementaron soporte para volúmenes de aprovisionamiento dinámico de dispositivos sin formato en bloque. Para los volúmenes de AWS EBS , también se ha agregado la capacidad de usar pods en modo ReadOnly .

Además, Kubernetes 1.11 introdujo una versión alfa de soporte para límites dinámicos en volúmenes dependiendo del tipo de nodo, así como soporte de API para volúmenes de bloque en controladores de almacenamiento externo CSI ( Interfaz de almacenamiento de contenedores - apareció en Kubernetes 1.9 ). Además, CSI implementó la integración con el nuevo motor de registro del complemento Kubelet .

Nodos de clúster


Los 5 principales cambios principales de la versión 1.11 de Kubernetes también incluyen la transferencia al estado de una versión beta de la configuración dinámica de Kubelet , que apareció por primera vez en K8s 1.8 y requiere múltiples cambios (puede rastrearlos en el ticket de configuración dinámica de Kubelet original ). Esta característica permite implementar nuevas configuraciones de Kubelet en clústeres activos y en funcionamiento (en oposición a la situación anterior, cuando la configuración de Kubelet se pasó a través de indicadores de línea de comando). Para usarlo, debe configurar la --dynamic-config-dir (cuando se inicia Kubelet ).

El proyecto cri-tools ha sido declarado estable. Ofrece herramientas para administradores de sistemas que le permiten analizar y depurar el funcionamiento de los nodos en producción, independientemente del tiempo de ejecución del contenedor utilizado. Los paquetes con él ( crictl ) ahora se envían con el resto de las utilidades de kubeadm (en formatos DEB y RPM). Escribimos más sobre el propósito y las capacidades de crictl en un artículo reciente sobre la integración de containerd con Kubernetes, reemplazando el Docker "tradicional".


Ejemplos de uso de crictl de la documentación del proyecto

El soporte experimental para sysctls en Linux se ha convertido al estado beta (habilitado de forma predeterminada mediante el Sysctls función Sysctls ). PodSecurityPolicy objetos PodSecurityPolicy y Pod tienen campos especiales para especificar / controlar sysctls .

También en ResourceQuota hizo posible especificar una clase de prioridad (en este caso, la cuota se aplica solo a los pods con esta clase; vea las propuestas de diseño para más detalles), y la condición ContainersReady se ha agregado al estado del pod.

Derechos y seguridad


La característica de Agregación de ClusterRole introducida en K8s 1.9, que le permite agregar permisos a roles existentes (incluidos los creados automáticamente), se declara estable sin recibir ningún cambio. También se ha agregado una función separada para cluster-autoscaler ( ClusterRole ): se usa en lugar del sistema ( cluster-admin ).

Se han llevado a cabo varios trabajos en la dirección de la transparencia de lo que (y por qué) está sucediendo dentro del clúster. En particular, la información RBAC en los registros de auditoría ahora contiene anotaciones adicionales para eventos :

  • authorization.k8s.io/decision : allow o forbid ;
  • authorization.k8s.io/reason : razón legible por la persona para la decisión.

También en los registros de auditoría se agregó información sobre el acceso desde PodSecurityPolicy en forma de anotaciones podsecuritypolicy.admission.k8s.io/admit-policy y podsecuritypolicy.admission.k8s.io/validate-policy (¿bajo qué política se permite?).

Utilidades de consola


Muchas (aunque no tan significativas, ¡pero útiles!) Las mejoras se presentan en las herramientas CLI de Kubernetes:

  • Nuevo comando kubectl wait el momento en que se eliminan los recursos especificados o se alcanza una determinada condición.
  • Nuevo kubectl api-resources para ver recursos:

  • Soporte de kubectl cp para kubectl cp .
  • La función base64decode está disponible en las plantillas de base64decode Go, cuyo nombre habla por sí mismo.
  • Se agregó soporte para el --dry-run en el kubectl patch .
  • El --match-server-version vuelto global; la kubectl version también lo tendrá en cuenta.
  • La kubectl config view --minify ahora tiene en cuenta el indicador de context global.
  • kubectl apply --prune recursos kubectl apply --prune agregado a kubectl apply --prune CronJob .

Otros cambios


  • El planificador ( kube-Scheduler ) aprendió a planificar pods en DaemonSet (versión alfa).
  • Es posible especificar un grupo de usuarios del sistema específico ( RunAsGroup ) para contenedores en el hogar (versión alfa).
  • Posibilidad de eliminar huérfanos ( eliminación de huérfanos ) para CustomResources .
  • Mejoras en el soporte API de Kubernetes para hogares y contenedores en Windows: métricas agregadas para hogares, contenedores y el sistema de archivos con registros, contextos de run_as_user , volúmenes constantes locales y fstype para la unidad de Azure.
  • Azure agrega soporte para el equilibrador de carga de SKU estándar y la IP pública.

Compatibilidad


  • La versión compatible de etcd es 3.2.18 (Kubernetes 1.10 era 3.1.12).
  • Versiones verificadas de Docker : de 1.11.2 a 1.13.1 y 17.03.x (no han cambiado desde el lanzamiento de K8s 1.10).
  • La versión Go es 1.10.2 (en lugar de 1.9.3), el mínimo admitido es 1.9.1.
  • La versión CNI es 0.6.0.
  • La versión CSI es 0.3.0 (en lugar de 0.2.0).

PS


Lea también en nuestro blog:

Source: https://habr.com/ru/post/es415349/


All Articles