Примітки до змін Istio 1.31.0
Примітки до випуску Istio 1.31.0.
Керування трафіком
Покращено ведення журналу у випадку, коли CRD Gateway API, встановлений у кластері, має версію нижчу за мінімальну, необхідну для цієї версії Istio. Тепер повідомлення реєструється на рівні
warnі містить пояснення, що ресурси цього типу не оброблятимуться доти, доки CRD не будуть оновлені. Раніше це повідомлення реєструвалося на рівніinfoі його легко було пропустити, що ускладнювало діагностику порушень пропускання TLS після оновлення до версії 1.30 із застарілими CRD.Покращено масштабованість istiod у режимі ambient шляхом обмеження XDS-розсилок від змін
Addressробочих навантажень/сервісів лише до відповідних waypoint, замість розсилки всім waypoint і проксі. Можна вимкнути за допомогоюAMBIENT_SCOPED_ADDRESS_PUSHES=false.Додано підтримку власного імені taint для контролера зняття taint з вузлів pilot через змінну середовища
PILOT_NODE_UNTAINT_CONTROLLERS_TAINT_NAME. Типове значення —cni.istio.io/not-ready. (Тікет #57844)Додано підтримку виключення конфігурації політик з Istio, коли анотацію
istio.io/ignore-policy-attachmentвстановлено вtrueна обʼєктіBackendTLSPolicyабоXBackendTrafficPolicy. Це дозволяє користувачам запобігати перетворенню конкретних політик у конфігурацію Istio, коли політика призначена для іншого контролера шлюзу, ніж Istio.Приклад використання:
apiVersion: gateway.networking.k8s.io/v1
kind: BackendTLSPolicy
metadata:
annotations:
istio.io/ignore-policy-attachment: "true"Додано підтримку виключення просторів імен і хостів з
hostsвихідного слухачаSidecarза допомогою префікса~у просторі імен. Записи без префікса імпортуються як раніше, а записи з префіксом~віднімаються від них:~ns1/*виключає всі хости вns1, а~/foo.comвиключаєfoo.comз кожного простору імен. Це дозволяє великим мережам імпортувати все, крім кількох просторів імен (наприклад,*/*плюс~ns1/*), не перелічуючи довгий список дозволених. (Тікет #60139)Додано перевірку ініціалізації, яка підтверджує, що вбудований бінарний файл
nftпідтримує JSON-вивід. Рідний бекенд nftables вимагає JSON для читання конфігурації під час видалення podʼа. На хостах, чий бінарний файлnftне підтримує JSON, ці виклики завершуються помилкоюError: JSON support not compiled-inпри кожному видаленні, і агент CNI повторює спроби нескінченно. Нова перевірка виявляє цю помилку під час запуску та повертається до бекендуiptables. (Тікет #60328)Додано поле
prefix_rewriteдоHTTPRedirect, що вмикає перезапис шляху з урахуванням префікса у правилах перенаправлення. Це дозволяє видаляти або замінювати зіставлений префікс шляху під час перенаправлення, наприклад, перенаправленняexample.com/foo/barнаfoo.example.com/bar. (Тікет #47500),(Тікет #47777),(Тікет #52521)Додано поле
budget_intervalдо APIRetryBudgetTrafficPolicyдля налаштування інтервалу, з яким запити враховуються під час обчислення бюджету повторних спроб. Типове значення, 0 мс, зберігає наявну поведінку врахування лише запитів у процесі. (Тікет #60389)Додано підтримку зважених канаркових waypoint у режимі ambient. Сервіс (або простір імен) тепер може посилатися на основний і канарковий waypoint через мітки
istio.io/use-waypoint-canaryіistio.io/use-waypoint-canary-namespace, при цьому анотаціяistio.io/use-waypoint-canary-weightспрямовує настроювану частку внутрішньомережевих зʼєднань сервісу (і, зistio.io/ingress-use-waypoint, вхідних запитів) до канаркового waypoint без жодних змін на стороні клієнта. (Тікет #60801)Додано
meshConfig.serviceEntryVisibility, що дозволяє адміністратору мережі контролювати видимість ресурсівServiceEntry. Ambient (ztunnel і waypoint) стандартно застосовує видимість; класичні sidecar додатково враховують її, коли встановленоapplyToSidecars. Функція неактивна, якщо не налаштована, тому наявні мережі типово не зазнають впливу. (Тікет #60870)Додано
GatewayClassistio-agentgateway-waypointдля розгортання agentgateway як waypoint.Додано режим політики вихідного трафіку
ALLOW_ANY_DYNAMIC_DNS. Коли встановлено вmeshConfig.outboundTrafficPolicy.mode, HTTP-запити відкритого тексту до невідомих призначень пересилаються через динамічний прямий проксі Envoy, який розвʼязує імена хостів із заголовкаHostпід час запиту. Не-HTTP трафік (TLS і сирий TCP) продовжує використовуватиPassthroughCluster. Обмежено лише проксі sidecar. Не підтримується в CRDSidecar. Необовʼязкову ініціацію вихідного TLS можна налаштувати черезmeshConfig.outboundTrafficPolicy.tls.Додано підтримку
connectionSettingsуProxyConfig, що дозволяє налаштовувати обмеження буфера слухача, HTTP-таймаути, параметри HTTP/2 і нормалізацію шляху/заголовків. Новий профільEDGEзастосовує рекомендовані типові значення Envoy edge-proxy до проксі шлюзів.Додано нову операцію виправлення
MERGE_AND_REPLACE_LISTдляEnvoyFilter. Вона поводиться якMERGE, за винятком того, що повторювані (спискові) поля, присутні у виправленні, повністю замінюють відповідний список у згенерованій конфігурації замість додавання до нього. Це застосовується до цілей виправленняCLUSTER,LISTENER,FILTER_CHAIN,ROUTE_CONFIGURATION,VIRTUAL_HOSTіHTTP_ROUTE. Списки, вкладені в конфігурації фільтрів типуAny(HTTP, мережеві та слухачеві фільтри, а також транспортні сокети), не зазнають впливу та продовжують дотримуватися семантикиMERGE.Додано реалізацію функції
AllowInsecureFallbackGateway API в логіці перевірки сертифіката клієнта. Ця функція дозволяє шлюзу запитувати сертифікат клієнта та намагатися перевірити його, але якщо клієнт не надає сертифікат або сертифікат недійсний, шлюз все одно дозволяє зʼєднання. Типово Istio заповнює HTTP-заголовокx-forwarded-client-cert, тому колиAllowInsecureFallbackувімкнено, бекенд може перевіряти сертифікат замість шлюзу. (Тікет #60018)Додано підтримку налаштування параметрів keepalive PING HTTP/2 на вихідних зʼєднаннях через
DestinationRule. (Тікет #55640)Додано
defaultTrafficPolicyдоMeshConfig— базові для всієї мережіconnectionPoolіoutlierDetection, які успадковують вихідні кластери.DestinationRule, який встановлює один із цих блоків, перевизначає базовий рівень для цього блоку; блок, якийDestinationRuleзалишає невстановленим, тепер успадковує базовий рівень мережі замість вбудованих типових значень Istio. Коли базовий рівень не налаштовано, поведінка не змінюється. БазовийconnectionPoolтакож застосовується до вхідних кластерів і кластера passthrough.Додано підтримку зонального балансування навантаження Envoy через нове поле
zoneAwareLbSettingнаDestinationRule.TrafficPolicy.LoadBalancerSettingsіMeshConfig. Коли увімкнено, Envoy автоматично маршрутизує трафік до точок доступу у тій самій зоні доступності, що й підлеглий проксі, переливаючись в інші зони лише тоді, коли локальної ємності недостатньо. Це відрізняється від наявногоlocalityLbSettingтим, що маршрутизація на рівні зон обробляється автоматично Envoy з використанням розподілу зон проксі, а не через статичні відсотки. Порядок відмовостійкості між регіонами можна налаштувати через полеfailover, а пріоритетні рівні на основі міток можна накладати зверху черезfailoverPriority. Зональне балансування навантаження вимагаєISTIO_META_ENABLE_SELF_DISCOVERY: "true"уmeshConfig.defaultConfig.proxyMetadata, щоб впровадитиlocal_clusterсамовиявлення в початкові завантаження sidecar. Підтримується в режимі sidecar лише і не підтримується в режимі ambient. (reference) (reference)Увімкнено типове надсилання несправних точок доступу, якщо не налаштовано
OutlierDetection.minHealthPercent. Це можна вимкнути, встановившиPILOT_AUTO_SEND_UNHEALTHY_ENDPOINTSуfalse.Виправлено обробку Gateway API для реалізації розвʼязання конфліктів
BackendTLSPolicy. (Тікет #57817)Виправлено помилку, через яку не відображалися вхідні кластери для проксі-серверів, що повторно підключалися до нового екземпляра Istiod (наприклад, під час послідовного перезапуску), коли под ще не був присутній у кеші kube informer. Мітки робочих навантажень тепер заповнюються до обчислення цілей сервісів, тому шлях резервних метаданих у
GetProxyServiceTargetsправильно зіставляє сервіси замість повернення порожнього списку. (Тікет #58125)Виправлено проблему, через яку, коли увімкнено
PILOT_ENABLE_QUIC_LISTENERS, згенеровані ресурсиServiceGateway API не слухали відповідний UDP-порт для кожного HTTPS-слухача. (Тікет #58247)Виправлено проблему, через яку HTTPS-слухачі, визначені через
ListenerSet, не доставляли TLS-сертифікати, коли батьківський Gateway використовував ручне розгортання. (Тікет #59535)Виправлено проблему, через яку фільтри
HTTPRouteіGRPCRouteз недійсними значеннями заголовків мовчки відкидалися з конфігурації Envoy замість повідомлення статусуInvalidFilter. (Тікет #59933)Виправлено короткочасну втрату трафіку під час зміни мітки
istio.io/revна KubernetesGateway(абоListenerSet). Панель управління, яка раніше володіла ресурсом, більше не відкидає ресурс і не надсилає порожню конфігурацію xDS до podʼів шлюзу, які все ще працюють на старій версії. Записи статусу для неволодіючих версій все ще придушуються, тому версії не перемикаються на статусах одна одної. (Тікет #59959)Виправлено багатомережевий ambient так, щоб він тепер маршрутизував до waypoint, коли вхідний шлюз в одній мережі викликає сервіс в іншій мережі, і лише якщо
Serviceналаштований зistio.io/ingress-use-waypoint.Виправлено проблему, через яку конфігурація слухача waypoint у кластерах IPv6 містила
IPMatcher.RangeMatcherз порожнім полемranges, коли headless-сервіс (spec.clusterIP: None) був присутній у сфері дії waypoint. Це виникало тому, що заповнювачconstants.UnspecifiedIP, закодований у IPv4, який використовується дляDefaultAddressheadless-сервісів, відфільтровується для суто IPv6 проксі функцієюFilterAddressesByIPFamily. Envoy 1.38 суворо перевіряє правилоrepeated.min_items=1прото наIPMatcher.RangeMatcher.rangesі відхиляє розсилку LDS. Конструктор слухача waypoint тепер пропускає записIPRangeMatcher, коли немає адрес для розміщення в ньому, що відповідає наявній поведінці навколишнього коду, який уже видаляє половину імені хоста зsvcHostnameMapдля того самого випадку. Кластери IPv4 не зазнають впливу поведінково — заповнювач-матчер, який раніше видавався, нічого не зіставляв. (Тікет #60310)Виправлено проблему, через яку балансування навантаження
consistentHashуDestinationRuleне надсилало трафік до нових точок доступу після масштабування через регресію Envoy (envoyproxy/envoy#45212), де кільце RING_HASH не перебудовувалося під час змін точок доступу у пакетних оновленнях. (Тікет #60312)Виправлено фатальну паніку
concurrent map writesв агентіistio-cni, коли два podʼи додавалися до ambient мережі на одному вузлі одночасно. (Тікет #60328)Виправлено
DestinationRuleі бекенд-політику Gateway API (BackendTLSPolicyабоXBackendTrafficPolicy), які націлюються на той самий хост, так що поляDestinationRuleтепер мають перевагу, а бекенд-політика лише заповнює поля, якіDestinationRuleзалишає невстановленими, незалежно від того, що було створено першим. (Тікет #60358)Виправлено помилку в режимі ambient, через яку один Service, що поєднує
publishNotReadyAddresses: trueз розподілом трафікуPreferSameZoneабоPreferSameNode, спричиняв те, що ztunnel отримувавhealthPolicy: AllowAllдля кожного іншого Service, що використовує той самий пресет розподілу трафіку, що призводило до маршрутизації трафіку до неготових точок доступу у масштабі кластера. (Тікет #60422)Виправлено проблему, через яку очищення проксі могло викликати паніку замість повернення помилки, коли адміністративна точка доступу Envoy була недоступна.
Виправлено проблему, через яку додаткові простори імен у
meshConfig.defaultServiceExportToіmeshConfig.defaultVirtualServiceExportToне враховувалися, коли типове значення включало поточний простір імен як.. (Тікет #60560)Виправлено помилку, через яку видалення слухача з
ListenerSetзалишало осиротілий запис уstatus.listenersресурсу назавжди. Застарілий запис робивstatus.listenersдовшим заspec.listenersі, після повторних циклів додавання/видалення слухачів, заклинювавobservedGenerationListenerSet, тому пізніші зміни специфікації більше не відображалися в його статусі.reportListenerSetStatusтепер обрізає записи статусу для слухачів, які більше не присутні в специфікації, що відповідає наявній поведінці для ресурсівGateway. (Тікет #60578)Виправлено перевірку
DestinationRule, яка помилково відхиляла значення агресивності прогріву між 0 і 1. (Тікет #3395),(Тікет #55153)Виправлено помилку, через яку istiod не підхоплював оновлені секрети віддаленого кластера (наприклад, під час ротації облікових даних/токенів), доки не перезапускався. Новий реєстр кластерів міг потрапити в глухий кут, очікуючи синхронізації, залишаючи реєстр сервісів застарілим для відповідного віддаленого кластера. (Тікет #60612)
Виправлено проблему, представлену в Istio 1.30, через яку зміни лише метаданих у ресурсах
VirtualService(наприклад, анотації Helm, мітки Argo CD абоkubectl.kubernetes.io/last-applied-configuration) спричиняли непотрібні розсилки XDS усім проксі. Це могло спричинити значне збільшення використання процесора панелі управління та затримки розсилки в кластерах з багатьма ресурсамиVirtualService, керованими інструментами GitOps. Виправлення відновлює поведінку до 1.30, коли лише зміни специфікації або зміни міток/анотаційistio.ioспричиняють розсилку. (Тікет #60629)Виправлено дубльовані та надмірні розсилки під час використання ресурсів
WasmPluginчерез перетворенняTrafficExtension.Виправлено глухий кут, через який pod агента вузла
istio-cniміг не запуститися (наприклад, після перезавантаження вузла), оскільки втулок CNI пропускав створення kube-клієнта лише для власного podʼа агента, коли було увімкнено режим ambient. Випереджувальна перевірка тепер виконується також у режимі sidecar, тому pod агента більше не блокується в kubeconfig, який він ще не записав. (Тікет #60668)Виправлено типові HTTP-повторні спроби для вхідних маршрутів waypoint. Параметр
meshConfig.defaultHttpRetryPolicyтепер застосовується до локальних сервісів, прикріплених до waypoint. (Тікет #60682)Виправлено проблему, через яку
EXIT_ON_ZERO_ACTIVE_CONNECTIONSніколи не спрацьовував на ambient вхідних шлюзах і waypoint, оскільки цикл виведення pilot-agent рахував внутрішньопроцесні зʼєднання на внутрішніх слухачах HBONE Envoy (connect_originate,connect_terminate,main_internalтощо), що перешкоджало досягненню нуля лічильником активних зʼєднань і змушувало проксі чекати доterminationGracePeriodSeconds. (Тікет #60728)Виправлено проблему, через яку мітка
service.istio.io/canonical-nameмогла закінчуватися недійсним символом.або_, коли обрізалася до 63 символів у шаблоні впровадження.Виправлено проблему, через яку
HTTPRouteз порожніми або пропущенимиbackendRefsповертав код статусу HTTP 404 замість 500. Це відповідає поведінці, яку забезпечує тест відповідності Gateway APIHTTPRouteNoBackendRefs, представлений у v1.6.0.Виправлено проблему, через яку оголошена можливість HBONE не поширювалася на автоматично зареєстровані ресурси
WorkloadEntryдля не-Kubernetes робочих навантажень.Виправлено проблему, через яку умова
AcceptedнаGatewayне встановлювалася вFalseпід час посилання на недійсний або неіснуючийparametersRef. Це відповідає поведінці, яку забезпечує тест відповідності Gateway APIGatewayInvalidParametersRef, представлений у v1.6.0.Виправлено блокування міжмережевого трафіку через шлюз схід-захід помилковим RBAC-фільтром deny-all, коли сервіс призначення має ресурси L7
AuthorizationPolicy. (Тікет #60806)Виправлено помилку, через яку мережевий шлюз віддаленого кластера міг зникнути з міжмережевої маршрутизації після ротації облікових даних і не відновлюватися, доки istiod не перезапускався. Заміна реєстру на місці тепер повторно підключає новий реєстр до обробників агрегованого контролера, щоб його майбутні події шлюзів і сервісів поширювалися, і перезавантажує шлюзи один раз, щоб підхопити ті, що були виявлені під час синхронізації перед заміною. (Тікет #60920)
Виправлено проблему в мультикластерних розгортаннях, через яку ротація
istio-remote-secretвіддаленого кластера могла назавжди стерти шарди точок доступу для сервісів зі стабільними точками доступу в цьому кластері, роблячи їх недосяжними між кластерами, доки istiod не перезапускався. (Тікет #61043)Виправлено проблему, через яку балансування навантаження
consistentHashуDestinationRuleне працювало для сервісів, маршрутизованих через проксі waypoint у режимі ambient, коли не булоVirtualService. Кластер Envoy правильно отримувавlb_policy: RING_HASH, але вхідному маршруту бракувалоhash_policy, що змушувало Envoy повертатися до випадкового вибору бекенду та ламало липкі сесії. Раніше як обхідний шлях вимагався no-op passthroughVirtualService. (Тікет #61045)Виправлено гонитву під час запуску istiod, через яку проба готовності могла повідомляти про готовність до того, як виділений сервер вебхуків впровадження та перевірки (
--httpsAddr, типово:15017) починав приймати зʼєднання, що спричиняло періодичні таймаутиfailed calling webhookпід час створення ресурсів одразу після того, як istiod ставав готовим. Це не впливає на розгортання, де вебхуки поділяють основний HTTP-сервер (порожній--httpsAddr). (Тікет #61049)Виправлено проблему, через яку вхідні шлюзи оминали проксі waypoint для мультикластерних сервісів, коли віддалені робочі навантаження були в іншій мережі, що призводило до незастосування політик авторизації. (Тікет #61092)
Виправлено проблему, через яку Deployment проксі шлюзу могли назавжди не створюватися під час запуску istiod. (Тікет #61095)
Виправлено проблему, через яку pod, вибраний
workloadSelectorServiceEntry, міг запускатися без цього сервісу у вхідній конфігурації свого sidecar. Трафік до порту не оброблявся як протокол, оголошений уServiceEntry, і портовийPeerAuthenticationне застосовувався. Pod не відновлювався сам; лише перезапуск istiod виправляв це. (Тікет #61157)Виправлено проблему, через яку
istio-cniвважав podʼиhostNetworkпридатними для залучення до ambient. (Тікет #61168)Виправлено проблему, через яку через низку проблем pilot ігнорував ресурси
ListenerSetі прикріплені до них маршрути під час генерації конфігурації для agentgateway. Pilot більше не відфільтровує ресурсиListenerSetта їхні прикріплені маршрути, що дозволяє agentgateway в Istio належним чином обробляти ресурсиListenerSet.Виправлено звітування статусу
ListenerSet, колиListenerSetне дозволений батьківським ресурсомGatewayдля agentgateway. КолиListenerSetне дозволений батьківськимGateway, статус стануAcceptedтепер звітується якFalse, чого раніше не було. Крім того, оскільки функціяListenerSetбільше не є експериментальною, починаючи з Gateway API v1.5.0, вона більше не захищена прапорцем функціїPILOT_ENABLE_ALPHA_GATEWAY_API.Виправлено проблему, через яку
Gatewayagentgateway, підключений до бекендів із впровадженим sidecar (mesh), використовував відкритий текст замість взаємного TLS Istio. Раніше сирий TCP, маршрутизований до mesh-бекенду (черезTCPRouteабоTLSRouteу режимі Terminate), міг зависати для протоколів, де сервер говорить першим, таких як SMTP або MySQL, а бекенди, що застосовують суворий взаємний TLSSTRICT, були недосяжні.Виправлено витік памʼяті та goroutine у режимі ambient мультикластерного Istiod, де колекції локальності вузлів для кожного кластера були обмежені часом життя процесу, а не часом життя кластера, тому вони ніколи не знищувалися, коли віддалений кластер видалявся. (Тікет #60033)
Виправлено помилку в режимі ambient мультикластерного Istiod, через яку агреговані (локальні + віддалені) колекції могли повідомляти про себе як синхронізовані до того, як віддалені кластери були виявлені та синхронізовані. У результаті Istiod міг почати обслуговування лише з даними локального кластера, тимчасово пропускаючи робочі навантаження, сервіси та точки доступу з віддалених кластерів під час запуску. Агреговані колекції тепер чекають, поки мультикластерний контролер і колекції кожного віддаленого кластера синхронізуються, перш ніж бути позначеними готовими.
Виправлено проблему, через яку pod, залучений до ambient, міг бути виключений з ipset проб справності хоста після перезавантаження вузла або kubelet, що спричиняло перенаправлення проб kubelet на ztunnel і відхилення, доки агент вузла
istio-cniне перезапускався. Під час запуску агент вузла міг виключати все ще залучені podʼи з ipset, коли їхня IP ще не була спостережуваною, і тепер він повторно підтверджує членство в ipset проб для залучених podʼів під час узгодження.Виправлено витік файлових дескрипторів в агенті вузла
istio-cni: коли сканування procfs знаходило більше одного мережевого простору імен для того самого podʼа, файловий дескриптор netns кандидата, що програв, відкидався без закриття, закріплюючи простір імен у ядрі до збирання сміття.Виправлено блокування в агенті вузла ambient CNI, через який подія видалення podʼа, що відбувалася одночасно з (пере)підключенням ztunnel, могла назавжди заблокувати сервер ZDS. (Тікет #1674)
Виправлено проблему, через яку режим mTLS точок доступу не виводився з політики трафіку верхнього рівня
DestinationRule, коли цільовий піднабір не вказував режим TLS для порту. Політика трафіку піднабору тепер правильно повертається до параметра TLS рівняDestinationRule.Виправлено звітування статусу для посилань на сертифікати в ресурсах
Gatewayдля відповідності специфікації Gateway API v1.5.0. Воно змінює статусGatewayна звітування умов типуResolvedRefs, а також додає додаткові деталі до умовиAccepted, коли вона завершується невдачею через недійсні або неіснуючі сертифікати.Виправлено стан
Acceptedв KubernetesGateway, щоб він відображав дійсність його слухачів. Коли один або кілька слухачів не прийняті (наприклад, непідтримуваний протокол слухача),Gatewayтепер повідомляє причинуListenersNotValidі встановлюється вAccepted=Falseлише тоді, коли жоден із його слухачів не прийнятий. РанішеGatewayзавжди звітувався якAcceptedнезалежно від його слухачів.Виправлено проблему, через яку proxyless gRPC xDS-клієнти могли отримувати надто широкі відповіді RDS
RouteConfigurationвід Istiod.Виправлено помилку, через яку внутрішній слухач помилково створювався, коли слухач був типу HTTPS або TLS, але не мав визначеного розділу TLS. Наступна версія Gateway API запобігатиме потраплянню цієї комбінації вхідних даних до контролера. (Тікет #60562)
Виправлено генерацію конфігурації для sidecar до 1.29.2.
Виправлено паніку istiod під час обробки
VirtualServiceз TCP- або TLS-маршрутами без призначень, що могло статися, коли валідуючий вебхук не встановлений (наприклад, у розгортаннях без типової версії). (Тікет #60110)Виправлено витоки goroutine і памʼяті в istiod у режимі ambient мультикластерного середовища, коли віддалені кластери видаляються або оновлюються. Внутрішні колекції, побудовані для кожного віддаленого кластера, не звільняли обробники подій, які вони зареєстрували на своїх входах, під час знищення, що спричиняло накопичення goroutine і памʼяті з часом, коли кластери видалялися або переналаштовувалися. (Тікет #60033)
Виправлено витік памʼяті у фреймворку контролера
krt, через який зміна ключа, використаного у фільтріFetch(наприклад, зміна мітки podʼа для вказівки на інший waypoint), залишала застарілі записи зворотного індексу, які ніколи не очищалися. З часом це могло збільшити використання памʼяті та спричинити непотрібні повторні обчислення.Виправлено витік goroutine у виборі лідера istiod, через який кожен цикл виборів (втрата та повторне отримання лідерства) призводив до витікання одного goroutine до завершення процесу. (Тікет #60843)
Виправлено звітування статусу ListenerSet так, щоб ListenerSet без жодного дійсного слухача тепер звітував стани
AcceptedіProgrammedякFalseз причиноюListenersNotValid. Раніше стани рівня ListenerSet могли залишатисяTrue, навіть коли жоден із його слухачів не був придатним до використання.Виправлено глухий кут у мультикластерному
ClusterStore, деAllReadyміг рекурсивно отримуватиRWMutexсховища для читання черезtriggerRecomputeOnSync->GetByID, поки записувач очікував, блокуючи подальші читання та записи до сховища.Виправлено обслуговування ambient мультикластерним середовищем застарілого знімка віддаленого кластера після ротації його облікових даних. Колекції для кожного кластера кешувалися лише за ідентифікатором кластера, тому оновлення секрету, що несе новий kubeconfig, продовжувало повторно використовувати колекції, побудовані для попереднього покоління, чиї клієнт та інформери завершуються, щойно новий синхронізується. Тепер вони кешуються за поколінням і перебудовуються на новому клієнті. (Тікет #60033)
Виправлено витік памʼяті в Istiod, через який записи
needResyncдля невдалих IP-адрес podʼів ніколи не очищалися.Виправлено маршрутизацію відмовостійкості, коли мережа включена. Мережа вважається бажаною, але не обовʼязковою, під час визначення пріоритету відмовостійкості. Наприклад,
PreferSameZoneмає наступний порядок пріоритету: Network+Region+Zone, Network+Region, Network, Region+Zone, Zone і без збігу.Виправлено відхилення згенерованих ресурсів
ServiceGateway, коли два імені слухачів нормалізуються до одного й того самого імені портуService(імена, що відрізняються лише крапками проти дефісів або лише за межею 63 символів), що блокувало кожен неопублікований порт наGateway. Конфліктні імена портів тепер розрізняються номером порту слухача.Виправлено помилку, через яку агент вузла
istio-cniміг зіставити ambient pod з мережевим простором імен іншого podʼа, коли сторонній процес перебував у цьому просторі імен під час сканування, що могло спричинити проксіювання трафіку з неправильною ідентичністю. Агент вузла тепер перевіряє, що простір імен містить одну з IP-адрес podʼа, перш ніж залучати pod. (Тікет #61211)Виправлено помилку, через яку перепідключення ztunnel (наприклад, періодичний переробіток зʼєднань від
keepaliveMaxServerConnectionAge) спричиняло повну розсилку робочих навантажень (WDS). Istiod тепер призначає кожному ресурсу WDS версію на основі вмісту і, коли клієнт, що перепідключається, повідомляє версії, які він уже має, черезinitial_resource_versions, повторно надсилає лише ресурси, які змінилися, поки клієнт був відключений. Старіші версії ztunnel, які не повідомляють версії, продовжують отримувати повний набір. (Тікет #1966)Виправлено
zoneAwareLbSetting.enabled: false, щоб явно вимикати вбудовану зональну маршрутизацію Envoy шляхом видачіrouting_enabled: 0%. Ранішеenabled: falseбув no-op: Istio не видававZoneAwareLbConfig, що змушувало Envoy повертатися до свого типовогоrouting_enabled: 100%, який автоматично вмикав зональну маршрутизацію, коли був присутній локальний кластер самовиявлення. Це робило поступове розгортання небезпечним, оскільки podʼи в змішаному стані (деякі з самовиявленням, деякі без) нерівномірно розподіляли трафік.Оновлено версію
nftables, яку використовують distroless-образи Istio. Версіяnftablesраніше була закріплена на 1.1.1, щоб уникнути помилки, яка могла спричинити збій старіших версійnftablesна вузлах K8s після того, як Istio використовував новішу версію, упаковану в його образах, на тому самому вузлі.Основні дистрибутиви Linux були поінформовані про проблему та випустили виправлення. У результаті Istio видаляє закріплення версії
nftables. Користувачам рекомендується оновити пакунокnftablesна своїх вузлах до останньої доступної версії, щоб гарантувати встановлення виправленої версії.Якщо ви продовжуєте стикатися зі збоями
nftablesна своїх вузлах, відкотіться до старішої версії Istio та зверніться до постачальника ОС вашого вузла з проханням перенести виправлення у вашу версію ОС. (Тікет #58492)Оптимізовано розвʼязання вихідних сервісів sidecar: слухачі, які імпортують лише точні (не wildcard), явно визначені в просторі імен хости, тепер визначають сервіси через прямі пошуки в індексі сервісів замість сканування кожного сервісу, видимого для простору імен, зменшуючи вартість для кожного слухача з
O(services)доO(imported hosts)і усуваючи виділення повного списку. (Тікет #60473)
Безпека
Додано
PILOT_ENABLE_STRICT_GATEWAY_MERGINGдля запобігання міжпросторовому злиттю ресурсівGatewayIstio з керованими ресурсамиGatewayGateway API. Коли увімкнено (типово), CRDGatewayIstio з різних просторів імен не зливаються з керованими проксіGatewayGateway API. Некеровані (ручне розгортання) ресурсиGatewayGateway API не зазнають впливу. ВстановітьPILOT_ENABLE_STRICT_GATEWAY_MERGINGуfalse, щоб вимкнути.Додано поля
trustDomainsіnotTrustDomainsдоSourceвAuthorizationPolicy, що дозволяє користувачам зіставляти або виключати запити на основі домену довіри, отриманого з сертифіката однорангового вузла.Додано підтримку
fips-140-3як нового значення для змінної середовищаCOMPLIANCE_POLICY. Це застосовує TLS 1.2 або 1.3 з наборами шифрів, сумісними з FIPS (ECDHE_[RSA|ECDSA]WITH_AES_GCM_SHA для TLS 1.2, AES-GCM для TLS 1.3) і обмежує узгодження ключів кривими P-256 або P-384. На стороні проксі Envoy це використовує рідну політику відповідностіFIPS_202205. Компоненти Go (istiod, istio-agent) мають бути зібрані з Go 1.24+ з використаннямGOFIPS140=v1.0.0(або пізнішої перевіреної версії), щоб увімкнути рідний криптографічний модуль Go FIPS 140-3. Змінна середовищаGODEBUG=fips140=onlyавтоматично впроваджується під час виконання для sidecar, шлюзів і панелі управління istiod, колиCOMPLIANCE_POLICYналаштовано через значення Helmenv(наприклад,--set pilot.env.COMPLIANCE_POLICY=fips-140-3). Примітка:GOEXPERIMENT=boringcrypto(використовується для FIPS 140-2) несумісний з цією політикою і не повинен використовуватися. BoringCrypto націлений лише на FIPS 140-2 і конфліктує з рідним модулем Go FIPS 140-3.Додано нову змінну середовища
PILOT_ENABLE_REMOTE_CREDENTIALS_CONTROLLER(типовоtrue), яка перемикає контролери облікових даних для віддалених кластерів.Виправлено відсутність перезавантажень сертифікатів у pilot-agent під час другої та наступних ротацій секретів Kubernetes для сертифікатів, змонтованих із файлів. (Тікет #59912)
Виправлено проблему, через яку
caCertificateRefs[].kind: Secretу фронтенд mTLS Gateway API (spec.tls.frontend.default.validation.caCertificateRefs) відхилявся SDS-ом під час виконання, попри дійсну конфігураціюGateway, включно з посиланнями в тому самому просторі імен і міжпросторовими посиланнями, дозволенимиReferenceGrant. (Тікет #60277)Виправлено прогалину у валідації
EnvoyFilter, через яку необмежений вираз зіставленняproxyVersionміг спричиняти надмірне використання памʼяті та процесора istiod під час компіляції регулярних виразів. Вираз зіставлення тепер обмежений 1024 символами.Подяка: Про цю проблему повідомив Artem Cherezov (cherez0ff).
Виправлено зовнішніх постачальників SDS, налаштованих через
extensionProviders, щоб використовувати налаштоване імʼя хоста сервісу як авторитет gRPC.Виправлено зовнішнього постачальника SDS для шлюзів, щоб використовувати імʼя облікових даних (після видалення префікса
sds://) як імʼя ресурсу SDS замість імені постачальника. Це дозволяє кільком шлюзам, що використовують того самого постачальника SDS, запитувати різні сертифікати. Для TLSMUTUALімʼя ресурсу сертифіката CA правильно виводиться як<credential-name>-cacert. Коли не налаштовано жодного UDS-сокета, ні розширеного постачальника SDS, шлюз тепер повертається до отримання сертифікатів через ADS (секрети Kubernetes) замість мовчазної невдачі. (Тікет #57080)Виправлено помилку, через яку istiod не перезавантажував свій кореневий сертифікат CA під час його ротації, якщо сертифікат надається через файли (наприклад, під час використання зовнішнього CA, такого як istio-csr).
Виправлено генератор
apiXDS (обслуговування конфігурації MCP), щоб вимагати перевірену ідентичність панелі управління. Раніше будь-який клієнт, який міг досягти порту XDS istiod, міг читати конфігурацію Istio в усіх просторах імен. Вимкніть за допомогоюENABLE_XDS_API_GENERATOR_AUTH=false, якщо це потрібно для сумісності.
Телеметрія
Покращено точку доступу
/stats/prometheuspilot-agent для одночасного збору кількох цілей, оголошених анотацієюprometheus.istio.io/scrape-targets, і обʼєднання виводу в оголошеному порядку. Podʼи з однією ціллю зберігають наявний потоковий шлях коду байт-у-байт. Для podʼів з кількома цілями відповіді OpenMetrics переписуються так, щоб обʼєднаний вивід містив рівно один термінатор# EOF. Відповіді метрик окремих цілей обмежені 10 МіБ, щоб обмежити памʼять агента; відповіді, що перевищують цю межу, відкидаються та зараховуються як невдалі збори. Невдачі збору для окремих цілей не блокують і збільшуютьistio_agent_scrape_failures_total{type="application"}. (Тікет #59567)Додано нову змінну середовища
PILOT_AGENT_MERGE_ENVOY_STATSдля керування тим, чи обʼєднує pilot-agent статистику Envoy у свою точку доступу статистики. Встановітьfalse, щоб вимкнути обʼєднання статистики Envoy зі статистикою агента.Додано нову метрику
istio_cni_plugin_requests_totalдо агента вузлаistio-cni. Вона підраховує запити додавання подій втулка CNI, оброблені агентом вузла, позначеніresponse_code. (Тікет #60878)Додано нову анотацію podʼа
prometheus.istio.io/scrape-targets, яка дозволяє користувачам оголошувати кілька точок доступу метрик застосунку на pod як список, розділений комами, у форматіport:path. Цілі, що конфліктують із портом статусу агента або будь-яким зарезервованим Istio портом панелі даних, відхиляються під час впровадження зі зрозумілою людині помилкою. (Тікет #59567)Додано дві нові змінні середовища, що вмикаються за бажанням,
ENVOY_SECURE_METRICS_PORTіENVOY_SECURE_MERGED_METRICS_PORT, які відкривають захищені mTLS точки доступу збору Prometheus на кожному проксі sidecar Envoy. Коли встановлені, sidecar додає статичні слухачі початкового завантаження на налаштованих портах, які вимагають взаємного TLS, дозволяючи Prometheus безпечно збирати метрики без покладання на контролі доступу на рівні мережі podʼа. Деталі дивіться в RFC. (Тікет #50114)Виправлено проблему, через яку обʼєднання метрик pilot-agent давало неправильний результат, коли Envoy повідомляв метрики з використанням типу вмісту protobuf. Логіка, реалізована в pilot-agent, не може коректно обробляти тип вмісту protobuf, тому ця зміна обмежує дозволені типи вмісту лише
text/plainіapplication/openmetrics-text. (Тікет #60322)Видалено прапорець функції
PILOT_SPAWN_UPSTREAM_SPAN_FOR_GATEWAY. Поведінка створення вихідних span для запитів шлюзу тепер завжди увімкнена. Користувачам, які раніше встановлювали це значення вfalse, слід видалити цю конфігурацію, оскільки вона більше не матиме жодного ефекту.
Розширюваність
Виправлено помилку, через яку
Service, що посилається на waypoint в іншому просторі імен, не мав ресурсуTelemetryдля всього простору імен, включеного до його конфігурації. (Тікет #60665)Виправлено помилку, через яку
WasmPluginу просторі імен застосунку, що націлюється наServiceчерезtargetRefs, спричиняв циклічний перезапуск проксі waypoint під час запуску. Шлях LDS правильно включав втулок для waypoint, але шлях пошуку ECDS відхиляв його як міжпросторовий, залишаючи Envoy в очікуванні ресурсу, який ніколи не надійде. (Тікет #60530)
Встановлення
Оновлено надбудову Kiali до версії v2.26.0.
Додано змінні середовища
ZTUNNEL_RESOURCE_CPU_LIMITіZTUNNEL_RESOURCE_CPU_REQUESTдоDaemonSetztunnel, заповнені з налаштованихresources.limits.cpu/resources.requests.cpu, коли вони встановлені. ztunnel використовує їх для виведення кількості робочих потоків з урахуванням процесора.Додано поле Helm
terminationMessagePolicyдля контейнера istiod (pilot), що дозволяє налаштовувати спосіб заповнення повідомлень про завершення.Додано поля
dnsPolicyіdnsConfigдо чарту Helm шлюзу для користувацької конфігурації DNS у середовищах з нестандартними вимогами до DNS.Додано прапорець
-o/--outputдоistioctl manifest generate, який записує згенерований маніфест у файл замість stdout. Це дозволяє уникнути покладання на перенаправлення оболонки, що зручно для автоматизації та обовʼязково в середовищах, де оболонка недоступна (наприклад, посилені образиistioctl, які постачаються без неї).Додано
values.global.readerServiceAccountз полямиnameіnamespaceдля привʼязкиClusterRoleistio-readerдо користувацького облікового запису служби. Коли встановлено, типовийistio-reader-service-accountне створюється, аClusterRoleBindingпосилається на вказаний обліковий запис служби. Встановленняglobal.enableReaderRBACуfalseпридушуєClusterRoleіClusterRoleBindingistio-readerнезалежно від налаштуваньreaderServiceAccount.Виправлено проблему, через яку контейнер
istio-initвикористовував неправильний образ, колиglobal.proxy_init.imageіglobal.proxy.imageбули налаштовані по-різному. (Тікет #59066)Виправлено несумісність тому робочого сокета waypoint і kube-gateway з конфігурацією драйвера SPIRE CSI. (Тікет #60108)
Виправлено рендеринг чарту Helm, коли
global.istioNamespaceабо простір імен випуску складається лише з цифр (наприклад,1234). Поля просторів імен у відрендерених маніфестах тепер у лапках, щоб парсери YAML трактували їх як рядки, а не числа. (Тікет #60239)
istioctl
Додано підтримку відображення версій у
istioctl remote-clusters.Додано попередження
istioctl analyze(IST0177) для випадків, коли кілька ресурсівServiceEntryвизначають той самий хост і порт із конфліктуючими протоколами. (Тікет #60447)Додано перевірку
istioctl analyzeIST0176, яка позначає CRD Gateway API, встановлені у версії, нижчій за мінімально необхідну для поточної версії Istio. Ресурси, що підтримуються такими CRD, мовчки відфільтровуються istiod, що раніше робило поломку TLS passthrough після оновлення до Istio 1.30 з застарілими CRD Gateway API важкою для виявлення.Виправлено невдачу
istioctlу виявленні istiod, коли Istio встановлено в просторі імен, відмінному від типового (неistio-system), з тегом версії.DefaultWatcherтепер будує очікуване імʼя вебхука на основі простору імен Istio, переданого через прапорець-i. (Тікет #60232)Виправлено: команда
istioctl tag removeне видаляла конфігураціюValidatingWebhookConfigurationдляistiod-default-validatorпід час видалення тегу стандартної редакції. (Тікет #60537)Виправлено проблему, через яку значення
--setманіфестуistioctl, що містять=, аналізувалися як некоректний ввід.