Notas de cambios de Istio 1.31.0
Notas de la versión Istio 1.31.0.
Gestión del tráfico
Mejorado el registro cuando un CRD de Gateway API instalado en el clúster está por debajo de la versión mínima requerida por esta versión de Istio. El mensaje ahora se registra al nivel
warny explica que los recursos de ese tipo no serán procesados hasta que los CRDs se actualicen. Anteriormente, se registraba al nivelinfoy era fácil de perder, lo que dificultaba el diagnóstico de fallos en TLS passthrough tras actualizar a 1.30 con CRDs obsoletos.Mejorada la escalabilidad de istiod en modo ambient al limitar los pushes XDS por cambios en
Addressde workload/servicio solo a los waypoints afectados, en lugar de enviarlos a todos los waypoints y proxies. Se puede deshabilitar conAMBIENT_SCOPED_ADDRESS_PUSHES=false.Añadido soporte para un nombre de taint personalizado para el controlador pilot de eliminación de taints de nodo mediante la variable de entorno
PILOT_NODE_UNTAINT_CONTROLLERS_TAINT_NAME. El valor por defecto escni.istio.io/not-ready. (Issue #57844)Añadido soporte para excluir la configuración de política de Istio cuando la anotación
istio.io/ignore-policy-attachmentse establece entrueen un objetoBackendTLSPolicyoXBackendTrafficPolicy. Esto permite evitar que políticas específicas se traduzcan a configuración de Istio cuando la política está destinada a un controlador de gateway diferente.Ejemplo de uso:
apiVersion: gateway.networking.k8s.io/v1
kind: BackendTLSPolicy
metadata:
annotations:
istio.io/ignore-policy-attachment: "true"Añadido soporte para excluir namespaces y hosts del campo
hostsde un listener de egress deSidecarusando un prefijo~en el namespace. Las entradas sin prefijo se importan como antes, y las entradas con prefijo~se sustraen de ellas:~ns1/*excluye todos los hosts enns1, y~/foo.comexcluyefoo.comde todos los namespaces. Esto permite que las meshes grandes importen todo excepto unos pocos namespaces (p.ej.*/*más~ns1/*) sin enumerar una larga lista de permisos. (Issue #60139)Añadida una verificación de inicialización que comprueba que el binario
nftincluido admite salida JSON. El backend nftables nativo requiere JSON para leer la configuración durante la eliminación de pods. En hosts cuyo binarionftno admite JSON, esas llamadas fallan conError: JSON support not compiled-inen cada eliminación, y el agente CNI reintenta indefinidamente. La nueva verificación detecta este error al inicio y vuelve al backendiptables. (Issue #60328)Añadido el campo
prefix_rewriteaHTTPRedirect, que habilita la reescritura de rutas con conciencia de prefijo en reglas de redirección. Esto permite eliminar o reemplazar el prefijo de ruta coincidente al redirigir, p.ej. redirigirexample.com/foo/barafoo.example.com/bar. (Issue #47500),(Issue #47777),(Issue #52521)Añadido el campo
budget_intervala la APIRetryBudgetdeTrafficPolicypara configurar el intervalo con el que se consideran las solicitudes al calcular el presupuesto de reintento. El valor por defecto, 0ms, conserva el comportamiento existente de considerar solo las solicitudes en vuelo. (Issue #60389)Añadido soporte para canaries de waypoint con peso en modo ambient. Un servicio (o namespace) ahora puede referenciar un waypoint primario y uno canary mediante las etiquetas
istio.io/use-waypoint-canaryyistio.io/use-waypoint-canary-namespace, con la anotaciónistio.io/use-waypoint-canary-weightdirigiendo un porcentaje configurable de las conexiones en la mesh del servicio (y, conistio.io/ingress-use-waypoint, las solicitudes de ingress) al waypoint canary sin cambios en el cliente. (Issue #60801)Añadida la opción
meshConfig.serviceEntryVisibility, que permite a un administrador de la mesh controlar la visibilidad de los recursosServiceEntry. El modo ambient (ztunnel y waypoints) impone la visibilidad por defecto; los sidecars clásicos también la respetan cuando se estableceapplyToSidecars. La funcionalidad es inactiva si no se configura, por lo que las meshes existentes no se ven afectadas por defecto. (Issue #60870)Añadida la
GatewayClassistio-agentgateway-waypointpara desplegar agentgateway como waypoint.Añadido el modo de política de tráfico de salida
ALLOW_ANY_DYNAMIC_DNS. Cuando se establece enmeshConfig.outboundTrafficPolicy.mode, las solicitudes HTTP en texto plano a destinos desconocidos se reenvían mediante el Dynamic Forward Proxy de Envoy, resolviendo nombres de host del encabezadoHosten tiempo de solicitud. El tráfico no HTTP (TLS y TCP) sigue usandoPassthroughCluster. Solo aplica a proxies sidecar. No compatible con el CRDSidecar. La originación TLS upstream opcional se puede configurar mediantemeshConfig.outboundTrafficPolicy.tls.Añadido soporte para
connectionSettingsenProxyConfig, que permite configurar límites de buffer de listener, timeouts HTTP, ajustes HTTP/2 y normalización de rutas/cabeceras. El nuevo perfilEDGEaplica valores predeterminados de proxy de borde de Envoy orientados a los proxies gateway.Añadida la nueva operación de parche
MERGE_AND_REPLACE_LISTaEnvoyFilter. Se comporta comoMERGE, excepto que los campos repetidos (de lista) presentes en el parche reemplazan completamente la lista correspondiente en la configuración generada en lugar de añadirse. Aplica a los destinos de parcheCLUSTER,LISTENER,FILTER_CHAIN,ROUTE_CONFIGURATION,VIRTUAL_HOSTyHTTP_ROUTE. Las listas anidadas dentro de configuraciones de filtros tipadas comoAny(filtros HTTP, de red, de listener y sockets de transporte) no se ven afectadas y siguen la semánticaMERGE.Añadida la implementación de la funcionalidad
AllowInsecureFallbackde Gateway API en la lógica de validación de certificados de cliente. Esta funcionalidad permite que un gateway solicite un certificado de cliente e intente validarlo, pero si el cliente no presenta un certificado o no es válido, el gateway permite igualmente la conexión. Por defecto, Istio rellena la cabecera HTTPx-forwarded-client-cert, por lo que cuandoAllowInsecureFallbackestá habilitado, el backend puede verificar el certificado en lugar del gateway. (Issue #60018)Añadido soporte para configurar los ajustes de keepalive PING de HTTP/2 en conexiones upstream mediante
DestinationRule. (Issue #55640)Añadida la opción
defaultTrafficPolicyaMeshConfig, unconnectionPoolyoutlierDetectionbase a nivel de mesh que los clústeres de salida heredan. UnaDestinationRuleque establezca uno de estos bloques anula la base para ese bloque; un bloque queDestinationRuledeja sin establecer ahora hereda la base de la mesh en lugar de los valores predeterminados integrados de Istio. Cuando no se configura ninguna base, el comportamiento no cambia. ElconnectionPoolbase también se aplica a los clústeres entrantes y al clúster de passthrough.Añadido soporte para el balanceo de carga por zona de Envoy mediante el nuevo campo
zoneAwareLbSettingenDestinationRule.TrafficPolicy.LoadBalancerSettingsyMeshConfig. Cuando está habilitado, Envoy enruta automáticamente el tráfico a endpoints en la misma zona de disponibilidad que el proxy downstream, derivando a otras zonas solo cuando la capacidad local es insuficiente. Esto difiere dellocalityLbSettingexistente en que el enrutamiento por zona es gestionado automáticamente por Envoy usando la distribución de zona del proxy, en lugar de porcentajes estáticos. El orden de failover entre regiones se puede configurar mediante el campofailover, y los niveles de prioridad basados en etiquetas se pueden añadir encima mediantefailoverPriority. El balanceo de carga por zona requiereISTIO_META_ENABLE_SELF_DISCOVERY: "true"enmeshConfig.defaultConfig.proxyMetadatapara inyectar ellocal_clusterde auto-descubrimiento en los bootstraps del sidecar. Solo se admite en modo sidecar, no en modo ambient. (referencia)(referencia)Habilitado el envío de endpoints no saludables por defecto a menos que
OutlierDetection.minHealthPercentesté configurado. Se puede deshabilitar estableciendoPILOT_AUTO_SEND_UNHEALTHY_ENDPOINTSenfalse.Corregido el manejo de Gateway API para implementar la resolución de conflictos de
BackendTLSPolicy. (Issue #57817)Corregido un error donde los clústeres entrantes no aparecían para proxies que se reconectaban a una nueva instancia de istiod (p.ej. durante reinicios continuos) cuando el pod aún no estaba presente en la caché del kube informer. Las etiquetas del workload ahora se rellenan antes de calcular los destinos de servicio, por lo que la ruta de fallback de metadatos en
GetProxyServiceTargetscoincide correctamente con los servicios en lugar de devolver una lista vacía. (Issue #58125)Corregido un problema donde, cuando
PILOT_ENABLE_QUIC_LISTENERSestá habilitado, los recursosServicede Gateway API generados no escuchaban en el puerto UDP correspondiente para cada listener HTTPS. (Issue #58247)Corregido un problema donde los listeners HTTPS definidos mediante
ListenerSetno entregaban certificados TLS cuando el Gateway padre usaba despliegue manual. (Issue #59535)Corregido un problema donde los filtros de
HTTPRouteyGRPCRoutecon valores de cabecera no válidos se eliminaban silenciosamente de la configuración de Envoy en lugar de reportar un estadoInvalidFilter. (Issue #59933)Corregido un breve corte de tráfico al cambiar la etiqueta
istio.io/reven un Kubernetes Gateway (oListenerSet). El control plane propietario anterior ya no descarta el recurso ni envía configuración xDS vacía a los pods de gateway que siguen ejecutándose en la revisión anterior. Las escrituras de estado para revisiones no propietarias siguen suprimidas, por lo que las revisiones no alternan el estado de las demás. (Issue #59959)Corregido el modo ambient multi-red para que ahora enrute al waypoint cuando el ingress de una red llama a un servicio en una red diferente, y solo si el
Serviceestá configurado conistio.io/ingress-use-waypoint.Corregido un problema donde la configuración del listener del waypoint en clústeres IPv6 contenía un
IPMatcher.RangeMatchercon el camporangesvacío cuando había un Service headless (spec.clusterIP: None) en el alcance del waypoint. Esto ocurría porque el marcadorconstants.UnspecifiedIP(codificado en IPv4) usado para laDefaultAddressde los servicios headless es filtrado para proxies solo-IPv6 porFilterAddressesByIPFamily. Envoy 1.38 valida estrictamente la reglarepeated.min_items=1del proto enIPMatcher.RangeMatcher.rangesy rechaza el push LDS. El constructor del listener del waypoint ahora omite la entradaIPRangeMatchercuando no hay direcciones que incluir. Los clústeres IPv4 no se ven afectados. (Issue #60310)Corregido un problema donde el balanceo de carga
consistentHashenDestinationRuleno enviaba tráfico a los nuevos endpoints tras escalar, debido a una regresión de Envoy (envoyproxy/envoy#45212) donde el anillo RING_HASH no se reconstruía al cambiar endpoints durante actualizaciones por lotes. (Issue #60312)Corregido un panic fatal de
concurrent map writesen el agenteistio-cnicuando dos pods se añadían a la ambient mesh en el mismo nodo al mismo tiempo. (Issue #60328)Corregido el caso donde una
DestinationRuley una política de backend de Gateway API (BackendTLSPolicyoXBackendTrafficPolicy) apuntan al mismo host: ahora los campos deDestinationRuletienen precedencia y la política de backend solo rellena los campos queDestinationRuledeja sin establecer, independientemente de cuál se creó primero. (Issue #60358)Corregido un error en modo ambient donde un Service que combinaba
publishNotReadyAddresses: truecon una distribución de tráficoPreferSameZoneoPreferSameNodehacía que ztunnel recibierahealthPolicy: AllowAllpara todos los demás Services que usaban el mismo preset de distribución de tráfico, lo que provocaba que el tráfico se enrutara a endpoints no listos en todo el clúster. (Issue #60422)Corregido un problema donde el vaciado del proxy podía causar un panic en lugar de devolver un error cuando el endpoint de administración de Envoy no estaba disponible.
Corregido un problema donde los namespaces adicionales en
meshConfig.defaultServiceExportToymeshConfig.defaultVirtualServiceExportTono se respetaban cuando el valor predeterminado incluía el namespace actual como.. (Issue #60560)Corregido un error donde eliminar un listener de un
ListenerSetdejaba una entrada huérfana enstatus.listenersdel recurso indefinidamente. La entrada obsoleta hacía questatus.listenersfuera más largo quespec.listenersy, tras varios ciclos de añadir/eliminar listeners, bloqueaba elobservedGenerationdelListenerSetde forma que los cambios posteriores en la spec ya no se reflejaban en su estado.reportListenerSetStatusahora elimina las entradas de estado de listeners que ya no están presentes en la spec, igualando el comportamiento existente para los recursosGateway. (Issue #60578)Corregido que la validación de
DestinationRulerechazara incorrectamente valores de agresividad de calentamiento entre 0 y 1. (Issue #3395),(Issue #55153)Corregido un error donde istiod no detectaba los secrets actualizados de clústeres remotos (p.ej. durante la rotación de credenciales/tokens) hasta reiniciarse. El nuevo registro de clústeres podía quedarse bloqueado esperando sincronizarse, dejando el registro de servicios obsoleto para el clúster remoto afectado. (Issue #60612)
Corregido un problema introducido en Istio 1.30 donde los cambios solo en metadatos de recursos
VirtualService(p.ej. anotaciones de Helm, etiquetas de Argo CD okubectl.kubernetes.io/last-applied-configuration) disparaban pushes XDS innecesarios a todos los proxies. Esto podía causar un aumento significativo en el uso de CPU del control plane y la latencia de push en clústeres con muchos recursosVirtualServicegestionados por herramientas GitOps. La corrección restaura el comportamiento anterior a 1.30, donde solo los cambios en la spec o en etiquetas/anotaciones deistio.iodisparan un push. (Issue #60629)Corregidos los pushes duplicados y excesivos al usar recursos
WasmPlugindebido a las conversiones deTrafficExtension.Corregido un deadlock donde el pod del agente de nodo
istio-cnipodía fallar al iniciar (por ejemplo tras un reinicio del nodo) porque el plugin CNI solo omitía la creación del cliente kube para su propio pod de agente cuando el modo ambient estaba habilitado. La verificación preventiva ahora también se ejecuta en modo sidecar, por lo que el pod de agente ya no se bloquea en un kubeconfig que aún no ha escrito. (Issue #60668)Corregidos los reintentos HTTP predeterminados para rutas entrantes de waypoints. El ajuste
meshConfig.defaultHttpRetryPolicyahora se aplica a los servicios locales asociados a waypoints. (Issue #60682)Corregido un problema donde
EXIT_ON_ZERO_ACTIVE_CONNECTIONSnunca se activaba en los ambient ingress gateways y waypoints porque el bucle de vaciado del pilot-agent contaba conexiones en proceso en los listeners internos HBONE de Envoy (connect_originate,connect_terminate,main_internal, etc.), impidiendo que el recuento de conexiones activas llegara a cero y obligando al proxy a esperar hastaterminationGracePeriodSeconds. (Issue #60728)Corregido un problema donde la etiqueta
service.istio.io/canonical-namepodía terminar con un.o_no válido al truncarse a 63 caracteres en la plantilla de inyección.Corregido un problema donde un
HTTPRouteconbackendRefsvacío u omitido devolvía un código de estado HTTP 404 en lugar de 500. Esto coincide con el comportamiento impuesto por la prueba de conformidadHTTPRouteNoBackendRefsde Gateway API, introducida en v1.6.0.Corregido un problema donde la capacidad HBONE anunciada no se propagaba a los recursos
WorkloadEntryauto-registrados para workloads que no son de Kubernetes.Corregido un problema donde la condición
Accepteden unGatewayno se establecía enFalseal referenciar unparametersRefno válido o inexistente. Esto coincide con el comportamiento impuesto por la prueba de conformidadGatewayInvalidParametersRefde Gateway API, introducida en v1.6.0.Corregido el tráfico entre redes a través del gateway east-west que era bloqueado por un filtro RBAC de denegación total espurio cuando el servicio destino tenía recursos
AuthorizationPolicyde capa 7. (Issue #60806)Corregido un error donde el gateway de red de un clúster remoto podía desaparecer del enrutamiento entre redes tras la rotación de credenciales y no recuperarse hasta reiniciar istiod. El intercambio de registro en caliente ahora reconecta el nuevo registro a los controladores del controlador agregado para que sus futuros eventos de gateway y servicio se propaguen, y recarga los gateways una vez para detectar los descubiertos durante la sincronización previa al intercambio. (Issue #60920)
Corregido un problema en despliegues multiclúster donde la rotación del
istio-remote-secretde un clúster remoto podía eliminar permanentemente los fragmentos de endpoints para servicios con endpoints estables en ese clúster, haciéndolos inalcanzables entre clústeres hasta reiniciar istiod. (Issue #61043)Corregido un problema donde el balanceo de carga
consistentHashen unaDestinationRuleno funcionaba para servicios enrutados a través de un proxy waypoint en modo ambient cuando no había ningúnVirtualService. El clúster de Envoy recibía correctamentelb_policy: RING_HASHpero la ruta entrante no teníahash_policy, lo que hacía que Envoy volviera a la selección aleatoria de backend y rompía las sesiones sticky. Anteriormente se requería unVirtualServicede passthrough sin operación como solución. (Issue #61045)Corregida una condición de carrera en el inicio de istiod donde el probe de disponibilidad podía reportar listo antes de que el servidor dedicado de webhooks de inyección y validación (
--httpsAddr, por defecto:15017) estuviera aceptando conexiones, causando timeouts intermitentes defailed calling webhookal crear recursos inmediatamente después de que istiod estuviera listo. No afecta a los despliegues donde los webhooks comparten el servidor HTTP principal (con--httpsAddrvacío). (Issue #61049)Corregido un problema donde los ingress gateways evitaban los proxies waypoint para servicios multi-clúster cuando los workloads remotos estaban en una red diferente, lo que provocaba que las políticas de autorización no se aplicaran. (Issue #61092)
Corregido un problema donde los Deployments de proxy gateway podían fallar permanentemente al crearse durante el inicio de istiod. (Issue #61095)
Corregido un problema donde un pod seleccionado por un
workloadSelectordeServiceEntrypodía iniciar sin ese servicio en la configuración entrante de su sidecar. El tráfico al puerto no se manejaba con el protocolo declarado enServiceEntry, yPeerAuthenticationa nivel de puerto no se aplicaba. El pod no se recuperaba solo; solo reiniciando istiod se corregía. (Issue #61157)Corregido un problema donde
istio-cniconsideraba los podshostNetworkelegibles para la incorporación al modo ambient. (Issue #61168)Corregido un problema donde, debido a varios fallos, pilot ignoraba los recursos
ListenerSety las rutas asociadas a ellos al generar la configuración para agentgateway. Pilot ya no filtra los recursosListenerSetni sus rutas asociadas, permitiendo que agentgateway en Istio maneje correctamente los recursosListenerSet.Corregido el reporte de estado de
ListenerSetcuando unListenerSetno está permitido por el recursoGatewaypadre para agentgateway. Cuando unListenerSetno está permitido por elGatewaypadre, el estado de la condiciónAcceptedahora se reporta comoFalse, lo que antes no ocurría. Además, como la funcionalidadListenerSetya no es experimental desde Gateway API v1.5.0, ya no está protegida por el feature flagPILOT_ENABLE_ALPHA_GATEWAY_API.Corregido un problema donde un
Gatewayde agentgateway se conectaba a backends sidecar-inyectados (mesh) usando texto plano en lugar de mTLS de Istio. Anteriormente, el TCP crudo enrutado a un backend de la mesh (medianteTCPRoute, oTLSRouteen modo Terminate) podía bloquearse en protocolos server-first —donde el backend habla primero, como SMTP o MySQL— y los backends que imponían mTLSSTRICTeran inalcanzables.Corregida una fuga de memoria y goroutines en el modo ambient multi-clúster de Istiod donde las colecciones de localidad de nodo por clúster tenían el alcance de la vida útil del proceso en lugar de la del clúster, por lo que nunca se destruían al eliminar un clúster remoto. (Issue #60033)
Corregido un error en el modo ambient multi-clúster de Istiod donde las colecciones agregadas (local + remoto) podían reportarse como sincronizadas antes de que los clústeres remotos hubieran sido descubiertos y sincronizados. Como resultado, Istiod podía comenzar a servir solo con datos del clúster local, omitiendo temporalmente workloads, servicios y endpoints de clústeres remotos al inicio. Las colecciones agregadas ahora esperan a que el controlador multi-clúster y las colecciones de cada clúster remoto se sincronicen antes de marcarse como listas.
Corregido un problema donde un pod incorporado al modo ambient podía quedar fuera del ipset de sondas de salud del host tras un reinicio del nodo o del kubelet, haciendo que las sondas del kubelet fueran redirigidas a ztunnel y rechazadas hasta que el agente de nodo
istio-cnise reiniciara. Al inicio, el agente de nodo podía expulsar del ipset pods que seguían incorporados cuando su IP aún no era observable, y ahora reafirma la pertenencia al ipset de sondas para los pods incorporados durante la reconciliación.Corregida una fuga de descriptores de archivo en el agente de nodo
istio-cni: cuando el análisis del procfs encontraba más de un network namespace para el mismo pod, el descriptor de archivo netns del candidato descartado se abandonaba sin cerrarse, fijando el namespace en el kernel hasta la recolección de basura.Corregido un deadlock en el agente de nodo CNI de ambient donde un evento de eliminación de pod concurrente con una (re)conexión de ztunnel podía bloquear permanentemente el servidor ZDS. (Issue #1674)
Corregido un problema donde el modo mTLS del endpoint no se derivaba de la política de tráfico de nivel superior de
DestinationRulecuando un subset de destino no especificaba un modo TLS para el puerto. La política de tráfico del subset ahora vuelve correctamente al ajuste TLS del nivel deDestinationRule.Corregido el reporte de estado de referencias de certificados en recursos
Gatewaypara cumplir con la especificación de Gateway API v1.5.0. Cambia el estado delGatewaypara reportar condiciones de tipoResolvedRefs, y añade detalles adicionales a la condiciónAcceptedcuando falla por certificados no válidos o inexistentes.Corregida la condición
Accepteden un KubernetesGatewaypara reflejar la validez de sus listeners. Cuando uno o más listeners no son aceptados (por ejemplo, un protocolo de listener no compatible), elGatewayahora reporta el motivoListenersNotValid, y solo se establece enAccepted=Falsecuando ninguno de sus listeners es aceptado. Anteriormente elGatewaysiempre se reportaba comoAcceptedindependientemente de sus listeners.Corregido un problema donde los clientes xDS de gRPC sin proxy podían recibir respuestas
RouteConfigurationde RDS demasiado amplias de Istiod.Corregido un error donde se creaba incorrectamente un listener interno cuando el listener era de tipo HTTPS o TLS pero no tenía sección TLS definida. Una versión posterior de Gateway API evitará que esta combinación de entradas llegue a un controlador. (Issue #60562)
Corregida la generación de configuración para sidecars anteriores a 1.29.2.
Corregido un panic de istiod al procesar un
VirtualServicecon rutas TCP o TLS sin destinos, lo que podía ocurrir cuando el webhook de validación no está instalado (p.ej. despliegues sin revisión por defecto). (Issue #60110)Corregidas fugas de goroutines y memoria en istiod en modo ambient multi-clúster cuando se eliminan o actualizan clústeres remotos. Las colecciones internas construidas para cada clúster remoto no liberaban los controladores de eventos registrados en sus entradas al destruirse, causando que goroutines y memoria se acumularan con el tiempo al eliminar o reconfigurar clústeres. (Issue #60033)
Corregida una fuga de memoria en el framework del controlador
krtdonde cambiar la clave usada en un filtroFetch(por ejemplo, reetiquetando un pod para apuntar a un waypoint diferente) dejaba entradas de índice inverso obsoletas que nunca se limpiaban. Con el tiempo esto podía aumentar el uso de memoria y causar recomputaciones innecesarias.Corregida una fuga de goroutine en la elección de líder de istiod donde cada ciclo de elección (liderazgo perdido y readquirido) filtraba un goroutine hasta la salida del proceso. (Issue #60843)
Corregido el reporte de estado de ListenerSet para que un ListenerSet sin listeners válidos ahora reporte las condiciones
AcceptedyProgrammedcomoFalsecon motivoListenersNotValid. Anteriormente las condiciones a nivel de ListenerSet podían permanecer enTrueincluso cuando ninguno de sus listeners era utilizable.Corregido un deadlock en el
ClusterStoremulticlúster dondeAllReadypodía adquirir recursivamente elRWMutexdel almacén para lectura mediantetriggerRecomputeOnSync->GetByIDmientras un escritor esperaba, bloqueando lecturas y escrituras posteriores contra el almacén.Corregido que el modo ambient multi-clúster sirviera un snapshot obsoleto de un clúster remoto tras rotar sus credenciales. Las colecciones por clúster se almacenaban en caché solo por ID de clúster, por lo que una actualización de secret con un nuevo kubeconfig seguía reutilizando las colecciones construidas para la generación anterior, cuyo cliente e informers se apagan una vez que la nueva sincroniza. Ahora se almacenan en caché por generación y se reconstruyen con el nuevo cliente. (Issue #60033)
Corregida una fuga de memoria en Istiod donde las entradas
needResyncpara IPs de pods fallidos nunca se limpiaban.Corregido el enrutamiento de failover cuando la red está incluida. La red se considera preferida, pero no obligatoria, al determinar la prioridad de failover. Por ejemplo,
PreferSameZonetiene el siguiente orden de prioridad: Network+Region+Zone, Network+Region, Network, Region+Zone, Zone y sin coincidencia.Corregido que los recursos
ServicedeGatewaygenerados se rechazaran cuando dos nombres de listener se saneaban al mismo nombre de puerto deService(nombres que difieren solo en puntos frente a guiones, o solo más allá del límite de 63 caracteres), lo que bloqueaba todos los puertos no publicados delGateway. Los nombres de puerto que colisionan ahora se desambiguan con el número de puerto del listener.Corregido un error donde el agente de nodo
istio-cnipodía asociar un pod ambient con el network namespace de otro pod cuando un proceso de terceros estaba dentro de ese namespace durante un análisis, lo que podía causar que el tráfico se enrutara a través del proxy con la identidad incorrecta. El agente de nodo ahora verifica que un namespace tenga una de las IPs del pod antes de incorporarlo. (Issue #61211)Corregido un error donde una reconexión de ztunnel (como el reciclaje periódico de conexión por
keepaliveMaxServerConnectionAge) disparaba un push completo de workloads (WDS). Istiod ahora asigna a cada recurso WDS una versión basada en contenido y, cuando un cliente en reconexión reporta las versiones que ya tiene medianteinitial_resource_versions, solo reenvía los recursos que cambiaron mientras el cliente estaba desconectado. Las versiones anteriores de ztunnel que no reportan versiones siguen recibiendo el conjunto completo. (Issue #1966)Corregido
zoneAwareLbSetting.enabled: falsepara deshabilitar explícitamente el enrutamiento por zona intrínseco de Envoy emitiendorouting_enabled: 0%. Anteriormente,enabled: falseno tenía efecto: Istio no emitía ningúnZoneAwareLbConfig, lo que hacía que Envoy volviera a surouting_enabled: 100%predeterminado, activando el enrutamiento por zona automáticamente cuando había un clúster local de auto-descubrimiento. Esto hacía que el despliegue gradual fuera inseguro, ya que los pods en un estado mixto (algunos con auto-descubrimiento, otros sin él) distribuían el tráfico de forma desigual.Actualizada la versión de
nftablesusada por las imágenes distroless de Istio. La versión denftablesestaba anclada anteriormente en 1.1.1 para evitar un error que podía causar el fallo de versiones más antiguas denftablesen nodos de K8s cuando Istio usaba una versión más nueva empaquetada en sus imágenes en el mismo nodo.Las principales distribuciones de Linux han sido informadas del problema y han publicado correcciones. Como resultado, Istio elimina el anclaje de versión de
nftables. Se aconseja a los usuarios que actualicen el paquetenftablesen sus nodos a la versión más reciente disponible para asegurarse de que la versión corregida está instalada.Si sigues experimentando fallos de
nftablesen tus nodos, vuelve a una versión más antigua de Istio y contacta con el proveedor del SO de tu nodo para solicitar que la corrección sea portada a tu versión del SO. (Issue #58492)Optimizada la resolución de servicios de egress del sidecar: los listeners que importan solo hosts exactos (sin comodines) con namespace explícito ahora resuelven servicios mediante búsquedas directas en el índice de servicios en lugar de analizar todos los servicios visibles para el namespace, reduciendo el coste por listener de
O(services)aO(imported hosts)y eliminando la asignación de la lista completa. (Issue #60473)
Seguridad
Añadida la variable
PILOT_ENABLE_STRICT_GATEWAY_MERGINGpara evitar la fusión entre namespaces de recursosGatewayde Istio con recursosGatewayde Gateway API administrados. Cuando está habilitada (el valor predeterminado), los CRDsGatewayde Istio de diferentes namespaces no se fusionan con los proxiesGatewayde Gateway API administrados. Los recursosGatewayde Gateway API no administrados (despliegue manual) no se ven afectados. EstablecePILOT_ENABLE_STRICT_GATEWAY_MERGINGenfalsepara deshabilitar.Añadidos los campos
trustDomainsynotTrustDomainsalSourceenAuthorizationPolicy, que permiten coincidir o excluir solicitudes basándose en el dominio de confianza derivado del certificado de par.Añadido soporte para
fips-140-3como nuevo valor de la variable de entornoCOMPLIANCE_POLICY. Esto impone TLS 1.2 o 1.3 con suites de cifrado conformes con FIPS (ECDHE_[RSA|ECDSA]WITH_AES_GCM_SHA para TLS 1.2, AES-GCM para TLS 1.3) y restringe el acuerdo de clave a curvas P-256 o P-384. En el proxy Envoy, usa la política de cumplimiento nativaFIPS_202205. Los componentes Go (istiod, istio-agent) deben compilarse con Go 1.24+ usandoGOFIPS140=v1.0.0(o una versión validada posterior) para habilitar el módulo criptográfico nativo FIPS 140-3 de Go. La variable de entornoGODEBUG=fips140=onlyse inyecta automáticamente en tiempo de ejecución para sidecars, gateways y el control plane de istiod cuandoCOMPLIANCE_POLICYse configura mediante el valor Helmenv(p.ej.--set pilot.env.COMPLIANCE_POLICY=fips-140-3). Nota:GOEXPERIMENT=boringcrypto(usado para FIPS 140-2) es incompatible con esta política y no debe usarse. BoringCrypto solo apunta a FIPS 140-2 y entra en conflicto con el módulo FIPS 140-3 nativo de Go.Añadida una nueva variable de entorno
PILOT_ENABLE_REMOTE_CREDENTIALS_CONTROLLER(valor predeterminadotrue) que activa o desactiva los controladores de credenciales para clústeres remotos.Corregida la falta de recarga de certificados en el pilot-agent en la segunda y posteriores rotaciones de secrets de Kubernetes para certificados montados en archivos. (Issue #59912)
Corregido un problema donde
caCertificateRefs[].kind: Secreten el mTLS frontend de Gateway API (spec.tls.frontend.default.validation.caCertificateRefs) era rechazado por SDS en tiempo de ejecución a pesar de una configuraciónGatewayválida, incluyendo referencias del mismo namespace y referencias entre namespaces permitidas porReferenceGrant. (Issue #60277)Corregida una brecha de validación en
EnvoyFilterdonde una expresión de coincidenciaproxyVersionsin límite podía consumir excesiva memoria y CPU de istiod durante la compilación de expresiones regulares. La expresión de coincidencia está ahora limitada a 1024 caracteres.Crédito: Este problema fue reportado por Artem Cherezov (cherez0ff).
Corregidos los proveedores SDS externos configurados mediante
extensionProviderspara usar el hostname del servicio configurado como autoridad gRPC.Corregido el proveedor SDS externo para gateways para usar el nombre de credencial (tras eliminar el prefijo
sds://) como nombre de recurso SDS en lugar del nombre del proveedor. Esto permite que múltiples gateways que usan el mismo proveedor SDS soliciten certificados diferentes. Para TLSMUTUAL, el nombre del recurso del certificado CA se deriva correctamente como<credential-name>-cacert. Cuando no se configura ni un socket UDS ni un proveedor de extensión SDS, el gateway ahora vuelve a obtener certificados mediante ADS (Kubernetes Secrets) en lugar de fallar silenciosamente. (Issue #57080)Corregido un error donde istiod no recargaba su certificado raíz CA al rotar si el certificado se proporciona mediante archivos (por ejemplo, cuando se usa una CA externa como istio-csr).
Corregido el generador XDS
api(servicio de configuración MCP) para requerir una identidad de control plane verificada. Anteriormente, cualquier cliente que pudiera alcanzar el puerto XDS de istiod podía leer la configuración de Istio en todos los namespaces. Deshabilitar conENABLE_XDS_API_GENERATOR_AUTH=falsesi es necesario por compatibilidad.
Telemetría
Mejorado el endpoint
/stats/prometheusdel pilot-agent para recopilar de forma concurrente múltiples destinos declarados por la anotaciónprometheus.istio.io/scrape-targetsy fusionar la salida en el orden declarado. Los pods con un solo destino conservan la ruta de código de streaming existente byte a byte. Para pods con múltiples destinos, las respuestas OpenMetrics se reescriben para que la salida fusionada contenga exactamente un terminador# EOF. Las respuestas de métricas de cada destino están limitadas a 10 MiB para controlar la memoria del agente; las respuestas que superan este límite se descartan y se cuentan como fallos de scraping. Los fallos de scraping por destino no son bloqueantes e incrementanistio_agent_scrape_failures_total{type="application"}. (Issue #59567)Añadida una nueva variable de entorno
PILOT_AGENT_MERGE_ENVOY_STATSpara controlar si el pilot-agent fusiona las estadísticas de Envoy en su endpoint de estadísticas. Establécela enfalsepara deshabilitar la fusión de estadísticas de Envoy con las del agente.Añadida una nueva métrica,
istio_cni_plugin_requests_total, al agente de nodoistio-cni. Cuenta las solicitudes de eventos de adición del plugin CNI manejadas por el agente de nodo, etiquetadas porresponse_code. (Issue #60878)Añadida una nueva anotación de pod
prometheus.istio.io/scrape-targetsque permite declarar múltiples endpoints de métricas de aplicación por pod como una listaport:pathseparada por comas. Los destinos que colisionan con el puerto de estado del agente o cualquier puerto del data plane reservado por Istio se rechazan en el momento de la inyección con un error legible. (Issue #59567)Añadidas dos nuevas variables de entorno opcionales,
ENVOY_SECURE_METRICS_PORTyENVOY_SECURE_MERGED_METRICS_PORT, que exponen endpoints de scraping de Prometheus protegidos con mTLS en cada proxy sidecar de Envoy. Cuando se establecen, el sidecar añade listeners de bootstrap estáticos en los puertos configurados que requieren mTLS, permitiendo a Prometheus recopilar métricas de forma segura sin depender de los controles de acceso a nivel de red del pod. Consulta el RFC para más detalles. (Issue #50114)Corregido un problema donde la fusión de métricas del pilot-agent producía un resultado incorrecto cuando Envoy reportaba métricas usando el tipo de contenido protobuf. La lógica implementada en pilot-agent no puede manejar correctamente el tipo de contenido protobuf, por lo que este cambio restringe los tipos de contenido permitidos solo a
text/plainyapplication/openmetrics-text. (Issue #60322)Eliminado el feature flag
PILOT_SPAWN_UPSTREAM_SPAN_FOR_GATEWAY. El comportamiento de generar spans upstream para solicitudes de gateway ahora siempre está habilitado. Los usuarios que antes lo establecían enfalsedeben eliminar esa configuración, ya que ya no tendrá ningún efecto.
Extensibilidad
Corregido un error donde un
Serviceque referenciaba un waypoint en un namespace diferente no tenía el recursoTelemetryde todo el namespace incluido en su configuración. (Issue #60665)Corregido un error donde un
WasmPluginen un namespace de aplicación que apuntaba a unServicemediantetargetRefscausaba que un proxy waypoint entrara en bucle de fallos al inicio. La ruta LDS incluía correctamente el plugin para el waypoint, pero la ruta de búsqueda ECDS lo rechazaba como entre namespaces, dejando a Envoy esperando un recurso que nunca llegaría. (Issue #60530)
Instalación
Actualizado el addon Kiali a la versión v2.26.0.
Añadidas las variables de entorno
ZTUNNEL_RESOURCE_CPU_LIMITyZTUNNEL_RESOURCE_CPU_REQUESTalDaemonSetde ztunnel, que se rellenan con los valores configurados deresources.limits.cpu/resources.requests.cpucuando están establecidos. ztunnel las usa para derivar el número de hilos de trabajo con conciencia de CPU.Añadido el campo Helm
terminationMessagePolicypara el contenedor de istiod (pilot), que permite configurar cómo se rellenan los mensajes de terminación.Añadidos los campos
dnsPolicyydnsConfigal chart Helm del gateway para configuración DNS personalizada en entornos con requisitos DNS no estándar.Añadido un flag
-o/--outputaistioctl manifest generateque escribe el manifiesto generado en un archivo en lugar de stdout. Esto evita depender de la redirección del shell, lo que es conveniente para la automatización y necesario en entornos donde no hay shell disponible (por ejemplo, imágenesistioctlreforzadas que no lo incluyen).Añadido
values.global.readerServiceAccountcon camposnameynamespacepara vincular elClusterRoleistio-readera una cuenta de servicio personalizada. Cuando se establece, laistio-reader-service-accountpredeterminada no se crea, y elClusterRoleBindingreferencia la cuenta de servicio especificada. Establecerglobal.enableReaderRBACenfalsesuprime elClusterRoleistio-readery elClusterRoleBindingindependientemente de la configuración dereaderServiceAccount.Corregido un problema donde el contenedor
istio-initusaba la imagen incorrecta cuandoglobal.proxy_init.imageyglobal.proxy.imagese configuraban de forma diferente. (Issue #59066)Corregido que el volumen de socket de workload del waypoint y kube-gateway fuera incompatible con la configuración del driver CSI de SPIRE. (Issue #60108)
Corregida la representación del chart Helm cuando
global.istioNamespaceo el namespace del release es solo numérico (por ejemplo,1234). Los campos de namespace en los manifiestos representados ahora se citan para que los parsers YAML los traten como cadenas en lugar de números. (Issue #60239)
istioctl
Añadido soporte para que
istioctl remote-clustersmuestre revisiones.Añadida una advertencia de
istioctl analyze(IST0177) para cuando múltiples recursosServiceEntrydefinen el mismo host y puerto con protocolos conflictivos. (Issue #60447)Añadida una verificación de
istioctl analyze,IST0176, que marca los CRDs de Gateway API instalados en una versión inferior a la mínima requerida por la versión actual de Istio. Los recursos respaldados por dichos CRDs son filtrados silenciosamente por istiod, lo que antes hacía difícil descubrir fallos de TLS passthrough tras actualizar a Istio 1.30 con CRDs de Gateway API obsoletos.Corregido que
istioctlfallara al descubrir istiod cuando Istio está instalado en un namespace no predeterminado (distinto deistio-system) con una etiqueta de revisión. ElDefaultWatcherahora construye el nombre de webhook esperado basándose en el namespace de Istio pasado mediante el flag-i. (Issue #60232)Corregido que
istioctl tag removeno eliminara laValidatingWebhookConfigurationistiod-default-validatoral eliminar la etiqueta de revisión predeterminada. (Issue #60537)Corregido un problema donde los valores
--setdel manifiesto deistioctlque contenían=se analizaban como entrada malformada.