Cozystack-projektet har introducerat en omdesignad etcd-operator med ett nytt API.

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:

  • Att skapa ett nytt etcd-kluster, till exempel med 3 eller 5 noder, med en specificerad etcd-version implementeras.
  • Identifiering av klusterhälsostatus – implementerad.
  • Aktivering av TLS-kryptering av anslutningar, inklusive certifikatförnyelse, har implementerats.
  • Uppdatering inom patchversioner eller med en mindre version är delvis implementerad: värdet spec.version tillämpas endast på nya noder.
  • Skalning i båda riktningarna, till exempel 1 -> 3 -> 5 noder och tillbaka, är implementerad.
  • Konfigurering av etcd-parametrar via flaggor eller miljövariabler implementeras som en sluten typuppsättning parametrar.
  • Återställning av en misslyckad klustermedlem, om kvorumet bibehålls, är delvis implementerad: det finns ännu ingen automatisk ersättning av medlemmar med skadad PVC.
  • Återställning från fel på flera klustermedlemmar och förlust av kvorum har inte implementerats, arbetet är planerat.
  • Skapande av säkerhetskopior av kluster på begäran är implementerat.
  • Periodiska klustersäkerhetskopior flyttas avsiktligt utanför operatörens räckvidd: periodiska ögonblicksbilder föreslås köras med en standard CronJob.

    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

  • Köp pålitlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar 🔥 Köp pålitlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster