ProHoster > Blogi > Haldamine > Meie kogemus andmetega etcd Kubernetes'i klastris otse (ilma K8s API-ta)
Meie kogemus andmetega etcd Kubernetes'i klastris otse (ilma K8s API-ta)
Üha sagedamini paluvad kliendid meilt võimaldada juurdepääsu Kubernetese klastrile, et pääseda juurde klastrisisesetele teenustele: et saaksime otse mõne andmebaasi või teenusega ühenduse luua, et ühendada kohalik rakendus klastris olevate rakendustega...
Näiteks on vaja luua ühendus kohalikust masinast teenusega memcached.staging.svc.cluster.local. Pakume seda võimalust VPN-i abil klastris, millega klient ühenduse loob. Selleks anname kliendile teada podide, teenuste ja tõukeklastri DNS-i alamvõrkudest. Seega, kui klient proovib teenusega ühendust luua memcached.staging.svc.cluster.local, pöördub päring klastri DNS-i ja saab vastuseks selle teenuse aadressi klastri teenindusvõrgust või kausta aadressi.
Konfigureerime K8-klastreid kubeadmi abil, kus on vaiketeenuse alamvõrk 192.168.0.0/16, ja kaunade võrk on 10.244.0.0/16. Tavaliselt töötab kõik hästi, kuid on paar punkti:
Alamvõrk 192.168.*.* kasutatakse sageli kliendikontorite võrkudes ja veelgi sagedamini arendajate koduvõrkudes. Ja siis tekivad konfliktid: koduruuterid töötavad selles alamvõrgus ja VPN surub need alamvõrgud klastrist kliendile.
Meil on mitu klastrit (tootmis-, lava- ja/või mitu arendusklastrit). Siis on vaikimisi kõigil neil podide ja teenuste jaoks samad alamvõrgud, mis tekitab suuri raskusi mitme klastri teenustega samaaegsel töötamisel.
Oleme juba ammu kasutusele võtnud praktika, mille kohaselt kasutame sama projekti raames erinevaid alamvõrke teenuste ja kaubikute jaoks – üldiselt nii, et kõigil klastritel on erinevad võrgud. Siiski on töös suur hulk klastreid, mida ma ei tahaks nullist üle kanda, kuna need käitavad paljusid teenuseid, olekupõhiseid rakendusi jne.
Ja siis küsisime endalt: kuidas olemasolevas klastris alamvõrku muuta?
Otsuste otsimine
Kõige tavalisem praktika on taasloomine kõik ClusterIP tüüpi teenuseid. Võimalusena oskab nõu anda ja see:
Järgmises protsessis on probleem: kui kõik on seadistatud, tulevad kaustadele /etc/resolv.conf DNS-i nimeserverina vana IP-aadress.
Kuna ma ikka lahendust ei leidnud, pidin kogu klastri kubeadm resetiga lähtestama ja uuesti käivitama.
Kuid see ei sobi kõigile... Siin on meie juhtumi täpsemad tutvustused:
Kasutatakse flanelli;
Klastreid on nii pilvedes kui ka riistvaras;
Sooviksin vältida kõigi klastri teenuste ümberpaigutamist;
Üldiselt on vaja teha kõike minimaalse arvu probleemidega;
Kubernetese versioon on 1.16.6 (teised toimingud on siiski sarnased teiste versioonidega);
Peamine ülesanne on tagada, et klastris on juurutatud teenuse alamvõrguga kubeadm 192.168.0.0/16, asendage see 172.24.0.0/16.
Ja juhtus nii, et olime juba ammu huvitanud näha, mida ja kuidas Kuberneteses etcd-s talletatakse, mida sellega teha saab... Nii me siis mõtlesimegi: “Miks mitte lihtsalt värskendada etcd-s olevaid andmeid, asendades vanad IP-aadressid (alamvõrk) uutega? "
Otsides etcd-s andmetega töötamiseks valmis tööriistu, ei leidnud me midagi, mis probleemi täielikult lahendaks. (Muide, kui teate utiliitidest, mis võimaldavad otse jne andmetega töötada, oleksime linkide eest tänulikud.) Siiski on hea lähtepunkt etcdhelper OpenShiftist(aitäh selle autoritele!).
See utiliit saab sertifikaatide abil ühenduse luua etcd-ga ja sealt käskude abil andmeid lugeda ls, get, dump.
Lisage etcdhelper
Järgmine mõte on loogiline: "Mis takistab teil seda utiliiti lisamast, lisades võimaluse andmete kirjutamiseks etcd-sse?"
Sellest sai kahe uue funktsiooniga etcdhelperi modifitseeritud versioon changeServiceCIDR и changePodCIDR. tema peal näed koodi siin.
Mida uued funktsioonid teevad? Algoritm changeServiceCIDR:
luua deserialiseerija;
koostama regulaaravaldise CIDR-i asendamiseks;
läbime kõik klastris oleva ClusterIP-tüüpi teenused:
dekodeerida väärtus etcd-st objektiks Go;
regulaaravaldise abil asendame aadressi kaks esimest baiti;
määrake teenusele uuest alamvõrgust IP-aadress;
looge serialiseerija, teisendage objekt Go protobufiks, kirjutage uued andmed jne.
Funktsioon changePodCIDR sisuliselt sarnased changeServiceCIDR - ainult teenuse spetsifikatsiooni muutmise asemel teeme seda sõlme jaoks ja muudame .spec.PodCIDR uude alamvõrku.
Tava
Muutke teenust CIDR
Ülesande rakendamise plaan on väga lihtne, kuid see hõlmab seisakuid kõigi klastri kaunade uuesti loomise ajal. Peale peamiste sammude kirjeldamist jagame ka mõtteid, kuidas teoreetiliselt saaks seda seisakut minimeerida.
Ettevalmistavad sammud:
vajaliku tarkvara installimine ja paigatud etcdhelperi kokkupanek;
varukoopia jne ja /etc/kubernetes.
Lühike tegevuskava teenuseCIDR muutmiseks:
apiserveri ja kontroller-halduri manifestide muutmine;
sertifikaatide uuesti väljastamine;
ClusterIP teenuste muutmine jne;
klastri kõigi kaunade taaskäivitamine.
Allpool on üksikasjalik toimingute jada.
1. Installige andmetõmmise jaoks programm etcd-client:
Säästame enda jaoks etcdhelper.go, laadige alla sõltuvusi, koguge:
wget https://raw.githubusercontent.com/flant/examples/master/2020/04-etcdhelper/etcdhelper.go
go get go.etcd.io/etcd/clientv3 k8s.io/kubectl/pkg/scheme k8s.io/apimachinery/pkg/runtime
go build -o etcdhelper etcdhelper.go
Hoiatus! Praegu lakkab domeeni eraldusvõime klastris töötamast, kuna olemasolevates kaunades /etc/resolv.conf registreeritakse vana CoreDNS-i aadress (kube-dns) ja kube-puhverserver muudab iptablesi reeglid vanast alamvõrgust uueks. Edasi artiklis on kirjutatud võimalikest võimalustest seisakuaja minimeerimiseks.
Parandame ConfigMapi nimeruumis kube-system:
kubectl -n kube-system edit cm kubelet-config-1.16
- asendage siin clusterDNS kube-dns teenuse uuele IP-aadressile: kubectl -n kube-system get svc kube-dns.
kubectl -n kube-system edit cm kubeadm-config
- teeme selle korda data.ClusterConfiguration.networking.serviceSubnet uude alamvõrku.
Kuna kube-dns-i aadress on muutunud, on vaja värskendada kubeleti konfiguratsiooni kõigis sõlmedes:
7. Kui jätate vähemalt ühe sõlme vana podCIDR, siis ei saa kube-controller-manager käivituda ja klastris olevaid kaustasid ei ajastata.
Tegelikult saab podCIDR-i muuta veelgi lihtsamalt (näiteks nii). Kuid me tahtsime õppida, kuidas töötada otse etcd-ga, sest Kubernetese objektide redigeerimisel etcd-s on juhtumeid - üksi võimalik variant. (Näiteks ei saa te lihtsalt muuta välja Service ilma seisakuta spec.clusterIP.)
Summaarne
Artiklis käsitletakse võimalust töötada andmetega etcd-s otse, st. Kubernetes API-st mööda minnes. Mõnikord võimaldab see lähenemine teha "keerulisi asju". Testisime tekstis toodud tehteid päris K8s klastrite peal. Kuid nende laialdaseks kasutamiseks valmisoleku staatus on PoC (kontseptsiooni tõend). Seega, kui soovite oma klastrites kasutada utiliidi etcdhelper muudetud versiooni, tehke seda omal vastutusel.