Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye

Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye
Si w ap travay ak Kubernetes, Lè sa a, kubectl se pwobableman youn nan sèvis piblik ou plis itilize yo. Ak chak fwa ou pase anpil tan ap travay ak yon zouti sèten, li peye pou etidye li byen epi aprann kouman yo sèvi ak li efektivman.

Ekip Kubernetes aaS soti nan Mail.ru tradui yon atik pa Daniel Weibel kote w ap jwenn konsèy ak ke trik nouvèl pou travay efektivman ak kubectl. Li pral ede w tou jwenn yon konpreyansyon pi fon nan Kubernetes.

Dapre otè a, objektif la nan atik la se fè travay chak jou ou ak Kubernetes pa sèlman pi efikas, men tou, pi agreyab!

Entwodiksyon: Ki sa ki kubectl

Anvan ou ka aprann sèvi ak kubectl pi efikas, ou bezwen jwenn yon konpreyansyon debaz sou sa li ye ak kijan li fonksyone.

Soti nan pèspektiv itilizatè a, kubectl se yon panèl kontwòl ki pèmèt ou fè operasyon Kubernetes.

Teknikman pale, kubectl se yon kliyan API Kubernetes.

Kubernetes API se yon HTTP REST API. API sa a se vrè koòdone itilizatè Kubernetes, atravè li konplètman kontwole. Sa vle di ke chak operasyon Kubernetes ekspoze kòm yon pwen final API epi yo ka fèt ak yon demann HTTP nan pwen final sa a.

Se poutèt sa, travay prensipal kubectl se fè demann HTTP nan API Kubernetes:

Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye
Kubernetes se yon sistèm konplètman oryante resous. Sa vle di ke li kenbe eta entèn resous yo ak tout operasyon Kubernetes yo se operasyon CRUD.

Ou gen kontwòl konplè sou Kubernetes lè w jere resous sa yo, epi Kubernetes kalkile sa pou w fè dapre eta aktyèl resous yo. Pou rezon sa a, referans API Kubernetes òganize kòm yon lis kalite resous ak operasyon ki asosye yo.

Ann gade yon egzanp.

Ann di ou vle kreye yon resous ReplicaSet. Pou fè sa, ou dekri ReplicaSet nan yon dosye pa non replicaset.yaml, Lè sa a, kouri lòd la:

$ kubectl create -f replicaset.yaml

Sa a pral kreye yon resous ReplicaSet. Men, sa k ap pase dèyè sèn nan?

Kubernetes gen yon operasyon kreyasyon ReplicaSet. Tankou nenpòt lòt operasyon, li ekspoze kòm yon pwen final API. Pwen API espesifik pou operasyon sa a sanble sa a:

POST /apis/apps/v1/namespaces/{namespace}/replicasets

Ou ka jwenn pwen final API pou tout operasyon Kubernetes nan Referans API (ki gen ladan pwen final ki anwo a). Pou fè yon demann aktyèl nan yon pwen final, ou dwe premye ajoute URL la sèvè API nan chemen yo pwen final ki nan lis nan referans API a.

Pakonsekan, lè ou egzekite lòd ki anwo a, kubectl voye yon demann HTTP POST nan pwen final API ki anwo a. Definisyon ReplicaSet ou bay nan dosye a replicaset.yaml, yo voye nan kò a nan demann lan.

Men ki jan kubectl travay pou tout kòmandman ki kominike avèk gwoup Kubernetes la. Nan tout ka sa yo, kubectl tou senpleman fè demann HTTP nan pwen final Kubernetes API ki apwopriye yo.

Tanpri sonje ke ou ka konplètman jere Kubernetes lè l sèvi avèk yon sèvis piblik tankou curlpa manyèlman voye demann HTTP nan API Kubernetes. Kubectl tou senpleman fè li pi fasil pou itilize API Kubernetes.

Sa a se Basics yo nan ki sa kubectl ye ak ki jan li fonksyone. Men, gen yon lòt bagay sou API Kubernetes ke chak itilizatè kubectl ta dwe konnen. Ann pran yon gade rapid nan mond enteryè Kubernetes.

Mond enteryè Kubernetes

Kubernetes konsiste de yon seri eleman endepandan ki kouri kòm pwosesis separe sou nœuds gwoup. Gen kèk konpozan kouri sou nœuds mèt, lòt moun sou nœuds travayè yo, chak eleman fè pwòp travay espesifik li yo.

Men eleman ki pi enpòtan yo sou nœuds prensipal yo:

  1. Vout - estoke definisyon resous yo (anjeneral li nan elatriye).
  2. Sèvè API — bay yon API ak jere depo.
  3. Manadjè kontwolè — Asire ke estati resous yo konfòme yo ak espesifikasyon yo.
  4. Orè — orè gous sou nœuds travayè yo.

Ak isit la se youn eleman ki pi enpòtan sou nœuds travayè yo:

  1. kubelet - jere lansman de resipyan sou ne k ap travay la.

Pou konprann ki jan eleman sa yo travay ansanm, ann gade nan yon egzanp.

Ann sipoze ou fèk fini kubectl create -f replicaset.yaml, apre sa kubectl te fè yon demann HTTP POST ReplicaSet pwen final API (pase definisyon resous ReplicaSet).

Kisa k ap pase nan gwoup la?

  1. Apre fè kubectl create -f replicaset.yaml Sèvè API a estoke definisyon resous ReplicaSet ou a nan depo:

    Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye

  2. Apre sa, kontwolè ReplicaSet lanse nan manadjè kontwolè a, ki okipe kreyasyon, modifikasyon ak efase resous ReplicaSet:

    Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye

  3. Kontwolè ReplicaSet la kreye yon definisyon gous pou chak kopi ReplicaSet (dapre modèl pod la nan definisyon ReplicaSet la) epi estoke yo nan depo:

    Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye

  4. Planifikatè a lanse, swiv gous ki poko plase nan okenn nœud travayè yo:

    Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye

  5. Planifikatè a chwazi yon ne travayè apwopriye pou chak gous epi ajoute enfòmasyon sa yo nan definisyon gous la nan magazen an:

    Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye

  6. Sou nœud travayè yo ki plase gous la, Kubelet lanse, li swiv gous yo asiyen nan nœud sa a:

    Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye

  7. Kubelet la li definisyon gous la nan depo epi li enstwi yon tansyon veso, tankou Docker, pou lanse resipyan sou ne:

    Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye

Anba a se yon vèsyon tèks deskripsyon sa a.

Sèvè API a trete demann API pou pwen final kreyasyon ReplicaSet la. Sèvè API a otantifye demann lan epi estoke definisyon resous ReplicaSet la nan depo.

Evènman sa a kòmanse kontwolè ReplicaSet la, ki se yon sous-pwosesis manadjè kontwolè a. Kontwolè ReplicaSet kontwole kreyasyon, mete ajou, ak efase resous ReplicaSet nan magazen an epi li resevwa yon notifikasyon evènman lè sa rive.

Travay kontwolè ReplicaSet la se asire kantite gous ReplicaSet ki nesesè yo egziste. Nan egzanp nou an, pa gen okenn gous ankò, kidonk kontwolè ReplicaSet la kreye definisyon gous sa yo (dapre modèl gous nan definisyon ReplicaSet la) epi estoke yo nan depo.

Kreyasyon nouvo gous deklanche pa yon pwogramè ki kenbe tras de definisyon gous ki poko pwograme pou nœuds travayè yo. Planifikatè a chwazi yon ne travayè apwopriye pou chak gous epi mete ajou definisyon gous yo nan depo a.

Remake byen ke jiska pwen sa a, pa gen okenn kòd chaj travay ki te kouri nenpòt kote nan gwoup la. Tout sa ki te fèt jiskaprezan - sa a se kreyasyon an ak aktyalizasyon nan resous nan depo a sou ne mèt la.

Dènye evènman an deklannche Kubelets, ki kontwole gous yo pwograme pou nœuds travayè yo. Kubelet nan ne travayè kote gous ReplicaSet ou yo enstale yo dwe bay enstriksyon tansyon veso a, tankou Docker, pou telechaje imaj veso ki nesesè yo epi kouri yo.

Nan pwen sa a, aplikasyon ReplicaSet ou a finalman ap kouri!

Wòl API Kubernetes

Kòm ou te wè nan egzanp anvan an, eleman Kubernetes (eksepte pou sèvè API ak depo) gade pou chanjman nan resous nan depo ak chanje enfòmasyon sou resous nan depo.

Natirèlman, eleman sa yo pa kominike avèk depo a dirèkteman, men sèlman atravè API Kubernetes la.

Konsidere egzanp sa yo:

  1. Kontwolè ReplicaSet la sèvi ak pwen final API a lis ReplicaSets ak paramèt watch pou kontwole chanjman nan resous ReplicaSet yo.
  2. Kontwolè ReplicaSet la sèvi ak pwen final API a kreye Pod (kreye gous) pou kreye gous.
  3. Scheduler itilize pwen final API patch gous (edit gous) pou mete ajou gous yo ak enfòmasyon sou ne travayè yo chwazi a.

Kòm ou ka wè, sa a se menm API ke kubectl jwenn aksè. Sèvi ak menm API a pou konpozan entèn ak itilizatè ekstèn se yon konsèp fondamantal nan konsepsyon Kubernetes.

Koulye a, nou ka rezime ki jan Kubernetes travay:

  1. Depo magazen yo eta, se sa ki, resous Kubernetes.
  2. Sèvè API a bay yon koòdone nan depo a nan fòm Kubernetes API a.
  3. Tout lòt konpozan ak itilizatè Kubernetes li, obsève, ak manipile eta Kubernetes (resous) atravè API a.

Lè w konnen konsèp sa yo, sa ap ede w konprann kubectl pi byen epi pou w jwenn pi plis nan li.

Koulye a, kite a gade nan kèk konsèy espesifik ak ke trik nouvèl ki pral ede amelyore pwodiktivite ou ak kubectl.

1. Akselere opinyon lè l sèvi avèk fini lòd

Youn nan teknik ki pi itil, men souvan neglije, pou amelyore pèfòmans ak kubectl se fini lòd.

Fini kòmandman pèmèt ou ranpli otomatikman pati nan kòmandman kubectl lè l sèvi avèk kle Tab la. Sa a ap travay pou kòmandman, opsyon, ak agiman, ki gen ladan yon bagay konplèks tankou non resous.

Gade ki jan fini kòmand kubectl travay:

Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye
Fini kòmand ap travay pou kokiy Bash ak Zsh.

Gid ofisyèl gen enstriksyon detaye pou mete kanpe otokonplesyon, men anba a nou pral bay yon ti ekstrè.

Ki jan fini lòd travay

Fini kòmand se yon karakteristik koki ki travay lè l sèvi avèk yon script fini. Yon script ekstansyon se yon script shell ki defini konpòtman an nan yon ekstansyon pou yon lòd espesifik.

Kubectl otomatikman jenere ak pwodui script ekstansyon pou Bash ak Zsh lè l sèvi avèk kòmandman sa yo:

$ kubectl completion bash

Или:

$ kubectl completion zsh

Nan teyori, li se ase konekte pwodiksyon an nan kòmandman sa yo nan koki kòmand ki apwopriye a pou ke kubectl ka konplete kòmandman yo.

На практике — способ подключения отличается для Bash (включая различия между Linux и MacOS) и Zsh. Ниже мы рассмотрим все эти варианты.

Bash в Linux

Script fini Bash la depann de pake bash-completion, kidonk ou bezwen enstale li an premye:

$ sudo apt-get install bash-completion

Или:

$ yum install bash-completion

Ou ka teste ke pake a enstale avèk siksè lè l sèvi avèk lòd sa a:

$ type _init_completion

Si sa a pwodwi kòd fonksyon koki, Lè sa a, bash-completion enstale kòrèkteman. Si kòmandman an bay yon erè "Pa jwenn", ou bezwen ajoute liy sa a nan dosye w la ~ / .bashrc:

$ source /usr/share/bash-completion/bash_completion

Èske li nesesè pou ajoute liy sa a nan dosye a ~ / .bashrc oswa ou pa depann de manadjè pake ou itilize pou enstale bash-completion. Sa nesesè pou APT, men se pa pou YUM.

Apre enstale bash-completion, ou bezwen konfigirasyon tout bagay pou ke script fini kubectl la pèmèt nan tout sesyon koki.

Youn nan fason yo fè sa se ajoute liy sa a nan dosye a ~ / .bashrc:

source <(kubectl completion bash)

Yon lòt fason se ajoute script ekstansyon kubectl nan anyè a /etc/bash_completion.d (kreye li si li pa egziste):

$ kubectl completion bash >/etc/bash_completion.d/kubectl

Tout scripts ajoute nan katalòg la /etc/bash_completion.d yo otomatikman enkli nan bash-completion.

Tou de opsyon yo egalman aplikab.

Apre rekòmanse koki a, fini lòd kubectl ap travay.

Bash sou MacOS

Sou MacOS konfigirasyon an se yon ti kras pi konplike. Reyalite a se ke pa default, MacOS itilize vèsyon Bash 3.2, ak script kubectl autocompletion mande pou yon vèsyon Bash nan omwen 4.1 epi li pa travay nan Bash 3.2.

Gen pwoblèm lisans ki asosye ak lè l sèvi avèk yon vèsyon demode nan Bash sou MacOS. Bash vèsyon 4 gen lisans anba GPLv3, ki pa sipòte pa Apple.

Pou konfigirasyon kubectl autocompletion sou MacOS, ou bezwen enstale yon vèsyon ki pi resan nan Bash. Ou kapab tou mete ajou Bash la kòm kokiy default ou a, ki pral sove ou anpil pwoblèm nan tan kap vini an. Li pa difisil, detay yo bay nan atik la "Mete ajou Bash sou MacOS'.

Anvan w kontinye, asire w ke w ap itilize yon dènye vèsyon Bash (tcheke pwodiksyon an bash --version).

Bash fini script varye selon pwojè bash-konplesyon, kidonk ou bezwen enstale li an premye.

Ou ka enstale bash-completion lè l sèvi avèk ombryou:

$ brew install bash-completion@2

Isit la @2 kanpe pou bash-completion vèsyon 2. kubectl otocompletion mande pou bash-completion v2, ak bash-completion v2 mande pou yon minimòm de Bash vèsyon 4.1.

Kòmand pwodiksyon brew-install gen yon seksyon Opozisyon, ki espesifye sa ki bezwen ajoute nan fichye a ~/.bash_profile:

export BASH_COMPLETION_COMPAT_DIR=/usr/local/etc/bash_completion.d
[[ -r "/usr/local/etc/profile.d/bash_completion.sh" ]] && . 
"/usr/local/etc/profile.d/bash_completion.sh"

Sepandan, mwen rekòmande pou ajoute liy sa yo pa ~/.bash_profile, ak nan ~/.bashrc. Nan ka sa a, autocompletion ap disponib pa sèlman nan prensipal la, men tou nan kokiy kòmand timoun yo.

Apre rekòmanse kokiy lòd la, ou ka verifye enstalasyon an kòrèk lè l sèvi avèk lòd sa a:

$ type _init_completion

Si ou wè yon fonksyon koki nan pwodiksyon an, Lè sa a, tout bagay se configuré kòrèkteman.

Koulye a, nou bezwen asire ke kubectl autocompletion pèmèt nan tout sesyon yo.

Youn nan fason yo se ajoute liy sa a nan ou ~/.bashrc:

source <(kubectl completion bash)

Dezyèm fason an se ajoute yon script autocomplete nan katab la /usr/local/etc/bash_completion.d:

$ kubectl completion bash
>/usr/local/etc/bash_completion.d/kubectl

Metòd sa a pral travay sèlman si ou enstale bash-completion lè l sèvi avèk Homebrew. Nan ka sa a, bash-completion chaje tout scripts nan anyè sa a.

Si ou enstale kubectl lè l sèvi avèk Homebrew, Lè sa a, pa gen okenn nesesite pou fè etap anvan an, depi script autocompletion yo pral otomatikman mete nan katab la. /usr/local/etc/bash_completion.d pandan enstalasyon. Nan ka sa a, kubectl autocompletion ap kòmanse travay le pli vit ke ou enstale bash-completion.

Kòm yon rezilta, tout opsyon sa yo ekivalan.

zsh

Scripts Autocompletion pou Zsh pa mande pou okenn depandans. Tout sa ou bezwen fè se pèmèt yo lè ou chaje kokiy lòd la.

Ou ka fè sa lè w ajoute yon liy sou ou ~/.zshrc dosye:

source <(kubectl completion zsh)

Si ou resevwa yon erè not found: compdef apre rekòmanse koki ou a, ou bezwen pèmèt fonksyon an entegre compdef. Ou ka pèmèt li lè w ajoute li nan kòmansman dosye w la ~/.zshrc sa yo:

autoload -Uz compinit
compinit

2. Byen vit wè espesifikasyon resous yo

Lè ou kreye definisyon resous YAML, ou bezwen konnen jaden yo ak siyifikasyon yo pou resous sa yo. Yon kote pou chèche enfòmasyon sa a se nan referans API, ki gen espesifikasyon konplè pou tout resous yo.

Sepandan, chanje nan navigatè entènèt la chak fwa ou bezwen fè rechèch pou yon bagay se konvenyan. Se poutèt sa, kubectl bay lòd la kubectl explain, ki montre espesifikasyon tout resous yo nan tèminal ou a.

Fòma lòd la se jan sa a:

$ kubectl explain resource[.field]...

Kòmandman an pral pwodwi spesifikasyon resous oswa jaden yo mande a. Enfòmasyon ki parèt idantik ak sa ki nan manyèl API a.

Pa default kubectl explain montre sèlman premye nivo nan nidifikasyon nan jaden.

Gade sa li sanble ka isit la.

Ou ka montre tout pye bwa a si ou ajoute opsyon a --recursive:

$ kubectl explain deployment.spec --recursive

Si ou pa konnen egzakteman ki resous ki nesesè, ou ka montre yo tout ak lòd sa a:

$ kubectl api-resources

Kòmand sa a montre non resous yo nan fòm pliryèl, pa egzanp. deployments olye pou yo deployment. Li montre tou non kout la, pou egzanp deploy, pou resous sa yo ki genyen li. Pa enkyete sou diferans sa yo. Tout opsyon nonmen sa yo ekivalan pou kubectl. Sa vle di, ou ka itilize nenpòt nan yo pou kubectl explain.

Tout kòmandman sa yo ekivalan:

$ kubectl explain deployments.spec
# или
$ kubectl explain deployment.spec
# или        
$ kubectl explain deploy.spec

3. Sèvi ak yon fòma pèsistans yap ogmante jiska kolòn personnalisé

Default fòma pwodiksyon lòd kubectl get:

$ kubectl get pods
NAME                     READY    STATUS    RESTARTS  AGE
engine-544b6b6467-22qr6   1/1     Running     0       78d
engine-544b6b6467-lw5t8   1/1     Running     0       78d
engine-544b6b6467-tvgmg   1/1     Running     0       78d
web-ui-6db964458-8pdw4    1/1     Running     0       78d

Fòma sa a pratik, men li gen yon kantite enfòmasyon limite. Konpare ak fòma definisyon resous konplè a, se sèlman kèk jaden ki parèt isit la.

Nan ka sa a, ou ka itilize yon fòma pèsistans yap ogmante jiska kolòn personnalisé. Li pèmèt ou detèmine ki done pou pwodiksyon an. Ou ka montre nenpòt jaden resous kòm yon kolòn separe.

Sèvi ak yon fòma koutim detèmine lè l sèvi avèk opsyon sa yo:

-o custom-columns=<header>:<jsonpath>[,<header>:<jsonpath>]...

Ou ka defini chak kolòn pwodiksyon kòm yon pè <header>:<jsonpath>kote <header> se non kolòn nan, epi <jsonpath> — yon ekspresyon ki defini yon jaden resous.

Ann gade nan yon egzanp senp:

$ kubectl get pods -o custom-columns='NAME:metadata.name'

NAME
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4

Pwodiksyon an gen yon kolòn ak non gous yo.

Ekspresyon opsyon an chwazi non gous yo nan jaden an metadata.name. Sa a se paske non gous la defini nan jaden non timoun lan metadata nan deskripsyon resous gous la. Ou ka jwenn plis detay nan Gid API oswa tape lòd la kubectl explain pod.metadata.name.

Koulye a, an n di ou vle ajoute yon kolòn siplemantè nan pwodiksyon an, pou egzanp montre ne chak gous ap kouri sou. Pou fè sa, ou ka tou senpleman ajoute spesifikasyon kolòn ki apwopriye a nan opsyon kolòn koutim yo:

$ kubectl get pods 
  -o custom-columns='NAME:metadata.name,NODE:spec.nodeName'

NAME                       NODE
engine-544b6b6467-22qr6    ip-10-0-80-67.ec2.internal
engine-544b6b6467-lw5t8    ip-10-0-36-80.ec2.internal
engine-544b6b6467-tvgmg    ip-10-0-118-34.ec2.internal
web-ui-6db964458-8pdw4     ip-10-0-118-34.ec2.internal

Ekspresyon an chwazi non ne a soti spec.nodeName — lè yo mete yon gous nan yon ne, non li ekri nan jaden an spec.nodeName spesifikasyon resous gous. Ou ka jwenn plis enfòmasyon detaye nan pwodiksyon an kubectl explain pod.spec.nodeName.

Tanpri sonje ke jaden resous Kubernetes yo sansib.

Ou ka wè nenpòt jaden resous kòm yon kolòn. Jis revize spesifikasyon resous la epi eseye li ak nenpòt jaden ou renmen.

Men, anvan, ann pran yon gade pi pre nan ekspresyon seleksyon jaden.

Ekspresyon JSONPath

Ekspresyon pou chwazi jaden resous yo baze sou JSONPath.

JSONPath se yon lang pou rekipere done ki soti nan dokiman JSON. Chwazi yon sèl jaden se ka itilizasyon ki pi senp pou JSONPath. Li gen anpil plis posiblite, ki gen ladan seleksyon, filtè ak sou sa.

Kubectl eksplike sipòte yon kantite limite nan karakteristik JSONPath. Yo dekri posiblite yo ak egzanp itilizasyon yo anba a:

# Выбрать все элементы списка
$ kubectl get pods -o custom-columns='DATA:spec.containers[*].image'
# Выбрать специфический элемент списка
$ kubectl get pods -o custom-columns='DATA:spec.containers[0].image'
# Выбрать элементы списка, попадающие под фильтр
$ kubectl get pods -o custom-columns='DATA:spec.containers[?(@.image!="nginx")].image'
# Выбрать все поля по указанному пути, независимо от их имени
$ kubectl get pods -o custom-columns='DATA:metadata.*'
# Выбрать все поля с указанным именем, вне зависимости от их расположения
$ kubectl get pods -o custom-columns='DATA:..image'

Operatè [] a espesyalman enpòtan. Anpil jaden resous Kubernetes yo se lis, ak operatè sa a pèmèt ou chwazi manm nan lis sa yo. Li souvan itilize ak yon joker tankou [*] pou chwazi tout eleman nan yon lis.

Egzanp aplikasyon yo

Posiblite yo pou itilize yon fòma pèsistans yap ogmante jiska kolòn personnalisé sont alkole, menm jan ou kapab afficher tout jaden ou combinaison de jaden resous nan pèsistans yap ogmante jiska. Men kèk aplikasyon echantiyon, men santi yo lib pou eksplore yo tèt ou epi jwenn aplikasyon ki travay pou ou.

  1. Montre imaj veso pou gous:
    $ kubectl get pods 
      -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'
    
    NAME                        IMAGES
    engine-544b6b6467-22qr6     rabbitmq:3.7.8-management,nginx
    engine-544b6b6467-lw5t8     rabbitmq:3.7.8-management,nginx
    engine-544b6b6467-tvgmg     rabbitmq:3.7.8-management,nginx
    web-ui-6db964458-8pdw4      wordpress

    Kòmand sa a montre non imaj veso yo pou chak gous.

    Sonje ke yon gous ka genyen plizyè resipyan, Lè sa a, non imaj yo pral parèt sou yon liy, separe pa vigil.

  2. Montre zòn disponiblite ne:
    $ kubectl get nodes 
      -o 
    custom-columns='NAME:metadata.name,ZONE:metadata.labels.failure-domain.beta.kubernetes.io/zone'
    
    NAME                          ZONE
    ip-10-0-118-34.ec2.internal   us-east-1b
    ip-10-0-36-80.ec2.internal    us-east-1a
    ip-10-0-80-67.ec2.internal    us-east-1b

    Kòmand sa a itil si gwoup ou a òganize nan yon nwaj piblik. Li montre zòn disponiblite pou chak ne.

    Zòn disponiblite se yon konsèp nwaj ki limite zòn replikasyon an nan yon rejyon jeyografik.

    Zòn disponiblite pou chak ne yo jwenn atravè yon etikèt espesyal - failure-domain.beta.kubernetes.io/zone. Si gwoup la ap kouri nan yon nwaj piblik, yo kreye etikèt sa a otomatikman epi ranpli ak non zòn disponiblite yo pou chak ne.

    Etikèt yo pa fè pati spesifikasyon resous Kubernetes, kidonk ou p ap jwenn enfòmasyon sou yo Gid API. Sepandan, yo ka wè (tankou nenpòt lòt etikèt) si ou mande enfòmasyon sou nœuds yo nan fòma YAML oswa JSON:

    $ kubectl get nodes -o yaml
    # или
    $ kubectl get nodes -o json

    Sa a se yon bon fason yo aprann plis sou resous, anplis aprann espesifikasyon resous yo.

4. Fasil chanje ant grap ak espas non

Lè kubectl fè yon demann nan API Kubernetes, li premye li fichye kubeconfig la pou jwenn tout paramèt ki nesesè pou koneksyon an.

Pa default dosye kubeconfig la se ~/.kube/config. Tipikman, dosye sa a kreye oswa mete ajou pa yon lòd espesyal.

Lè w ap travay ak plizyè gwoup, dosye kubeconfig ou a gen paramèt pou konekte ak tout gwoup sa yo. Ou bezwen yon fason pou di kòmandman kubectl ak ki gwoup w ap travay.

Nan yon gwoup, ou ka kreye plizyè espas non—yon kalite grap vityèl nan yon grap fizik. Kubectl detèmine tou ki espas non yo itilize ki baze sou dosye kubeconfig la. Sa vle di ou bezwen tou yon fason pou di kòmandman kubectl ki espas non pou travay avèk yo.

Nan chapit sa a nou pral eksplike kijan li fonksyone ak kijan pou fè li fonksyone byen.

Remake byen ke ou ka gen plizyè dosye kubeconfig ki nan lis nan varyab anviwònman KUBECONFIG la. Nan ka sa a, tout dosye sa yo pral konbine nan yon sèl konfigirasyon komen nan ègzekutabl. Ou kapab tou chanje dosye default kubeconfig la lè w kouri kubectl ak paramèt la --kubeconfig. Gade dokiman ofisyèl yo.

dosye kubeconfig yo

Ann wè ki sa egzakteman fichye kubeconfig la genyen:

Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye
Kòm ou ka wè, fichye kubeconfig la gen yon seri kontèks. Kontèks konsiste de twa eleman:

  • Cluster — API URL nan sèvè gwoup la.
  • Itilizatè - kalifikasyon otantifikasyon itilizatè nan gwoup la.
  • Espas non - espas non yo itilize lè w rantre nan gwoup la.

Nan pratik, yo souvan itilize yon kontèks pou chak gwoup nan kubeconfig yo. Sepandan, ou ka gen plizyè kontèks pou chak gwoup, diferansye pa itilizatè oswa espas non. Sepandan, konfigirasyon milti-kontèks sa a pa komen, kidonk gen anjeneral yon kat youn-a-yon ant grap ak kontèks.

Nan nenpòt moman, youn nan kontèks yo se aktyèl:

Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye
Lè kubectl li yon fichye konfigirasyon, li toujou pran enfòmasyon ki soti nan kontèks aktyèl la. Nan egzanp ki anwo a, kubectl pral konekte ak gwoup Hare la.

An konsekans, pou chanje nan yon lòt gwoup, ou bezwen chanje kontèks aktyèl la nan fichye kubeconfig la:

Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye
Koulye a, kubectl pral konekte ak gwoup Fox la.

Pou chanje nan yon espas non diferan nan menm gwoup la, ou bezwen chanje valè eleman espas non an pou kontèks aktyèl la:

Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye
Nan egzanp ki anwo a, kubectl pral sèvi ak espas non Prod gwoup Fox la (anvan yo te mete espas non Tès la).

Remake byen ke kubectl bay opsyon tou --cluster, --user, --namespace и --context, ki pèmèt ou ranplase eleman endividyèl yo ak kontèks aktyèl la tèt li, kèlkeswa sa ki mete nan kubeconfig la. Gade kubectl options.

Nan teyori, ou ka manyèlman chanje anviwònman yo nan kubeconfig la. Men, li enkonvenyan. Pou senplifye operasyon sa yo, gen divès kalite sèvis piblik ki pèmèt ou chanje paramèt otomatikman.

Sèvi ak kubectx

Yon sèvis piblik trè popilè pou chanje ant grap ak espas non.

Sèvis piblik la bay kòmandman kubectx и kubens pou chanje kontèks aktyèl la ak espas non respektivman.

Kòm mansyone, chanje kontèks aktyèl la vle di chanje gwoup la si ou gen sèlman yon kontèks pou chak gwoup.

Men yon egzanp sou kouri kòmandman sa yo:

Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye
Esansyèlman, kòmandman sa yo tou senpleman edite fichye kubeconfig la jan sa dekri anwo a.

enstale kubectx, swiv enstriksyon yo sou Github.

Tou de kòmand yo sipòte otokonplesyon nan kontèks ak non espas non, ki elimine nesesite pou tape yo nèt. Enstriksyon pou mete kanpe otokonplesyon isit la.

Yon lòt karakteristik itil kubectx se mòd entèaktif. Li travay ansanm ak sèvis piblik la fzf, ki dwe enstale separeman. Enstale fzf otomatikman fè mòd entèaktif disponib nan kubectx. Entèaktif, ou ka chwazi kontèks ak espas non atravè koòdone rechèch entèaktif gratis fzf bay.

Sèvi ak alyas kokiy

Ou pa bezwen zouti separe pou chanje kontèks aktyèl la ak espas non paske kubectl bay kòmandman pou sa a tou. Wi, ekip kubectl config bay soukòmand pou edite fichye kubeconfig.

Men kèk nan yo:

  • kubectl config get-contexts: montre tout kontèks;
  • kubectl config current-context: jwenn kontèks aktyèl la;
  • kubectl config use-context: chanje kontèks aktyèl la;
  • kubectl config set-context: Chanje eleman kontèks la.

Sepandan, lè l sèvi avèk kòmandman sa yo dirèkteman pa trè pratik paske yo long. Ou ka fè alyas koki pou yo ki fasil pou egzekite.

Mwen te kreye yon seri alyas ki baze sou kòmandman sa yo ki bay fonksyonalite ki sanble ak kubectx. Isit la ou ka wè yo an aksyon:

Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye
Remake byen ke alyas itilize fzf pou bay yon koòdone rechèch entèaktif gratis (tankou mòd entèaktif kubectx a). Sa vle di ou bezwen enstale fzfpou itilize alyas sa yo.

Men definisyon alyas tèt yo:

# Получить текущий контекст
alias krc='kubectl config current-context'
# Список всех контекстов
alias klc='kubectl config get-contexts -o name | sed "s/^/  /;|^  $(krc)$|s/ /*/"'
# Изменить текущий контекст
alias kcc='kubectl config use-context "$(klc | fzf -e | sed "s/^..//")"'

# Получить текущее пространство имен
alias krn='kubectl config get-contexts --no-headers "$(krc)" | awk "{print $5}" | sed "s/^$/default/"'
# Список всех пространств имен
alias kln='kubectl get -o name ns | sed "s|^.*/|  |;|^  $(krn)$|s/ /*/"'
# Изменить текущее пространство имен
alias kcn='kubectl config set-context --current --namespace "$(kln | fzf -e | sed "s/^..//")"'

Pou mete alyas sa yo ou bezwen ajoute definisyon ki anwo yo nan dosye w la ~/.bashrc oswa ~/.zshrc epi rekòmanse kokiy ou a.

Sèvi ak grefon

Kubectl pèmèt ou chaje grefon ki egzekite menm jan ak kòmandman debaz yo. Ou ka, pou egzanp, enstale plugin kubectl-foo a epi kouri li pa egzekite lòd la kubectl foo.

Li ta bon pou chanje kontèks la ak espas non an nan fason sa a, pou egzanp pa kouri kubectl ctx pou chanje kontèks ak kubectl ns pou chanje espas non an.

Mwen te ekri de grefon ki fè sa:

Travay grefon yo baze sou alyas nan seksyon anvan an.

Men ki jan yo travay:

Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye
Remake byen ke grefon yo itilize fzf pou bay yon koòdone rechèch entèaktif gratis (tankou mòd entèaktif kubectx a). Sa vle di ou bezwen enstale fzfpou itilize alyas sa yo.

Pou enstale grefon, ou bezwen telechaje scripts koki yo te rele kubectl-ctx и kubectl-ns nan nenpòt anyè nan varyab PATH ou a epi fè yo ègzekutabl ak egzanp. chmod +x. Touswit apre sa ou pral kapab itilize kubectl ctx и kubectl ns.

5. redwi D' ak autoaliases

Alyas Shell yo se yon bon fason pou pi vit tape. Pwojè kubectl-alyas gen apeprè 800 rakoursi pou kòmandman kubectl debaz yo.

Ou ta ka mande - ki jan ou sonje 800 alyas? Men, ou pa bezwen sonje yo tout, paske yo bati dapre yon konplo senp, ki bay anba a:

Ki jan yo sèvi ak kubectl pi efikas: yon gid detaye
Pou egzanp:

  1. kgpooyaml - kubectl jwenn gous oyaml
  2. ksysgsvcw — kubectl -n kube-system jwenn svc w
  3. ksysrmcm -kubectl -n kube-system rm cm
  4. kgdepallsl - kubectl jwenn deplwaman tout sl

Kòm ou ka wè, alyas yo fèt ak eleman, chak nan yo ki reprezante yon eleman espesifik nan lòd la kubectl. Chak alyas ka gen yon sèl eleman pou kòmandman baz, operasyon, ak resous, ak plizyè eleman pou paramèt. Ou tou senpleman "peple" eleman sa yo de goch a dwat dapre dyagram ki anwo a.

Dyagram detaye aktyèl la se nan GitHub. Se la ou ka jwenn tou lis konplè alyas yo.

Pou egzanp, alyas kgpooyamlall ekivalan a kòmandman an kubectl get pods -o yaml --all-namespaces.

Lòd relatif opsyon yo pa enpòtan: lòd kgpooyamlall ekivalan a kòmandman an kgpoalloyaml.

Ou pa bezwen sèvi ak tout eleman kòm alyas. Pa egzanp k, kg, klo, ksys, kgpo ka itilize tou. Anplis, ou ka konbine alyas ak kòmandman regilye oswa opsyon sou liy lòd la:

Pou egzanp:

  1. Olye pou yo kubectl proxy ou ka ekri k proxy.
  2. Olye pou yo kubectl get roles ou ka ekri kg roles (kounye a pa gen okenn alyas pou resous Wòl yo).
  3. Pou jwenn done pou yon gous espesifik, ou ka itilize kòmandman an kgpo my-pod — kubectl get pod my-pod.

Tanpri sonje ke kèk alyas mande pou yon agiman liy lòd. Pou egzanp, alyas kgpol vle di kubectl get pods -l. Opsyon -l mande pou yon agiman - yon spesifikasyon etikèt. Si ou itilize yon alyas li pral sanble kgpol app=ui.

Paske gen kèk alyas ki mande agiman, yo dwe itilize alyas a, f ak l an dènye.

An jeneral, yon fwa ou jwenn pann nan konplo sa a, ou ka entwitif dériver alyas nan kòmandman yo ou vle egzekite epi sove anpil tan tape.

Enstalasyon

Pou enstale kubectl-aliases, ou bezwen telechaje fichye a .kubectl_aliases soti nan GitHub epi mete li nan dosye a ~/.bashrc oswa ~/.zshrc:

source ~/.kubectl_aliases

Konplete otomatik

Kòm nou te di anvan, ou souvan ajoute mo adisyonèl nan yon alyas sou liy lòd la. Pa egzanp:

$ kgpooyaml test-pod-d4b77b989

Si ou itilize fini kòmand kubectl, pwobableman ou te itilize otokonplesyon pou bagay tankou non resous yo. Men, èske sa ka fè lè yo itilize alyas?

Sa a se yon kesyon trè enpòtan paske si autocompletion pa travay, ou pral pèdi kèk nan benefis ki genyen nan alyas.

Repons lan depann de ki kokiy w ap itilize:

  1. Pou Zsh, fini alyas travay soti nan bwat la.
  2. Pou Bash, malerezman, gen kèk travay oblije jwenn otokonplesyon travay.

Pèmèt autocompletion pou alyas nan Bash

Pwoblèm nan ak Bash se ke li eseye ranpli (chak fwa ou peze Tab) alyas la, pa kòmandman ke alyas la refere a (tankou Zsh fè, pou egzanp). Kòm ou pa gen scripts fini pou tout 800 alyas, otocompletion pa travay.

Pwojè konplè-alyas bay yon solisyon jeneral nan pwoblèm sa a. Li konekte ak mekanis fini pou alyas, entènman elaji alyas la nan yon lòd, epi retounen opsyon fini pou kòmandman an ranpli. Sa vle di ke padding pou yon alyas konpòte egzakteman menm jan ak yon kòmandman konplè.

Nan sa ki annapre yo, mwen pral premye eksplike ki jan yo enstale complete-alias ak Lè sa a, ki jan yo configured li pou pèmèt fini pou tout alyas kubectl.

Enstale complete-alias

Premye a tout, konplè-alyas depann sou bash-konplesyon. Поэтому перед установкой complete-alias необходимо убедиться, что bash-completion установлен. Инструкции по установке были даны ранее для Linux и MacOS.

Nòt enpòtan pou itilizatè MacOS: Menm jan ak script kubectl autocompletion, complete-alias pa travay ak Bash 3.2, ki se default sou MacOS. An patikilye, alyas konplè depann sou bash-completion v2 (brew install bash-completion@2), ki mande pou omwen Bash 4.1. Sa vle di ke pou itilize alyas konplè sou MacOS ou bezwen enstale yon vèsyon pi nouvo nan Bash.

Ou bezwen telechaje script la bash_completion.sh nan Repozitwa GitHub epi mete li nan dosye w la ~/.bashrc:

source ~/bash_completion.sh

Apre rdemare koki a, konplè-alias yo pral konplètman enstale.

Pèmèt autocompletion pou alyas kubectl

Teknikman konplè-alias bay yon fonksyon wrapper _complete_alias. Fonksyon sa a tcheke alyas la epi retounen sijesyon pou konplete kòmandman alyas la.

Pou asosye yon fonksyon ak yon alyas espesifik, ou bezwen sèvi ak mekanis Bash bati-an konplete, pou enstale _complete_alias kòm yon fonksyon fini alyas.

Kòm yon egzanp, ann pran alyas k a, ki vle di kòmand nan kubectl. enstale _complete_alias Kòm yon fonksyon konpleman pou alyas sa a, ou ta dwe kouri lòd sa a:

$ complete -F _complete_alias k

Rezilta a se ke chak fwa ou ranpli otomatikman yon alyas k, yo rele fonksyon an _complete_alias, ki tcheke alyas la epi retounen sijesyon pou konplete lòd la kubectl.

Kòm yon dezyèm egzanp, ann pran alyas la kg, ki vle di kubectl get:

$ complete -F _complete_alias kg

Jis tankou nan egzanp anvan an, lè ou ranpli otomatikman kg, ou jwenn menm sijesyon yo fini ke ou ta jwenn pou kubectl get.

Remake byen ke ou ka itilize complete-alias pou nenpòt alyas sou sistèm ou an.

Se poutèt sa, pou pèmèt autocompletion pou tout alyas kubectl, ou bezwen kouri lòd ki anwo a pou chak nan yo. Frag ki anba la a fè egzakteman sa a, depi ou te mete kubectl-alyas yo ~/.kubectl-aliases:

for _a in $(sed '/^alias /!d;s/^alias //;s/=.*$//' ~/.kubectl_aliases); 
do
  complete -F _complete_alias "$_a"
done

Moso kòd sa a bezwen mete nan ou ~/.bashrc, rekòmanse kokiy lòd la ak otokonplesyon ap vin disponib pou tout 800 alyas kubectl.

6. Pwolonje kubectl ak grefon

Kòmanse nan vèsyon 1.12, kubectl sipòte mekanis plugin, ki pèmèt ou elaji fonksyon li yo ak kòmandman adisyonèl.

Si ou abitye ak Mekanis plugin Git, Lè sa a, grefon kubectl yo bati sou menm prensip la.

Nan chapit sa a, nou pral kouvri ki jan yo enstale grefon, ki kote yo jwenn yo, ak ki jan yo kreye grefon pwòp ou yo.

Enstale grefon

Plugins Kubectl yo distribye kòm senp dosye ègzèkutabl ak non an tankou kubectl-x. Prefiks kubectl- se obligatwa, ki te swiv pa yon nouvo soukòmand kubectl ki pèmèt ou rele Plugin la.

Pa egzanp, plugin alo a pral distribye kòm yon dosye ki rele kubectl-hello.

Pou enstale Plugin la, ou bezwen kopye fichye a kubectl-x nan nenpòt anyè nan PATH ou a epi fè li ègzekutabl, pou egzanp avèk chmod +x. Touswit apre sa ou ka rele plugin a ak kubectl x.

Ou ka itilize lòd sa a pou lis tout grefon ki enstale kounye a sou sistèm ou a:

$ kubectl plugin list

Kòmand sa a pral montre tou avètisman si ou gen plizyè grefon ak menm non an, oswa si gen yon dosye grefon ki pa ègzèkutabl.

Jwenn ak enstale grefon lè l sèvi avèk Krew

Plugins Kubectl yo ka pataje oswa itilize ankò tankou pakè lojisyèl. Men, ki kote ou ka jwenn grefon ke lòt moun te pataje?

Pwojè Krew vize bay yon solisyon inifye pou pataje, rechèch, enstale ak jere grefon kubectl. Pwojè a rele tèt li yon "manadjè pake pou grefon kubectl" (Krew se menm jan ak enfuzyon).

Krew se yon lis grefon kubectl ke ou ka chwazi epi enstale. An menm tan an, Krew se tou yon plugin pou kubectl.

Sa vle di ke enstale Krew travay esansyèlman tankou enstale nenpòt lòt plugin kubectl. Ou ka jwenn enstriksyon detaye nan Paj GitHub.

Kòmandman Krew ki pi enpòtan yo se:

# Поиск в списке плагинов
$ kubectl krew search [<query>]
# Посмотреть информацию о плагине
$ kubectl krew info <plugin>
# Установить плагин
$ kubectl krew install <plugin>
# Обновить все плагины до последней версии
$ kubectl krew upgrade
# Посмотреть все плагины, установленные через Krew
$ kubectl krew list
# Деинсталлировать плагин
$ kubectl krew remove <plugin>

Tanpri sonje ke enstale grefon lè l sèvi avèk Krew pa entèfere ak enstale grefon lè l sèvi avèk metòd estanda ki dekri pi wo a.

Tanpri sonje ke kòmandman an kubectl krew list sèlman montre grefon ki te enstale lè l sèvi avèk Krew, tandiske kòmandman an kubectl plugin list lis tout grefon, se sa ki enstale lè l sèvi avèk Krew ak sa ki enstale pa lòt metòd.

Jwenn Plugins yon lòt kote

Krew se yon pwojè jèn, kounye a nan li lis la sèlman apeprè 30 grefon. Si ou pa ka jwenn sa ou bezwen, ou ka jwenn grefon yon lòt kote, tankou GitHub.

Mwen rekòmande gade nan seksyon GitHub la kubectl-plugins. La ou pral jwenn plizyè douzèn grefon ki disponib ki vo tcheke deyò.

Ekri pwòp grefon ou yo

ou kapab tèt ou kreye grefon - Li pa difisil. Ou bezwen kreye yon ègzèkutabl ki fè sa ou bezwen, non li tankou kubectl-x epi enstale jan sa dekri anwo a.

Fichye a ta ka yon script bash, yon script python, oswa yon aplikasyon GO konpile - li pa enpòtan. Sèl kondisyon an se ke li ka dirèkteman egzekite nan sistèm nan fonksyone.

Ann kreye yon egzanp plugin kounye a. Nan seksyon anvan an, ou te itilize kòmandman kubectl pou lis resipyan yo pou chak gous. Li fasil pou vire kòmandman sa a nan yon plugin ke ou ka rele ak egzanp. kubectl img.

Kreye yon fichye kubectl-img kontni sa a:

#!/bin/bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image'

Koulye a, fè dosye a ègzèkutabl ak chmod +x kubectl-img epi deplase li nan nenpòt anyè nan PATH ou a. Touswit apre sa ou ka itilize plugin a kubectl img.

Kòm mansyone, grefon kubectl ka ekri nan nenpòt lang pwogramasyon oswa scripting. Si w ap itilize scripts kokiy, avantaj ki genyen pou w ka rele fasil kubectl nan Plugin la. Sepandan, ou ka ekri grefon pi konplèks nan lang pwogramasyon reyèl lè l sèvi avèk Bibliyotèk kliyan Kubernetes. Si w ap itilize Go, ou ka itilize tou cli-runtime bibliyotèk, ki egziste espesyalman pou ekri grefon kubectl.

Ki jan yo pataje grefon ou yo

Si ou panse grefon ou yo ka itil lòt moun, santi yo lib pou pataje li sou GitHub. Asire w ou ajoute yo nan sijè a kubectl-plugins.

Ou ka mande tou pou ajoute plugin ou a Krew lis. Enstriksyon sou kijan pou fè sa a se nan Repozitwa GitHub.

Kòmandman fini

Plugins pa sipòte kounye a otokonplesyon. Sa vle di, ou dwe antre non konplè plugin a ak non plen agiman yo.

GitHub kubectl depo pou fonksyon sa a genyen demann ouvè. Se konsa, li posib ke karakteristik sa a pral aplike nenpòt moman nan tan kap vini an.

Bon chans!!!

Ki lòt bagay pou li sou sijè a:

  1. Twa nivo autoscaling nan Kubernetes ak kijan pou itilize yo efektivman.
  2. Kubernetes nan lespri piratri ak yon modèl aplikasyon.
  3. Chanèl nou an alantou Kubernetes nan Telegram.

Sous: www.habr.com

Achte hosting serye pou sit ki gen pwoteksyon DDoS, sèvè VPS VDS 🔥 Achte yon hébergement sit entènèt serye ak pwoteksyon DDoS, sèvè VPS VDS | ProHoster