Kubernetes 1.14: Resumen de las innovaciones clave



Kubernetes - 1.14 será lanzado esta noche. De acuerdo con la tradición que se ha desarrollado para nuestro blog, estamos hablando de cambios clave en la nueva versión de este maravilloso producto de Código Abierto.

La información utilizada para preparar este material se toma de la tabla de seguimiento de mejoras de Kubernetes , CHANGELOG-1.14 y cuestiones relacionadas, solicitudes de extracción, Propuestas de mejora de Kubernetes (KEP). ACTUALIZACIÓN (26 de marzo): el anuncio oficial de lanzamiento también apareció en el blog de K8.

Comencemos con la importante introducción del ciclo de vida del clúster SIG: los clústeres dinámicos de conmutación por error de Kubernetes (y más precisamente, las implementaciones de alta disponibilidad autohospedadas) ahora se pueden crear utilizando los comandos kubeadm ( init y join ) habituales (en el contexto de clusters de un solo nodo). En resumen, para esto:

  • los certificados utilizados por el clúster se transfieren a secretos;
  • para la posibilidad de usar el clúster etcd dentro del clúster K8s (es decir, deshacerse de la dependencia externa que ha existido hasta ahora), se usa el operador etcd ;
  • Se documentan las configuraciones recomendadas para un equilibrador de carga externo que proporciona una configuración tolerante a fallas (en el futuro, se planifica la posibilidad de falla de esta dependencia, pero no en esta etapa).


Arquitectura de clúster de Kubernetes HA construida con kubeadm

Los detalles de la implementación se pueden encontrar en la propuesta de diseño . Esta característica era muy esperada: la versión alfa se esperaba en K8s 1.9, pero solo apareció ahora.

API


El comando de apply y la administración de objetos en general declarativa se mueven de kubectl a un servidor. Los propios desarrolladores explican brevemente su decisión al decir que kubectl apply es una parte fundamental del trabajo con configuraciones en Kubernetes, sin embargo, está "lleno de errores y es difícil de solucionar", y por lo tanto esta funcionalidad necesita restaurarse a la normalidad y transferirse al plano de control. Ejemplos simples e ilustrativos de los problemas de hoy:



Los detalles de la implementación se encuentran en KEP . La disponibilidad actual es la versión alfa (la promoción a beta está prevista para la próxima versión de Kubernetes).

En la versión alfa, la capacidad de usar el esquema OpenAPI v3 para crear y publicar la documentación de OpenAPI en CustomResources (CR) utilizada para validar los recursos K8 definidos por el usuario (del lado del servidor) (CustomResourceDefinition, CRD) está disponible. La publicación de OpenAPI para CRD permite a los clientes (por ejemplo, kubectl ) realizar la validación de su lado (como parte de kubectl create y kubectl apply ) y emitir documentación de acuerdo con el esquema ( kubectl explain ). Los detalles están en el KEP .

Los registros preexistentes ahora se abren con el indicador O_APPEND (en lugar de O_TRUNC ) para evitar la pérdida de registros en algunas situaciones y para la conveniencia de registros truncados con utilidades de rotación externas.

También en el contexto de la API de Kubernetes, se puede observar que en el PodSandbox y PodSandboxStatus campo PodSandboxStatus para tener en cuenta la información sobre RuntimeClass en el pod (lea más sobre esto en el texto sobre el lanzamiento de Kubernetes 1.12 , donde esta clase apareció como una versión alfa), y en Admission Webhooks implementó la capacidad de determinar qué versiones de AdmissionReview admiten. Finalmente, en las reglas de Admisión de Webhooks, ahora puede limitar el alcance de su aplicación al espacio de nombres y al alcance del clúster.

Instalaciones de almacenamiento


PersistentLocalVolumes que tienen estado beta desde el lanzamiento de K8s 1.10 se declaran estables (GA): esta puerta de características ya no se desactivará y se eliminará en Kubernetes 1.17.

Se ha desarrollado la capacidad de utilizar las variables de entorno de la denominada API descendente (por ejemplo, el nombre del pod) para los nombres de directorio montados como subPath , en forma de un nuevo campo subPathExpr , con el que ahora se determina el nombre de directorio deseado. Inicialmente, la función apareció en Kubernetes 1.11, pero para 1.14 permaneció en el estado de versión alfa.

Al igual que con la versión anterior de Kubernetes, se introducen muchos cambios significativos para el CSI (Interfaz de almacenamiento de contenedores) que evoluciona rápidamente:

CSI


El soporte para cambiar el tamaño del soporte para volúmenes CSI ha estado disponible (como parte de la versión alfa). Para usarlo, deberá habilitar la puerta de características llamada ExpandCSIVolumes , así como la presencia de soporte para esta operación en un controlador CSI específico.

Otra característica para CSI en la versión alfa es la capacidad de referirse directamente (es decir, sin usar PV / PVC) a volúmenes CSI como parte de la especificación de pod. Esto elimina la restricción de usar CSI como almacenes de datos exclusivamente remotos , abriéndoles la puerta al mundo de los volúmenes efímeros locales . Para usar ( ejemplo de la documentación ), debe habilitar la puerta de la característica CSIInlineVolume .

Ha habido progreso en los "componentes internos" de Kubernetes relacionados con CSI, que no son tan notorios para los usuarios finales (administradores del sistema) ... Por el momento, los desarrolladores están obligados a admitir dos versiones de cada complemento de almacenamiento: uno "a la antigua usanza", dentro de la base de código de K8 (en -tree), y el segundo - como parte del nuevo CSI (lea más sobre esto, por ejemplo, aquí ) . Esto causa inconvenientes comprensibles que deben abordarse a medida que el CSI como tal se estabiliza. Simplemente desaprobar la API en desuso de los complementos en árbol no es posible debido a la política de Kubernetes correspondiente .

Todo esto llevó al hecho de que la versión alfa alcanzó el proceso de migración del código interno de los complementos implementados como in-trees a los complementos CSI, debido a que las preocupaciones de los desarrolladores se reducirán a admitir una versión de sus complementos, y se preservará la compatibilidad con las API antiguas y se podrán declarar obsoleto como de costumbre. Se espera que en la próxima versión de Kubernetes (1.15), se migren todos los complementos del proveedor de la nube, la implementación recibirá el estado beta y se activará en las instalaciones predeterminadas de K8s. Vea la propuesta de diseño para más detalles. Esta migración también resultó en el rechazo de restricciones para volúmenes definidos por proveedores específicos de la nube (AWS, Azure, GCE, Cinder).

Además, el soporte para dispositivos de bloque CSI ( CSIBlockVolume ) se ha convertido a beta.

Nodos / Kubelet


Introdujo una versión alfa del nuevo punto final en Kubelet, diseñado para devolver métricas para los recursos principales . En términos generales, si Kubelet solía obtener estadísticas sobre el uso de contenedores de cAdvisor, ahora estos datos provienen del tiempo de ejecución del contenedor a través de la CRI (Interfaz de tiempo de ejecución del contenedor), pero se preserva la compatibilidad con versiones anteriores de Docker. Anteriormente, las estadísticas recopiladas en Kubelet se proporcionaban a través de la API REST, pero ahora utiliza el punto final ubicado en /metrics/resource/v1alpha1 . La estrategia a largo plazo de los desarrolladores es minimizar el conjunto de métricas proporcionadas por Kubelet. Por cierto, estas métricas ahora se denominan no "métricas centrales", sino "métricas de recursos", y se describen como "recursos de primera clase, como CPU y memoria".

Un matiz muy interesante: a pesar de la clara ventaja en el rendimiento del punto final de gRPC en comparación con los diferentes casos de uso del formato Prometheus (el resultado de uno de los puntos de referencia'ov ver a continuación) , los autores prefirieron el formato de texto Prometheus debido al liderazgo claro de este sistema de monitoreo en la comunidad.

“GRPC no es compatible con las principales tuberías de monitoreo. Endpoint solo será útil para entregar métricas a Metrics Server o monitorear componentes que se integran directamente con él. Cuando se usa el almacenamiento en caché en Metrics Server, el rendimiento del formato de texto Prometheus es lo suficientemente bueno para que podamos preferir Prometheus en lugar de gRPC, dado el uso generalizado de Prometheus en la comunidad. Cuando el formato OpenMetrics se vuelve más estable, podemos acercarnos al rendimiento de gRPC con un formato basado en proto ”.


Una de las pruebas de rendimiento comparativas que utilizan los formatos gRPC y Prometheus en el nuevo punto final de Kubelet para métricas. Se pueden encontrar más gráficos y otros detalles en KEP .

Entre otros cambios:

  • Kubelet ahora acepta el parámetro pid=<number> en las --system-reserved y --kube-reserved , asegurando que el PID especificado se reservará para todo el sistema o los demonios del sistema Kubernetes, respectivamente. La función se activa cuando la puerta de la función está habilitada, llamada SupportNodePidsLimit .
  • Kubelet ahora (una vez) intenta detener los contenedores en un estado desconocido antes de reiniciar y eliminar operaciones.
  • Al usar PodPresets , la misma información ahora se agrega al contenedor init como un contenedor normal.
  • Kubelet comenzó a usar usageNanoCores uso del proveedor de estadísticas CRI, y se agregaron estadísticas de red para nodos y contenedores en Windows.
  • La información sobre el sistema operativo y la arquitectura ahora se registra en las kubernetes.io/arch kubernetes.io/os y kubernetes.io/arch de los objetos Node (transferidos de beta a GA).
  • La capacidad de especificar un grupo de usuarios de sistema específico para contenedores en el pod ( RunAsGroup , apareció en K8s 1.11 ) ha progresado a la versión beta (habilitada de manera predeterminada).
  • du y find utilizados en cAdvisor son reemplazados por implementaciones Go.

CLI


El indicador -k se ha agregado a cli-runtime y kubectl para la integración con kustomize (por cierto, ahora se está desarrollando en un repositorio separado), es decir. para procesar archivos YAML adicionales de directorios especiales de personalización (para obtener detalles sobre su uso, consulte KEP ):


Un ejemplo de un uso simple del archivo de personalización ( también es posible un uso más complicado de kustomize dentro de las superposiciones )

Además

  • El logotipo de kubectl y su documentación se han actualizado ; consulte kubectl.docs.kubernetes.io .

  • Se ha kubectl create cronjob un nuevo kubectl create cronjob , cuyo nombre habla por sí mismo.
  • En los kubectl logs ahora puede combinar los indicadores -f (- --follow para los registros de transmisión) y -l ( --selector para la consulta de etiquetas).
  • kubectl enseñó a copiar archivos seleccionados con un comodín.
  • El indicador kubectl wait se agregó al comando de kubectl wait para seleccionar todos los recursos en el espacio de nombres del tipo de recurso especificado.
  • Mecanismo de complemento estable declarado para kubectl .

Otros


El estado estable (GA) recibió las siguientes características:

  • Soporte para nodos de Windows (incluido Windows Server 2019), lo que implica la posibilidad de planificar contenedores de Windows Server en Kubernetes (ver también KEP );
  • ReadinessGate utilizado en la especificación del pod para determinar condiciones adicionales que se consideran en la preparación del pod;
  • Soporte para páginas grandes (puerta de funciones llamada HugePages );
  • CustomPodDNS ;
  • PriorityClass API, Pod Priority & Preemption .

Otros cambios introducidos en Kubernetes 1.14:

  • La política predeterminada de RBAC ya no proporciona acceso a la API de discovery y access-review a usuarios no autenticados.
  • El soporte oficial para CoreDNS se proporciona solo para Linux, por lo que cuando se usa kubeadm para su implementación (CoreDNS) en un clúster, los nodos deberían funcionar solo en Linux (los nodos de selección se usan para esta limitación).
  • La configuración predeterminada de CoreDNS ahora usa el complemento de reenvío en lugar del proxy. Además, se ha agregado readinessProbe a CoreDNS, lo que evita el equilibrio de carga en los pods correspondientes (no listos para el servicio).
  • En kubeadm, en las upload-certs init o upload-certs , fue posible cargar los certificados requeridos para conectar el nuevo plano de control al secreto de --experimental-upload-certs se usa la bandera --experimental-upload-certs ).
  • Para las instalaciones de Windows, ha aparecido una versión alfa de soporte para gMSA (Cuenta de servicio administrado de grupo): cuentas especiales en Active Directory, que pueden ser utilizadas por los contenedores.
  • Para GCE , el cifrado mTLS se activó entre etcd y kube-apiserver.
  • Actualizaciones en el software usado / dependiente: Go 1.12.1, CSI 1.1, CoreDNS 1.3.1, soporte para Docker 18.09 en kubeadm, y la versión mínima admitida de la API de Docker fue 1.26.

PS


Lea también en nuestro blog:

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


All Articles