ProHoster > blog > Gweinyddiaeth > Ewch? Ystyr geiriau: Bash! Cyfarfod â'r gweithredwr cragen (adolygiad ac adroddiad fideo gan KubeCon EU'2020)
Ewch? Ystyr geiriau: Bash! Cyfarfod â'r gweithredwr cragen (adolygiad ac adroddiad fideo gan KubeCon EU'2020)
Eleni, roedd prif gynhadledd Ewropeaidd Kubernetes - KubeCon + CloudNativeCon Europe 2020 - yn rhithwir. Fodd bynnag, ni wnaeth newid o’r fath mewn fformat ein hatal rhag cyflawni ein hadroddiad hir-gynlluniedig “Go? Ystyr geiriau: Bash! Cyfarfod â'r gweithredwr cregyn” sy'n ymroddedig i'n prosiect Ffynhonnell Agored cregyn-weithredwr.
Mae'r erthygl hon, a ysbrydolwyd gan y sgwrs, yn cyflwyno dull o symleiddio'r broses o greu gweithredwyr ar gyfer Kubernetes ac yn dangos sut y gallwch chi wneud eich rhai eich hun heb fawr o ymdrech gan ddefnyddio gweithredwr cregyn.
Cyflwyno fideo o'r adroddiad (~23 munud yn Saesneg, yn amlwg yn fwy addysgiadol na'r erthygl) a'r prif ddyfyniad ohono ar ffurf testun. Ewch!
Yn y Fflint rydym yn optimeiddio ac yn awtomeiddio popeth yn gyson. Heddiw byddwn yn siarad am gysyniad cyffrous arall. Cwrdd: sgriptio plisgyn cwmwl-frodorol!
Fodd bynnag, gadewch i ni ddechrau gyda'r cyd-destun y mae hyn i gyd yn digwydd ynddo: Kubernetes.
Kubernetes API a rheolwyr
Gellir cynrychioli'r API yn Kubernetes fel math o weinydd ffeiliau gyda chyfeiriaduron ar gyfer pob math o wrthrych. Cynrychiolir gwrthrychau (adnoddau) ar y gweinydd hwn gan ffeiliau YAML. Yn ogystal, mae gan y gweinydd API sylfaenol sy'n eich galluogi i wneud tri pheth:
i dderbyn adnodd yn ôl ei fath a'i enw;
newid adnodd (yn yr achos hwn, dim ond gwrthrychau “cywir” y mae'r gweinydd yn eu storio - caiff pob un sydd wedi'i ffurfio'n anghywir neu a fwriedir ar gyfer cyfeiriaduron eraill eu taflu);
trac ar gyfer yr adnodd (yn yr achos hwn, mae'r defnyddiwr yn derbyn ei fersiwn gyfredol / wedi'i diweddaru ar unwaith).
Felly, mae Kubernetes yn gweithredu fel math o weinydd ffeiliau (ar gyfer maniffestau YAML) gyda thri dull sylfaenol (ie, mewn gwirionedd mae yna rai eraill, ond byddwn yn eu hepgor am y tro).
Y broblem yw mai dim ond gwybodaeth y gall y gweinydd ei storio. I wneud iddo weithio mae angen rheolwr - yr ail gysyniad pwysicaf a mwyaf sylfaenol ym myd Kubernetes.
Mae dau brif fath o reolwyr. Mae'r cyntaf yn cymryd gwybodaeth o Kubernetes, yn ei phrosesu yn ôl rhesymeg nythu, ac yn ei dychwelyd i K8s. Mae'r ail yn cymryd gwybodaeth gan Kubernetes, ond, yn wahanol i'r math cyntaf, yn newid cyflwr rhai adnoddau allanol.
Gadewch i ni edrych yn agosach ar y broses o greu Defnydd yn Kubernetes:
Rheolwr Lleoli (wedi'i gynnwys yn kube-controller-manager) yn derbyn gwybodaeth am Deployment ac yn creu ReplicaSet.
Mae ReplicaSet yn creu dau atgynhyrchiad (dau god) yn seiliedig ar y wybodaeth hon, ond nid yw'r codennau hyn wedi'u hamserlennu eto.
Mae'r rhaglennydd yn amserlennu codennau ac yn ychwanegu gwybodaeth nodau i'w YAMLs.
Mae Kubelets yn gwneud newidiadau i adnodd allanol (dyweder Docker).
Yna mae'r dilyniant cyfan hwn yn cael ei ailadrodd yn y drefn arall: mae'r kubelet yn gwirio'r cynwysyddion, yn cyfrifo statws y cod ac yn ei anfon yn ôl. Mae'r rheolydd ReplicaSet yn derbyn y statws ac yn diweddaru cyflwr y set replica. Mae'r un peth yn digwydd gyda'r Rheolwr Defnyddio ac o'r diwedd mae'r defnyddiwr yn cael y statws (presennol) wedi'i ddiweddaru.
Cregyn-weithredwr
Mae'n ymddangos bod Kubernetes yn seiliedig ar waith ar y cyd gwahanol reolwyr (mae gweithredwyr Kubernetes hefyd yn rheolwyr). Mae'r cwestiwn yn codi, sut i greu eich gweithredwr eich hun heb fawr o ymdrech? Ac yma mae'r un a ddatblygwyd gennym yn dod i'r adwy cregyn-weithredwr. Mae'n caniatáu i weinyddwyr systemau greu eu datganiadau eu hunain gan ddefnyddio dulliau cyfarwydd.
Enghraifft syml: copïo cyfrinachau
Gadewch i ni edrych ar enghraifft syml.
Gadewch i ni ddweud bod gennym ni glwstwr Kubernetes. Mae ganddo ofod enw default gyda rhai Cyfrinach mysecret. Yn ogystal, mae gofodau enwau eraill yn y clwstwr. Mae gan rai ohonynt label penodol ynghlwm wrthynt. Ein nod yw copïo Secret i mewn i ofodau enwau gyda label.
Cymhlethir y dasg gan y ffaith y gall gofodau enwau newydd ymddangos yn y clwstwr, ac efallai y bydd gan rai ohonynt y label hwn. Ar y llaw arall, pan fydd y label yn cael ei ddileu, dylid dileu Secret hefyd. Yn ogystal â hyn, gall y Gyfrinach ei hun newid hefyd: yn yr achos hwn, rhaid copïo'r Gyfrinach newydd i bob gofod enw gyda labeli. Os caiff Secret ei ddileu ar ddamwain mewn unrhyw ofod enw, dylai ein gweithredwr ei adfer ar unwaith.
Nawr bod y dasg wedi'i llunio, mae'n bryd dechrau ei gweithredu gan ddefnyddio'r gweithredwr cragen. Ond yn gyntaf mae'n werth dweud ychydig eiriau am y gweithredwr cragen ei hun.
Sut mae gweithredwr cragen yn gweithio
Fel llwythi gwaith eraill yn Kubernetes, mae gweithredwr cregyn yn rhedeg yn ei god ei hun. Yn y pod hwn yn y cyfeiriadur /hooks ffeiliau gweithredadwy yn cael eu storio. Gall y rhain fod yn sgriptiau yn Bash, Python, Ruby, ac ati. Rydym yn galw ffeiliau gweithredadwy o'r fath yn fachau (bachau).
Mae Shell-operator yn tanysgrifio i ddigwyddiadau Kubernetes ac yn rhedeg y bachau hyn mewn ymateb i'r digwyddiadau hynny sydd eu hangen arnom.
Sut mae'r gweithredwr cragen yn gwybod pa fachyn i'w redeg a phryd? Y pwynt yw bod gan bob bachyn ddau gam. Yn ystod y cychwyn, mae'r gweithredwr cragen yn rhedeg pob bachyn â dadl --config Dyma'r cam ffurfweddu. Ac ar ei ôl, mae bachau'n cael eu lansio yn y ffordd arferol - mewn ymateb i'r digwyddiadau y maent yn gysylltiedig â nhw. Yn yr achos olaf, mae'r bachyn yn derbyn y cyd-destun rhwymol (cyd-destun rhwymol) - data mewn fformat JSON, y byddwn yn siarad amdano yn fanylach isod.
Gwneud gweithredwr yn Bash
Nawr rydym yn barod ar gyfer gweithredu. I wneud hyn, mae angen i ni ysgrifennu dwy swyddogaeth (gyda llaw, rydym yn argymell llyfrgell plisgyn_lib, sy'n symleiddio'r bachau ysgrifennu yn Bash yn fawr):
mae angen y cyntaf ar gyfer y cam ffurfweddu - mae'n dangos y cyd-destun rhwymol;
mae'r ail yn cynnwys prif resymeg y bachyn.
#!/bin/bash
source /shell_lib.sh
function __config__() {
cat << EOF
configVersion: v1
# BINDING CONFIGURATION
EOF
}
function __main__() {
# THE LOGIC
}
hook::run "$@"
Y cam nesaf yw penderfynu pa wrthrychau sydd eu hangen arnom. Yn ein hachos ni, mae angen i ni olrhain:
ffynhonnell gyfrinach ar gyfer newidiadau;
pob gofod enw yn y clwstwr, fel eich bod chi'n gwybod pa rai sydd â label ar eu cyfer;
targedu cyfrinachau i sicrhau eu bod i gyd yn gyson â'r gyfrinach ffynhonnell.
Tanysgrifiwch i'r ffynhonnell gyfrinachol
Cyfluniad rhwymol ar ei gyfer yn eithaf syml. Rydyn ni'n nodi bod gennym ni ddiddordeb mewn Cyfrinach gyda'r enw mysecret mewn gofod enwau default:
Fel y gwelwch, mae maes newydd wedi ymddangos yn y ffurfweddiad gyda'r enw jqFilter. Fel mae'r enw'n awgrymu, jqFilter yn hidlo pob gwybodaeth ddiangen ac yn creu gwrthrych JSON newydd gyda'r meysydd sydd o ddiddordeb i ni. Bydd bachyn gyda chyfluniad tebyg yn derbyn y cyd-destun rhwymol canlynol:
Mae'n cynnwys arae filterResults ar gyfer pob gofod enw yn y clwstwr. Newidyn Boole hasLabel yn nodi a yw label ynghlwm wrth ofod enw penodol. Dewisydd keepFullObjectsInMemory: false yn dynodi nad oes angen cadw gwrthrychau cyflawn yn y cof.
Olrhain cyfrinachau targed
Rydym yn tanysgrifio i bob Cyfrinach sydd ag anodiad penodol managed-secret: "yes" (dyma ein targed dst_secrets):
Yn yr achos hwn, jqFilter yn hidlo'r holl wybodaeth ac eithrio'r gofod enw a'r paramedr resourceVersion. Trosglwyddwyd y paramedr olaf i'r anodiad wrth greu'r gyfrinach: mae'n caniatáu ichi gymharu fersiynau o gyfrinachau a'u diweddaru.
Bydd bachyn sydd wedi'i ffurfweddu fel hyn, pan gaiff ei weithredu, yn derbyn y tri chyd-destun rhwymol a ddisgrifir uchod. Gellir eu hystyried fel rhyw fath o gipolwg (ciplun) clwstwr.
Yn seiliedig ar yr holl wybodaeth hon, gellir datblygu algorithm sylfaenol. Mae'n ailadrodd dros bob gofod enw a:
os hasLabel materion true ar gyfer y gofod enw presennol:
yn cymharu'r gyfrinach fyd-eang â'r un leol:
os ydynt yr un peth, nid yw'n gwneud dim;
os ydynt yn gwahaniaethu - executes kubectl replace neu create;
os hasLabel materion false ar gyfer y gofod enw presennol:
gwneud yn siŵr nad yw Secret yn y gofod enw a roddir:
os yw'r Gyfrinach leol yn bresennol, dilëwch hi gan ddefnyddio kubectl delete;
os na chanfyddir y Gyfrinach leol, nid yw'n gwneud dim.
Dyna sut roeddem yn gallu creu rheolydd Kubernetes syml gan ddefnyddio 35 llinell o gyfluniad YAML a thua'r un faint o god Bash! Gwaith y gweithredwr cragen yw eu cysylltu â'i gilydd.
Fodd bynnag, nid copïo cyfrinachau yw'r unig faes o gymhwyso'r cyfleustodau. Dyma ychydig mwy o enghreifftiau i ddangos yr hyn y mae'n gallu ei wneud.
Enghraifft 1: Gwneud newidiadau i ConfigMap
Gadewch i ni edrych ar Defnydd sy'n cynnwys tri chod. Mae codennau'n defnyddio ConfigMap i storio rhywfaint o ffurfweddiad. Pan lansiwyd y codennau, roedd ConfigMap mewn cyflwr arbennig (gadewch i ni ei alw yn v.1). Yn unol â hynny, mae pob cod yn defnyddio'r fersiwn benodol hon o ConfigMap.
Nawr, gadewch i ni dybio bod y ConfigMap wedi newid (adn.2). Fodd bynnag, bydd y codennau'n defnyddio'r fersiwn flaenorol o ConfigMap (v.1):
Sut alla i eu cael i newid i'r ConfigMap (v.2) newydd? Mae'r ateb yn syml: defnyddiwch dempled. Gadewch i ni ychwanegu anodiad siec i'r adran template Ffurfweddiadau lleoli:
O ganlyniad, bydd y checksum hwn yn cael ei gofrestru ym mhob cod, a bydd yr un peth â'r un ar gyfer Defnyddio. Nawr does ond angen i chi ddiweddaru'r anodiad pan fydd y ConfigMap yn newid. Ac mae'r gweithredwr cragen yn ddefnyddiol yn yr achos hwn. Y cyfan sydd angen i chi ei wneud yw rhaglen bachyn a fydd yn tanysgrifio i'r ConfigMap ac yn diweddaru'r siec.
Os bydd y defnyddiwr yn gwneud newidiadau i'r ConfigMap, bydd y gweithredwr cragen yn sylwi arnynt ac yn ailgyfrifo'r siec. Ar ôl hynny bydd hud Kubernetes yn dod i mewn: bydd y cerddorfa'n lladd y pod, yn creu un newydd, yn aros iddo ddod yn Ready, ac yn symud ymlaen i'r un nesaf. O ganlyniad, bydd Deployment yn cydamseru ac yn newid i'r fersiwn newydd o ConfigMap.
Enghraifft 2: Gweithio gyda Diffiniadau Adnoddau Personol
Fel y gwyddoch, mae Kubernetes yn caniatáu ichi greu mathau arferol o wrthrychau. Er enghraifft, gallwch chi greu caredig MysqlDatabase. Gadewch i ni ddweud bod gan y math hwn ddau baramedr metadata: name и namespace.
apiVersion: example.com/v1alpha1
kind: MysqlDatabase
metadata:
name: foo
namespace: bar
Mae gennym glwstwr Kubernetes gyda gwahanol ofodau enwau lle gallwn greu cronfeydd data MySQL. Yn yr achos hwn gellir defnyddio gweithredwr cragen i olrhain adnoddau MysqlDatabase, gan eu cysylltu â'r gweinydd MySQL a chydamseru cyflwr dymunol ac arsylwi'r clwstwr.
Enghraifft 3: Monitro Rhwydwaith Clwstwr
Fel y gwyddoch, defnyddio ping yw'r ffordd symlaf o fonitro rhwydwaith. Yn yr enghraifft hon byddwn yn dangos sut i weithredu monitro o'r fath gan ddefnyddio gweithredwr cragen.
Yn gyntaf oll, bydd angen i chi danysgrifio i nodau. Mae angen enw a chyfeiriad IP pob nod ar y gweithredwr cragen. Gyda'u cymorth, bydd yn pingio'r nodau hyn.
Paramedr executeHookOnEvent: [] yn atal y bachyn rhag rhedeg mewn ymateb i unrhyw ddigwyddiad (hynny yw, mewn ymateb i newid, ychwanegu, dileu nodau). Fodd bynnag, efe bydd yn rhedeg (a diweddaru'r rhestr o nodau) Wedi'i drefnu - bob munud, fel y rhagnodir gan y maes schedule.
Nawr mae'r cwestiwn yn codi, sut yn union ydyn ni'n gwybod am broblemau fel colli pecynnau? Gadewch i ni edrych ar y cod:
function __main__() {
for i in $(seq 0 "$(context::jq -r '(.snapshots.nodes | length) - 1')"); do
node_name="$(context::jq -r '.snapshots.nodes['"$i"'].filterResult.name')"
node_ip="$(context::jq -r '.snapshots.nodes['"$i"'].filterResult.ip')"
packets_lost=0
if ! ping -c 1 "$node_ip" -t 1 ; then
packets_lost=1
fi
cat >> "$METRICS_PATH" <<END
{
"name": "node_packets_lost",
"add": $packets_lost,
"labels": {
"node": "$node_name"
}
}
END
done
}
Rydym yn ailadrodd trwy'r rhestr o nodau, yn cael eu henwau a'u cyfeiriadau IP, yn eu ping ac yn anfon y canlyniadau at Prometheus. Gall gweithredwr cregyn allforio metrigau i Prometheus, gan arbed i ffeil lleoli yn ôl y llwybr a nodir yn y newidyn amgylchedd $METRICS_PATH.
Yma felly gallwch wneud gweithredwr ar gyfer monitro rhwydwaith syml mewn clwstwr.
Mecanwaith ciwio
Byddai'r erthygl hon yn anghyflawn heb ddisgrifio mecanwaith pwysig arall sydd wedi'i ymgorffori yn y gweithredwr cragen. Dychmygwch ei fod yn gweithredu rhyw fath o fachyn mewn ymateb i ddigwyddiad yn y clwstwr.
Beth fydd yn digwydd os, ar yr un pryd, mae rhywbeth yn digwydd yn y clwstwr? un yn fwy digwyddiad?
A fydd gweithredwr cragen yn rhedeg enghraifft arall o'r bachyn?
Beth os, dyweder, fod pum digwyddiad yn digwydd yn y clwstwr ar unwaith?
A fydd y gweithredwr cragen yn eu prosesu ochr yn ochr?
Beth am adnoddau a ddefnyddir fel cof a CPU?
Yn ffodus, mae gan weithredwr cragen fecanwaith ciwio adeiledig. Mae pob digwyddiad yn cael ei giwio a'i brosesu'n ddilyniannol.
Gadewch i ni egluro hyn gydag enghreifftiau. Gadewch i ni ddweud bod gennym ddau fachau. Mae'r digwyddiad cyntaf yn mynd i'r bachyn cyntaf. Unwaith y bydd ei brosesu wedi'i gwblhau, mae'r ciw yn symud ymlaen. Mae'r tri digwyddiad nesaf yn cael eu hailgyfeirio i'r ail fachyn - maen nhw'n cael eu tynnu o'r ciw a'u rhoi mewn “bwndel”. Hynny yw Mae hook yn derbyn amrywiaeth o ddigwyddiadau — neu, yn fwy manwl gywir, amrywiaeth o gyd-destunau rhwymol.
Hefyd y rhain gellir cyfuno digwyddiadau yn un mawr. Y paramedr sy'n gyfrifol am hyn group yn y cyfluniad rhwymol.
Gallwch greu unrhyw nifer o giwiau/bachau a'u cyfuniadau amrywiol. Er enghraifft, gall un ciw weithio gyda dau fachau, neu i'r gwrthwyneb.
Y cyfan sydd angen i chi ei wneud yw ffurfweddu'r maes yn unol â hynny queue yn y cyfluniad rhwymol. Os na phenodir enw ciw, mae'r bachyn yn rhedeg ar y ciw rhagosodedig (default). Mae'r mecanwaith ciwio hwn yn caniatáu ichi ddatrys yr holl broblemau rheoli adnoddau yn llwyr wrth weithio gyda bachau.
Casgliad
Fe wnaethom egluro beth yw gweithredwr cregyn, dangos sut y gellir ei ddefnyddio i greu gweithredwyr Kubernetes yn gyflym ac yn ddiymdrech, a rhoesom sawl enghraifft o'i ddefnydd.
Mae gwybodaeth fanwl am y gweithredwr cragen, yn ogystal â thiwtorial cyflym ar sut i'w ddefnyddio, ar gael yn y cyfatebol storfeydd ar GitHub. Peidiwch ag oedi cyn cysylltu â ni gyda chwestiynau: gallwch eu trafod mewn sesiwn arbennig Grŵp telegram (yn Rwsieg) neu yn y fforwm hwn (yn Saesneg).
Ac os oeddech chi'n ei hoffi, rydyn ni bob amser yn hapus i weld materion newydd / cysylltiadau cyhoeddus / sêr ar GitHub, lle, gyda llaw, gallwch chi ddod o hyd i eraill prosiectau diddorol. Yn eu plith mae'n werth tynnu sylw ato gweithredwr addon, sef brawd mawr i weithredwr cragen. Mae'r cyfleustodau hwn yn defnyddio siartiau Helm i osod ychwanegion, gall gyflwyno diweddariadau a monitro paramedrau / gwerthoedd siartiau amrywiol, rheoli'r broses o osod siartiau, a gall hefyd eu haddasu mewn ymateb i ddigwyddiadau yn y clwstwr.