Mūsu pieredze ar datiem tieŔi etcd Kubernetes klasterī (bez K8s API)
Arvien biežÄk klienti lÅ«dz nodroÅ”inÄt piekļuvi Kubernetes klasterim, lai varÄtu piekļūt klastera pakalpojumiem: lai varÄtu tieÅ”i izveidot savienojumu ar kÄdu datu bÄzi vai pakalpojumu, savienot lokÄlo lietojumprogrammu ar lietojumprogrammÄm klasterÄ«...
PiemÄram, ir nepiecieÅ”ams izveidot savienojumu no vietÄjÄs maŔīnas ar pakalpojumu memcached.staging.svc.cluster.local. MÄs nodroÅ”inÄm Å”o iespÄju, izmantojot VPN klasterÄ«, ar kuru klients izveido savienojumu. Lai to izdarÄ«tu, mÄs klientam paziÅojam par podziÅu, pakalpojumu un push klastera DNS apakÅ”tÄ«kliem. TÄdÄjÄdi, kad klients mÄÄ£ina izveidot savienojumu ar pakalpojumu memcached.staging.svc.cluster.local, pieprasÄ«jums tiek nosÅ«tÄ«ts uz klastera DNS un kÄ atbilde tiek saÅemta Ŕī pakalpojuma adrese no klastera pakalpojumu tÄ«kla vai pod adreses.
MÄs konfigurÄjam K8s klasterus, izmantojot kubeadm, kur ir noklusÄjuma pakalpojumu apakÅ”tÄ«kls 192.168.0.0/16, un podiÅu tÄ«kls ir 10.244.0.0/16. Parasti viss darbojas labi, taÄu ir daži punkti:
ApakÅ”tÄ«kls 192.168.*.* bieži izmanto klientu biroju tÄ«klos un vÄl biežÄk izstrÄdÄtÄju mÄjas tÄ«klos. Un tad rodas konflikti: mÄjas marÅ”rutÄtÄji strÄdÄ Å”ajÄ apakÅ”tÄ«klÄ, un VPN nospiež Å”os apakÅ”tÄ«klus no klastera uz klientu.
Mums ir vairÄkas kopas (ražoÅ”anas, skatuves un/vai vairÄkas izstrÄdÄtÄju kopas). Tad pÄc noklusÄjuma visiem tiem bÅ«s vienÄdi apakÅ”tÄ«kli podiem un pakalpojumiem, kas rada lielas grÅ«tÄ«bas vienlaicÄ«gam darbam ar pakalpojumiem vairÄkos klasteros.
MÄs jau sen esam pieÅÄmuÅ”i praksi izmantot dažÄdus apakÅ”tÄ«klus pakalpojumiem un podiem viena projekta ietvaros - kopumÄ, lai visiem klasteriem bÅ«tu dažÄdi tÄ«kli. TomÄr darbojas liels skaits klasteru, kurus es negribÄtu pÄrcelt no nulles, jo tie nodroÅ”ina daudzus pakalpojumus, statusa lietojumprogrammas utt.
Un tad mÄs sev jautÄjÄm: kÄ mainÄ«t apakÅ”tÄ«klu esoÅ”ajÄ klasterÄ«?
LÄmumu meklÄÅ”ana
VisizplatÄ«tÄkÄ prakse ir radÄ«t no jauna viss pakalpojumus ar tipu ClusterIP. KÄ opciju, var ieteikt un Ŕī:
TÄlÄk norÄdÄ«tajÄ procesÄ ir problÄma: pÄc tam, kad viss ir konfigurÄts, podi tiek parÄdÄ«ti vecajÄ IP adresÄ kÄ DNS nosaukuma serveris mapÄ /etc/resolv.conf.
TÄ kÄ es joprojÄm neatradu risinÄjumu, man nÄcÄs atiestatÄ«t visu klasteru, izmantojot kubeadm atiestatÄ«Å”anu, un vÄlreiz to iniciÄt.
Bet tas nav piemÄrots visiem... Å eit ir sÄ«kÄks ievads mÅ«su gadÄ«jumam:
tiek izmantots flanelis;
Ir kopas gan mÄkoÅos, gan aparatÅ«rÄ;
Es vÄlÄtos izvairÄ«ties no visu klastera pakalpojumu atkÄrtotas izvietoÅ”anas;
KopumÄ viss ir jÄdara ar minimÄlu problÄmu skaitu;
Kubernetes versija ir 1.16.6 (tomÄr turpmÄkÄs darbÄ«bas bÅ«s lÄ«dzÄ«gas citÄm versijÄm);
Galvenais uzdevums ir nodroÅ”inÄt, ka klasterÄ« tiek izvietots, izmantojot kubeadm ar pakalpojumu apakÅ”tÄ«klu 192.168.0.0/16, nomainiet to ar 172.24.0.0/16.
Un sagadÄ«jÄs, ka mums jau sen bija interese paskatÄ«ties, kas un kÄ Kubernetes tiek glabÄts etcd, ko ar to var izdarÄ«t... TÄ nu izdomÄjÄm: āKÄpÄc gan vienkÄrÅ”i neatjauninÄt datus etcd, aizstÄjot vecÄs IP adreses (apakÅ”tÄ«klu) ar jaunÄm? "
MeklÄjot gatavus rÄ«kus darbam ar datiem programmÄ etcd, mÄs neatradÄm neko, kas pilnÄ«bÄ atrisinÄtu problÄmu. (Starp citu, ja zinÄt kÄdu utilÄ«tu darbam ar datiem tieÅ”i programmÄ etcd, mÄs priecÄsimies par saitÄm.) TomÄr labs sÄkumpunkts ir etcdhelper no OpenShift(paldies tÄs autoriem!).
Å Ä« utilÄ«ta var izveidot savienojumu ar etcd, izmantojot sertifikÄtus, un nolasÄ«t datus no turienes, izmantojot komandas ls, get, dump.
Pievienojiet etcdhelper
NÄkamÄ doma ir loÄ£iska: "Kas jums traucÄ pievienot Å”o utilÄ«tu, pievienojot iespÄju rakstÄ«t datus uz etcd?"
TÄ kļuva par modificÄtu etcdhelper versiju ar divÄm jaunÄm funkcijÄm changeServiceCIDR Šø changePodCIDR. uz viÅas jÅ«s varat redzÄt kodu Å”eit.
Ko dara jaunÄs funkcijas? Algoritms changeServiceCIDR:
izveidot deserializatoru;
sastÄdÄ«t regulÄro izteiksmi, lai aizstÄtu CIDR;
mÄs ejam cauri visiem pakalpojumiem ar klastera tipu ClusterIP:
atÅ”ifrÄt vÄrtÄ«bu no etcd uz Go objektu;
izmantojot regulÄro izteiksmi aizstÄjam adreses pirmos divus baitus;
pieŔķirt pakalpojumam IP adresi no jaunÄ apakÅ”tÄ«kla;
izveidojiet serializÄtÄju, pÄrveidojiet Go objektu par protobuf, ierakstiet jaunus datus uz etcd.
Funkcija changePodCIDR bÅ«tÄ«bÄ lÄ«dzÄ«gi changeServiceCIDR - tikai tÄ vietÄ, lai rediÄ£Ätu pakalpojuma specifikÄciju, mÄs to darÄm mezglam un mainÄm .spec.PodCIDR uz jaunu apakÅ”tÄ«klu.
Prakse
Mainīt pakalpojumu CIDR
Uzdevuma Ä«stenoÅ”anas plÄns ir ļoti vienkÄrÅ”s, taÄu tas ietver dÄ«kstÄvi, kamÄr tiek atjaunoti visi klastera podi. PÄc galveno soļu aprakstÄ«Å”anas padalÄ«simies arÄ« pÄrdomÄs par to, kÄ teorÄtiski Å”o dÄ«kstÄvi var samazinÄt lÄ«dz minimumam.
SagatavoŔanas soļi:
nepiecieÅ”amÄs programmatÅ«ras instalÄÅ”ana un patched etcdhelper montÄža;
dublÄjums etcd un /etc/kubernetes.
ÄŖss darbÄ«bas plÄns pakalpojuma CIDR maiÅai:
apiservera un kontroliera-pÄrvaldnieka manifestu maiÅa;
MÄs krÄjam sev etcdhelper.go, lejupielÄdÄt atkarÄ«bas, apkopot:
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
UzmanÄ«bu! Å obrÄ«d domÄna izŔķirtspÄja klasterÄ« pÄrstÄj darboties, jo esoÅ”ajos podiÅos /etc/resolv.conf tiek reÄ£istrÄta vecÄ CoreDNS adrese (kube-dns), un kube-proxy maina iptables noteikumus no vecÄ apakÅ”tÄ«kla uz jauno. TÄlÄk rakstÄ ir rakstÄ«ts par iespÄjamÄm iespÄjÄm, kÄ samazinÄt dÄ«kstÄves laiku.
NosaukumvietÄ labosim ConfigMap kube-system:
kubectl -n kube-system edit cm kubelet-config-1.16
- nomainiet Ŕeit clusterDNS uz jauno kube-dns pakalpojuma IP adresi: kubectl -n kube-system get svc kube-dns.
kubectl -n kube-system edit cm kubeadm-config
- mÄs to salabosim data.ClusterConfiguration.networking.serviceSubnet uz jaunu apakÅ”tÄ«klu.
TÄ kÄ kube-dns adrese ir mainÄ«jusies, ir jÄatjaunina kubelet konfigurÄcija visos mezglos:
kubectl get pods --no-headers=true --all-namespaces |sed -r 's/(S+)s+(S+).*/kubectl --namespace 1 delete pod 2/e'
Samaziniet dÄ«kstÄves laiku
Domas par to, kÄ samazinÄt dÄ«kstÄves laiku:
PÄc vadÄ«bas plaknes manifestu maiÅas izveidojiet jaunu kube-dns pakalpojumu, piemÄram, ar nosaukumu kube-dns-tmp un jauna adrese 172.24.0.10.
Marka if programmÄ etcdhelper, kas nemainÄ«s kube-dns pakalpojumu.
AizstÄt adresi visos kubeletos ClusterDNS uz jaunu, savukÄrt vecais pakalpojums turpinÄs strÄdÄt vienlaikus ar jauno.
Pagaidiet, lÄ«dz pÄkstis ar aplikÄcijÄm apgÄzÄ«sies vai nu paÅ”as dabisku iemeslu dÄļ, vai saskaÅotÄ laikÄ.
DzÄst pakalpojumu kube-dns-tmp un mainÄ«t serviceSubnetCIDR kube-dns pakalpojumam.
Å is plÄns ļaus jums samazinÄt dÄ«kstÄves laiku lÄ«dz ~ minÅ«tei pakalpojuma noÅemÅ”anas laikÄ kube-dns-tmp un pakalpojuma apakÅ”tÄ«kla maiÅa kube-dns.
ModifikÄcija podNetwork
TajÄ paÅ”Ä laikÄ mÄs nolÄmÄm apskatÄ«t, kÄ modificÄt podNetwork, izmantojot iegÅ«to etcdhelper. DarbÄ«bu secÄ«ba ir Å”Äda:
konfigurÄciju laboÅ”ana kube-system;
kube-controller-manager manifesta laboŔana;
mainīt podCIDR tieŔi uttd;
pÄrstartÄjiet visus klastera mezglus.
Tagad vairÄk par Ŕīm darbÄ«bÄm:
1. ModificÄjiet ConfigMaps nosaukumu telpÄ kube-system:
kubectl -n kube-system edit cm kubeadm-config
- labojot data.ClusterConfiguration.networking.podSubnet uz jaunu apakŔtīklu 10.55.0.0/16.
7. Ja atstÄjat vismaz vienu mezglu vecais podCIDR, tad kube-controller-manager nevarÄs startÄt un klastera podi netiks ieplÄnoti.
Faktiski podCIDR nomaiÅu var veikt vÄl vienkÄrÅ”Äk (piemÄram, tÄ). Bet mÄs gribÄjÄm iemÄcÄ«ties strÄdÄt ar etcd tieÅ”i, jo ir gadÄ«jumi, kad rediÄ£Ät Kubernetes objektus etcd - vienÄ«gais iespÄjamais variants. (PiemÄram, jÅ«s nevarat vienkÄrÅ”i mainÄ«t pakalpojumu lauku bez dÄ«kstÄves spec.clusterIP.)
Kopsavilkums
RakstÄ apskatÄ«ta iespÄja strÄdÄt ar datiem etcd tieÅ”i, t.i. apejot Kubernetes API. Dažreiz Ŕī pieeja ļauj jums veikt "grÅ«tas lietas". MÄs pÄrbaudÄ«jÄm tekstÄ norÄdÄ«tÄs darbÄ«bas reÄlos K8 klasteros. TomÄr to gatavÄ«bas statuss plaÅ”ai lietoÅ”anai ir PoC (koncepcijas pierÄdÄ«jums). TÄpÄc, ja savÄs kopÄs vÄlaties izmantot modificÄtu utilÄ«ta etcdhelper versiju, dariet to uz savu risku.