Інструментарый etcd-operator, які дапамагае разгортваць і суправаджаць кластары etcd у Kubernetes, перайшоў пад кіраванне праекта Cozystack. Разам з перадачай праекта апублікавана новая рэалізацыя etcd-operator, напісаная з нуля і якая выкарыстоўвае API etcd-operator.cozystack.io/v1alpha2 замест ранейшага etcd.aenix.io/v1alpha1. Новую рэалізацыю напісаў Цімафей Ларкін, адзін з мэйнтэйнераў ранейшай кодавай базы. Стары варыянт захаваны ў галінцы v1alpha1. Код напісаны на Go і распаўсюджваецца пад ліцэнзіяй Apache 2.0. Cozystack з'яўляецца Sandbox-праектам некамерцыйнай арганізацыі CNCF.
Галоўная змена ў новым etcd-operator – адмова ад StatefulSet для кіравання вузламі. Цяпер аператар наўпрост працуе са штатным Membership API etcd (MemberAdd, MemberPromote і MemberRemove) і сам дадае ўдзельнікаў, павялічвае learner да галасуе вузла і выводзіць вузлы з кворуму, што дае аператару поўны кантроль над складам кластара.
Паралельна распрацоўшчыкі праекта etcd развіваюць з нуля собственны1 афіцыйны etcd-operator. Па функцыянальнасці афіцыйны аператар пакуль саступае etcd-operator ад праекту Cozystack. Бо ранейшая рэалізацыя etcd-operator ужо працуе ў працоўных асяродках і выкарыстоўваецца ў Cozystack і Kamaji, яе развіццё было працягнута асобна ад афіцыйна рэалізацыі ад праекту etcd.
Развіваецца праектам Cozystack аператар кіруе кластарамі etcd праз два рэсурсы. EtcdCluster апісвае жаданае стан: лік рэплік, версію etcd, параметры сховішчы, TLS, аўтэнтыфікацыю і налады etcd. EtcdMember ствараецца для кожнага вузла кластара і валодае яго Pod і PVC. У адрозненне ад тыпавых рашэнняў аператар не выкарыстоўвае StatefulSet і абслугоўвае незалежна Pod і PVC кожнага вузла. Склад кластара змяняецца праз API Membership etcd: аператар дадае новыя вузлы як learner (MemberAdd), затым павялічвае іх да галасуючых удзельнікаў (MemberPromote). Выдаленне праходзіць праз MemberRemove, з карэктнай высновай з кворуму. Пры паўзе кластара вузлы захоўваюць сваю ідэнтычнасць.
Асноўныя магчымасці:
- разгортванне кластара і маштабаванне ў абодва бакі, па адным вузле за раз: новыя вузлы стартуюць у рэжыме learner, выдаленне карэктна выводзіць іх з кворуму;
- спыненне кластара без страты дадзеных (spec.replicas: 0) і аднаўленне працы з тымі ж ідэнтыфікатарамі кластара і вузлоў;
- захоўванне дадзеных у PVC па змаўчанні ці ў tmpfs, калі дадзеныя можна аднавіць нанова; пры страце Pod аператар аўтаматычна перастварае вузлы з сховішчам у памяці;
- паасобная настройка TLS для кліенцкіх і міжвузлавых злучэнняў: можна падлучыць свае Secret або даручыць аператару выпуск і падаўжэнне сертыфікатаў праз cert-manager;
- аўтэнтыфікацыя з адзіным карыстачом root; яго ўліковыя дадзеныя задаюцца праз Secret;
- стварэнне снапшотаў у S3 або PVC праз рэсурс EtcdSnapshot і аднаўленне кластара з снапшота пры першым разгортванні;
- аўтаматычны PodDisruptionBudget, які не дае аперацыям drain парушыць кворум;
- валідацыя спецыфікацый сродкамі apiserver праз CEL-выразы ў CRD, без webhook і залежнасці ад cert-manager;
- падрэсурс /scale для kubectl scale і VerticalPodAutoscaler, порт метрык 2381, пракід affinity і topologySpreadConstraints;
- убудова kubectl-etcd для паўсядзённых эксплуатацыйных задач (day-2 operations) пасля разгортвання кластара.
У параўнанні са старой рэалізацыяй (v1alpha1) змянілася наступнае:
- API-група змянілася з etcd.aenix.io на etcd-operator.cozystack.io;
- замест StatefulSet аператар выкарыстоўвае асобны рэсурс EtcdMember для кожнага вузла;
- адвольны слоўнік spec.options заменены тыпізаваным наборам параметраў: quota-backend-bytes, рэжым і інтэрвал аўтакампактыфікацыі, snapshot-count; свабодная map дазваляла перадаваць сцягі, якія канфліктавалі з логікай аператара;
- рэсурс EtcdBackup перайменаваны ў EtcdSnapshot, семантыка захавана;
- валідацыя перанесена з webhook на CEL-правілы ў CRD;
- сэрвіс кластара пераведзены ў рэжым headless, каб у вузлоў былі стабільныя DNS-імёны.
Міграцыя праходзіць на месцы з дапамогай etcd-migrate. Інструмент адаптуе які працуе кластар старога аператара без пераносу дадзеных, перазапуску Pod і страты кворуму. Ён мяняе толькі ўладальнікаў аб'ектаў, пазнакі і анатацыі. Пасля гэтага новы аператар бярэ кіраванне на сябе. Кліенты, якія звяртаюцца да кластара па DNS-імя, працягваюць працаваць без змен.
Рэалізацыя etcd-operator ад Cozystack закрывае большасць пунктаў плана развіцця афіцыйнага etcd-аператара праекту etcd. Статус па пунктах плана:
Акрамя таго, v1alpha2 дае магчымасці, якіх няма ў плане развіцця афіцыйнага аператара:
- спыненне кластара да нуля рэплік, паўза і аднаўленне з захаваннем ідэнтычнасці кластара і вузлоў;
- сховішча ў памяці (tmpfs) з аўтаматычнай заменай вузлоў сіламі аператара;
- валідацыя на баку apiserver праз CEL, без webhook і залежнасці ад сертыфікатаў;
- аўтаматычны PodDisruptionBudget для галасуючых вузлоў;
- падрэсурс /scale з запоўненым status.selector, каб наўпрост працавалі kubectl scale і VerticalPodAutoscaler.targetRef;
- пракідванне параметраў планавання affinity і topologySpreadConstraints, а таксама аб'яднанне additionalMetadata ва ўсіх аб'ектах, якія стварае аператар;
- інструмент міграцыі з ранейшага аператара без спынення кластара;
- убудова kubectl-etcd для эксплуатацыйных задач.
Крыніца: opennet.ru
