Verktygslådan etcd-operator, som hjälper till att driftsätta och underhålla etcd-kluster i Kubernetes, har överförts till Cozystack-projektet. Tillsammans med överföringen publicerades en ny implementering av etcd-operator, skriven från grunden och med API:et på etcd-operator.cozystack.io/v1alpha2 istället för det tidigare etcd.aenix.io/v1alpha1. Den nya implementeringen skrevs av Timofey Larkin, en av utvecklarna av den tidigare kodbasen. Den gamla versionen bevaras i v1alpha1-grenen. Koden är skriven i Go och distribueras under Apache 2.0-licensen. Cozystack är ett sandlådeprojekt från den ideella organisationen CNCF.
Den största förändringen i den nya etcd-operatorn är borttagningen av StatefulSet för nodhantering. Nu får operatorn direkt åtkomst till etcds inbyggda Membership API (MemberAdd, MemberPromote och MemberRemove) och lägger automatiskt till medlemmar, befordrar elever till röstande noder och tar bort noder från kvorum, vilket ger operatorn fullständig kontroll över klustermedlemskap.
Parallellt utvecklar etcd-projektets utvecklare sin egen officiella etcd-operator från grunden. Funktionsmässigt är den officiella operatorn för närvarande sämre än Cozystack-projektets etcd-operator. Eftersom den tidigare implementeringen av etcd-operatorn redan fungerar i produktionsmiljöer och används i Cozystack och Kamaji, fortsatte dess utveckling separat från den officiella implementeringen av etcd-projektet.
Cozystack-projektets operatör hanterar etcd-kluster genom två resurser. EtcdCluster beskriver önskat tillstånd: antal repliker, etcd-version, lagringsparametrar, TLS, autentisering och etcd-inställningar. En etcdMember skapas för varje klusternod och äger dess Pod och PVC. Till skillnad från typiska lösningar använder operatören inte en StatefulSet utan hanterar oberoende varje nods Pod och PVC. Klustermedlemskap ändras via etcd Membership API: operatören lägger till nya noder som inlärare (MemberAdd) och befordrar dem sedan till röstande medlemmar (MemberPromote). Borttagning utförs via MemberRemove, med korrekt borttagning från kvorum. När klustret pausas behåller noderna sin identitet.
Viktiga funktioner:
- Klusterdistribution och skalning i båda riktningarna, en nod i taget: nya noder startar i inlärningsläge och om de tas bort korrekt tas de bort från kvorumet;
- stoppa klustret utan dataförlust (spec.replicas: 0) och återuppta driften med samma kluster- och nod-ID:n;
- Data lagras som standard i PVC eller i tmpfs om informationen kan återställas; om en Pod förloras återskapar operatören automatiskt noder med minneslagring;
- Separat TLS-konfiguration för klient- och internnodanslutningar: du kan ansluta dina egna hemligheter eller instruera operatören att utfärda och förnya certifikat via cert-manager;
- autentisering med en enda root-användare; hans inloggningsuppgifter ställs in via Secret;
- skapa snapshots i S3 eller PVC via EtcdSnapshot-resursen och återställa klustret från en snapshot under den första distributionen;
- automatisk PodDisruptionBudget, vilket förhindrar att dräneringsåtgärder stör kvorumet;
- validering av specifikationer med hjälp av apiserver via CEL-uttryck i CRD, utan webhooks och beroende av cert-manager;
- /scale underresurs för kubectl scale och VerticalPodAutoscaler, mätvärdensport 2381, affinitet och topologySpreadConstraints vidarebefordran;
- kubectl-etcd-plugin för dag 2-åtgärder efter klusterdistribution.
Jämfört med den gamla implementeringen (v1alpha1) har följande ändrats:
- API-gruppen har ändrats från etcd.aenix.io till etcd-operator.cozystack.io;
- Istället för StatefulSet använder operatorn en separat EtcdMember-resurs för varje nod;
- Den godtyckliga spec.options-ordboken har ersatts med en typad uppsättning parametrar: quota-backend-bytes, autocompactification mode and interval, snapshot-count; en fri karta tillät att flaggor skickades som stred mot operatorns logik;
- EtcdBackup-resursen har bytt namn till EtcdSnapshot, semantiken bevaras;
- Validering har flyttats från webhook till CEL-regler i CRD;
- Klustertjänsten har bytts till headless-läge så att noder har stabila DNS-namn.
Migreringen utförs på plats med hjälp av etcd-migrate. Verktyget anpassar den gamla operatorns kluster som körs utan datamigrering, omstart av pod eller kvorumförlust. Det ändrar bara objektägare, etiketter och annoteringar. Därefter tar den nya operatorn över kontrollen. Klienter som kommer åt klustret via DNS fortsätter att fungera utan ändringar.
Cozystacks implementering av etcd-operatorn adresserar de flesta färdplanspunkterna för den officiella etcd-operatorn för etcd-projektet. Statusen för färdplanspunkterna är följande:
Dessutom erbjuder v1alpha2 funktioner som inte ingår i den officiella operatörens utvecklingsplan:
- stoppa klustret tills det finns noll repliker, pausa och återuppta samtidigt som klustrets och nodernas identitet bibehålls;
- minneslagring (tmpfs) med automatisk nodutbyte av operatören;
- validering på apiserversidan via CEL, utan webhooks och beroende av certifikat;
- automatisk PodDisruptionBudget för röstningsnoder;
- /scale subresource med status.selector ifylld så att kubectl scale och VerticalPodAutoscaler.targetRef fungerar direkt;
- vidarebefordra planeringsparametrarna för affinitet och topologySpreadConstraints, samt sammanfoga ytterligare metadata över alla objekt som skapats av operatorn;
- verktyg för migrering från den föregående operatorn utan att stoppa klustret;
- kubectl-etcd-plugin för operativa uppgifter.
Källa: opennet.ru
