Представляємо etcd v3.7.0
Ця стаття є дзеркалом оригінального анонсу
Сьогодні SIG etcd оголошує про випуск etcd v3.7.0 — останнього мінорного релізу популярного розподіленого сховища для даних ключ-значення, що є основним компонентом Kubernetes. v3.7 включає довгоочікувану можливість RangeStream, кілька інших покращень продуктивності, видаляє останні залишки legacy v2store та завершує велику переробку protobuf.
Ви можете завантажити etcd v3.7.0 за посиланням:
Цей випуск також включає нові версії двох ключових залежностей etcd: bbolt v1.5.0 та raft v3.7.0.
Інструкції щодо встановлення etcd можна знайти в документації з встановлення. Повний список змін доступний у описі змін etcd v3.7.
Щира подяка всім учасникам, які зробили цей випуск можливим!
Основні можливості
Найважливіші зміни у v3.7.0 включають:
- RangeStream — потокова передача великих наборів результатів частинами замість буферизації всієї відповіді.
- Запити діапазонів лише за ключами, швидші та надійніші leases, а також кілька інших покращень продуктивності.
- etcd тепер завантажується повністю з v3store, що усуває давню залежність від застарілого сховища v2
- Завершено переробку protobuf, в результаті чого застарілі бібліотеки protobuf замінено на ті, що повністю підтримуються.
- etcd v3.7 постачається з bbolt v1.5.1 та raft v3.7.0.
Можливості
RangeStream
У etcd v3.6 та попередніх версіях важко працювати з запитами, які повертають великі результати. База даних буферизувала весь результат перед надсиланням, що призводило до непередбачуваної затримки та використання памʼяті як на сервері, так і на клієнті. RPC RangeStream дозволяє застосункам-отримувачам приймати результати частинами, зменшуючи затримку та роблячи використання памʼяті для буферизації більш передбачуваним.
Інструкції щодо використання RangeStream у gRPC викликах та у etcdctl можна знайти в документації etcd. Користувачам варто спробувати це для власних застосунків.
У скоординованих релізах можливість RangeStream стане доступною для користувачів майбутнього Kubernetes v1.37, з увімкненням функціональної можливості EtcdRangeStream. Це раннє та заплановане впровадження можливе завдяки злиттю розробки etcd та Kubernetes у 2023 році.
Покращення продуктивності
v3.7 пропонує кілька конкретних покращень продуктивності як для панелі управління Kubernetes, так і для інших випадків використання. Користувачі Kubernetes повинні побачити значне зниження загального використання CPU членами etcd порівняно з v3.6.
Оптимізація запитів діапазону лише за ключами
etcd v3.7.0 включає оптимізацію Range лише за ключами (#21791: keys-only Range optimization). Під час обробки запиту Range з параметром keys_only або команди etcdctl get --keys-only etcd зчитує дані виключно зі свого індексу в памʼяті. Він повертає ключі, що відповідають запиту, не завантажуючи всі серіалізовані значення з bbolt, як це робилося раніше. Єдиним винятком, коли завантаження з bbolt все ще потрібне, є випадки, коли запити Range з параметром keys_only необхідно сортувати за значенням (тобто коли для параметра SortTarget встановлено значення VALUE).
Це зменшує непотрібні зчитування з бекенду та використання памʼяті для робочих навантажень, яким потрібні лише імена ключів, роблячи великі запити лише за ключами більш ефективними.
Швидші, надійніші lease etcd
v3.7 покращує закінчення та поновлення lease:
- Запити LeaseRevoke тепер пріоритезуються для забезпечення своєчасного закінчення lease під час перевантаження (#20492: stability enhancement during overload conditions).
- Нова можливість FastLeaseKeepAlive дозволяє швидше поновлювати lease, пропускаючи очікування на застосований індекс (#20589: etcdserver: improve linearizable renew lease).
Швидші операції find()
etcd 3.7 покращує продуктивність одночасних спостережень за ключами, роблячи операції find() швидшими (#19768: adt: split interval tree by right endpoint on matched left endpoints).
Інші можливості
Переробка protobuf
v3.7 виконує міграцію та замінює кілька застарілих protobuf бібліотек на повністю підтримувані залежності. Це включає заміну github.com/golang/protobuf та github.com/gogo/protobuf на повністю підтримувану google.golang.org/protobuf (#14533: Protobuf: cleanup both golang/protobuf and gogo/protobuf), та міграцію grpc-logging до grpc-middleware v2 (#20420: Migrate grpc-logging to grpc-middleware v2).
Окрім покращення безпеки та підтримки, ця переробка, як було показано, зменшує використання CPU компонентами etcd.
Хоча ці зміни, як очікується, не матимуть прямого впливу на користувачів, які запускають etcd за допомогою офіційних бінарних файлів або контейнерних образів, вони можуть торкнутися користувачів, які використовують модулі etcd на Go, такі як клієнтський SDK або пакунки в api/ чи pkg/. Цим користувачам, можливо, доведеться оновити свій код або залежності через зміни в protobuf та повʼязані з ним API, введені в цьому випуску. Більш детальну інформацію можна знайти в записі про відстеження змін API.
Підтримка Unix сокетів
etcd тепер підтримує точки доступу через Unix-сокети (#19760: Add Support for Unix Socket endpoints), дозволяючи локальну комунікацію без TCP порту. Оскільки це обмежено кластерами з одним учасником, це переважно призначено для розробки, тестування та випадків використання на периферійних пристроях.
Bootstrap з v3store
Однією з головних змін у etcd v3.7 є те, що сервер тепер завантажується повністю з v3 store (#20187 Bootstrap etcdserver from v3store), усуваючи залежність від legacy v2 store під час запуску.
Ця віха є результатом довгострокових зусиль, що охоплюють кілька релізів від v3.4 до v3.7. Вона вирішує давню технічну заборгованість, значно спрощує процес завантаження та закладає основу для майбутніх покращень etcd.
Для підтримки зворотної сумісності etcd v3.7 продовжує генерувати знімки v2. Як результат, прапорець --snapshot-count також збережений у v3.7. Це остання залишкова залежність від legacy v2 store, і як генерація знімків v2, так і прапорець --snapshot-count будуть видалені у v3.8.
Тайм-аути etcdutl
Всі команди etcdutl тепер мають аргумент командного рядка для тайм-ауту (#20708: etcdutl: enable timeout functionality for all commands), тому офлайн-команди утиліти більше не блокуються назавжди, утримуючи блокування.
Встановлення токена автентифікації безпосередньо
Клієнт v3 тепер дозволяє користувачам встановлювати JWT безпосередньо, пропонуючи більше гнучкості в варіантах автентифікації (#16803: clientv3: allow setting JWT directly, #20747: clientv3: disable auth retry when token is set).
Отримання AuthStatus без автентифікації
Клієнти можуть перевіряти свій AuthStatus без попередньої спроби автентифікації, що дозволяє зменшити навантаження на застосунок (#20802: etcdserver: remove permission check on AuthStatus api).
Нові метрики спостережень
v3.7 додає необовʼязкові метрики send-loop спостережень (#21030: Instrument watchstream send loop) для кращої видимості шляху спостережень:
etcd_debugging_server_watch_send_loop_watch_stream_duration_secondsetcd_debugging_server_watch_send_loop_watch_stream_duration_per_event_secondsetcd_debugging_server_watch_send_loop_control_stream_duration_secondsetcd_debugging_server_watch_send_loop_progress_duration_seconds
Також є нова метрика etcd_server_request_duration_seconds (#21038: Add metric etcd_server_request_duration_seconds).
Очищення команд etcdctl
etcdctl команди були реорганізовані для ясності (#20162: etcdctl: organize etcdctl subcommand) та глобальні аргументи командного рядка тепер приховані для спрощення виводу довідки (#20493: etcdctl: hide global flags).
Оновлення
Цей випуск містить зміни, що можуть спричинити несумісність, зокрема повʼязані з вилученням застарілих компонентів версії v2. Користувачам слід ознайомитися з посібником з оновлення перед оновленням своїх вузлів. Як і з усіма мінорними випусками, слід виконувати послідовне оновлення, оновлюючи по одному учаснику за раз, та перевіряти стан кластера між етапами.
Видалені експериментальні прапорці
Всі застарілі експериментальні прапорці були видалені (#19959: Cleanup the deprecated experimental flags). Можливості etcd тепер проходять життєвий цикл функціональних можливостей у стилі Kubernetes (Alpha → Beta → GA), представленому у v3.6, замість старого префіксу --experimental. Якщо ваша конфігурація все ще залежить від аргументів командного рядка --experimental-*, перейдіть на відповідні функціональні можливості або стабільні аргументи командного рядка перед оновленням до etcd 3.7.
Пакунки legacy V2 API та очищення коду
Щоб усунути залежності від v2store, такі компоненти були видалені:
- v2 discovery пакунки видалені (#20109: Remove v2discovery),
- підтримка v2 request (#21263: Remove v2 Request and apply_v2.go)
- підтримка v2 client (#20117: Remove client/internal/v2).
Ці зміни можуть створити певні проблеми для користувачів, особливо тих, хто ще не оновився до v3.6.11 або пізнішої версії. Користувачі повинні повідомляти про будь-які перешкоди, з якими зіткнулися, або про випадки, які потребують кращої документації з оновлення.
Створення клієнта без блокування
etcd більше не використовує застарілий параметр налаштування grpc.WithBlock (#21942: Make the etcd client creation non-blocking). Для збереження попередньої блокуючої поведінки, коли це потрібно, дотримуйтесь порад у документації grpc-go про антипатерни.
Тільки multiarch контейнерні образи
Для користувачів, які залежать від офіційних контейнерних образів etcd, v3.7 буде розповсюджуватися лише як multiarch контейнери. Образи з теґами архітектури не будуть доступні, тому відкоригуйте розгортання відповідно.
Зміни API
Як і в кожному випуску etcd, є низка змін API. Вони розроблені для максимальної зворотної сумісності, але можуть вимагати коригувань від деяких користувачів. Повну інформацію див. на нашій сторінці документації API.
bbolt v1.5.1
etcd v3.7 залежить від і містить v1.5.1 рушія сховища bbolt. v1.5 включає кілька покращень функціональності та продуктивності, зокрема:
- Обмеження розміру файлів бази даних: користувачі можуть встановлювати обмеження розміру файлів, а bbolt забезпечуватиме їх дотримання. Коли база даних bolt перевищує ці обмеження, вона відмовлятиметься приймати записи доти, доки база даних не буде ущільнена або обмеження не буде змінено.
- Вимкнення статистики для продуктивності: користувачі можуть встановити
NoStatistics, щоб обмежити накладні витрати від блокувань, взятих засобом перегляду статистики бази даних. - Більш ефективна обробка хеш-таблиці: швидше обʼєднання відрізків з меншими накладними витратами.
raft v3.7.0
etcd 3.7 залежить від механізму консенсусу raft версії 3.7.0 і містить його. Версія 3.7 містить низку вдосконалень, зокрема:
- Оновлення процесу завантаження: v3.7 тепер дозволяє завантажуватися з частково ініціалізованих знімків, підтримуючи ініціалізацію etcd безпосередньо з v3store.
- Покращення потоку ReadIndex для запобігання застарілим читанням шляхом інʼєкції унікального ідентифікатора в контекст heartbeat для операцій лише читання.
raft v3.7.0 також включає ті самі оновлення бібліотек protobuf та рефакторингу, як і etcd.
Оновлення залежностей
Інші оновлення залежностей включають підвищення до golang.org/x/crypto v0.52.0 для вирішення CVE (#21903: [release-3.7] Bump golang.org/x/crypto to v0.52.0), оновлення OpenTelemetry contrib до v0.61.0 (#20017: Update otelgrpc to v0.61.0), та компіляцію з Go 1.26.4 (#21891: [release-3.7] Update Go to 1.26.4).
Учасники
etcd v3.7.0 є результатом роботи понад сотні учасників у спільноті. Дякуємо всім, хто писав код, рецензував PR, створював та сортував тікети, та допомагав тестувати альфа-, бета-версії та кандидатів у випуск.
Лідери
Лідерами SIG etcd для випуску v3.7 є ivanvc, serathius, ahrtr, fuweid, siyuanfoundation, та jberkus. Ivan очолює нашу команду випуску.
Інші учасники
ah8ad3, ajaysundark, aladesawe, amosehiguese, ArkaSaha30, ashikjm, AwesomePatrol, dims, Elbehery, gangli113, henrybear327, Jille, jmhbnz, joshuazh-x, kishen-v, lavishpal, liggitt, marcelfranca, miancheng7, mmorel-35, MrDXY, mrueg, purpleidea, qsyqian, redwrasse, ronaldngounou, skitt, spzala, tcchawla, tjungblu, vivekpatani, wenjiaswe
Нові учасники
Особлива подяка учасникам, які зробили свій перший внесок у etcd у цьому циклі — включаючи Jeffrey Ying, чия робота стала рушійною силою реалізації можливості RangeStream. Нові учасники можуть мати значний вплив на etcd; якщо ви хочете долучитися, див. посібник учасника.
1911860538, 4rivappa, aaronjzhang, abdurrehman107, ABin-Huang, adeptvin1, aditya7880900936, AHBICJ, akstron, alliasgher, aman4433, aojea, apullo777, AR21SM, arturmelanchyk, AshrafAhmed9, asttool, asutorufa, BBQing, beforetech, boqishan, caltechustc, carsontham, christophsj, chuanye-gao, cnuss, cuiweixie, dmvolod, Dogacel, dongjiang1989, EduardoVega, evertrain, eyupcanakman, gaganhr94, goingforstudying-ctrl, greenblade29, Himanshu-370, HossamSaberX, huajianxiaowanzi, hwdef, ishan-gupta2005, ishan16696, ivangsm, JasonLove-Coding, Jefftree, jihogh, jonathan-albrecht-ibm, joshjms, kairosci, kei01234kei, kjgorman, kovan, kstrifonoff, Kunalbehbud, letreturn, lorenz, m4l1c1ou5, madhav-murali, madvimer, majiayu000, marcus-hodgson-antithesis, mattsains, mcrute, mingl1, MohanadKh03, mstrYoda, NAM-MAN, neeraj542, nicknikolakakis, nihalmaddala, niuyueyang1996, notandruu, ntdkhiem, nwnt, olamilekan000, pigeio, pjsharath28, progmem, Qian-Cheng-nju, quocvibui, ravisastryk, robin-vidal, robinkb, rockswe, roman-khimov, rsafonseca, sahilpatel09, SalehBorhani, SebTardif, seshachalam-yv, shashwat010, shivamgcodes, shuan1026, silentred, sneaky-potato, socketpair, srri, subrajeet-maharana, sxllwx, tchap, tsujiri, tzfun, upamanyus, uzairhameed, varunu28, vihasmakwana, wendy-ha18, xiaoxiangirl, xigang, xUser5000, yagikota, yajianggroup, yedou37, Zanda256, zechariahkasina, zhijun42, zhoujiaweii
Надсилайте відгуки через:
Це дзеркало оригінальної статті.