
Ha Kubernetes-szel dolgozik, akkor valószínűleg a kubectl az egyik leggyakrabban használt eszköze. Valahányszor sok időt tölt egy adott eszközzel, érdemes alaposan megismerni és hatékonyan használni azt.
A parancs A cikket Daniel Weibel fordította, ahol tippeket és trükköket talál a kubectl hatékony használatához. Ez a cikk segít mélyebben megérteni a Kubernetes működését is.
A szerző elmondása szerint a cikk célja, hogy a Kubernetes-szel végzett napi munkáját ne csak hatékonyabbá, hanem élvezetesebbé is tegye!
Bevezetés: mi az a kubectl
Mielőtt megtanulná, hogyan használja a kubectl-t hatékonyabban, alapvető megértéssel kell rendelkeznie arról, hogy mi is az, és hogyan működik.
Felhasználói szempontból a kubectl egy vezérlőpult, amely lehetővé teszi a Kubernetes műveletek végrehajtását.
Technikai szempontból a kubectl a Kubernetes API ügyfélszoftvere.
A Kubernetes API egy HTTP REST API. Ez az API a Kubernetes valódi felhasználói felülete, amelyen keresztül teljes körűen irányítható. Ez azt jelenti, hogy minden Kubernetes művelet API végpontként jelenik meg, és HTTP-kéréssel végrehajtható ezen a végponton.
Ennek következtében a kubectl alapvető feladata HTTP-kérések küldése a Kubernetes API-hoz:

A Kubernetes egy teljesen erőforrás-orientált rendszer. Ez azt jelenti, hogy fenntartja az erőforrások belső állapotát, és minden Kubernetes művelet CRUD művelet.
Teljes mértékben irányítja a Kubernetes-t az erőforrások kezelése révén, és a Kubernetes az erőforrások aktuális állapota alapján dönti el, hogy mit tegyen. Ezért a Kubernetes API hivatkozása az erőforrástípusok és a hozzájuk kapcsolódó műveletek listájaként van megszervezve.
Nézzük meg a példát.
Tegyük fel, hogy létre szeretne hozni egy ReplicaSet erőforrást. Ehhez leírja a ReplicaSet-et egy nevű fájlban, replicaset.yaml, majd futtatja a parancsot:
$ kubectl create -f replicaset.yamlEnnek eredményeként létrejön a ReplicaSet erőforrás. De mi történik a színfalak mögött?
A Kubernetes rendelkezik a ReplicaSet létrehozási műveletével. Mint minden más művelet, ez is API végpontként érhető el. Az e művelethez tartozó konkrét API végpont a következőképpen néz ki:
POST /apis/apps/v1/namespaces/{namespace}/replicasetsA Kubernetes összes műveletének API végpontjait a tudja meg, beleértve ). A végső hívás végrehajtásához először hozzá kell adni az API szerver URL-jét a végpontokhoz, amelyek az API kézikönyvében találhatók.
Ezért amikor a fenti parancsot végrehajtjuk, a kubectl HTTP POST kérést küld a fenti API végponthoz. A ReplicaSet definíció, amelyet a fájlban megadtál, replicaset.yaml, a kérés törzsében kerül továbbításra.
Ez a kubectl működése minden parancsnál, amely a Kubernetes klaszterrel interakcióba lép. Minden ilyen esetben a kubectl egyszerűen HTTP kéréseket küld a megfelelő Kubernetes API végpontokra.
Fontos megjegyezni, hogy a Kubernetes teljes mértékben kezelhető olyan eszközökkel, mint a curl, manuálisan HTTP kéréseket küldve a Kubernetes API-ba. A kubectl egyszerűsíti a Kubernetes API használatát.
Ezek a kubectl alapjai és működése. De van még valami, amit minden kubectl felhasználónak tudnia kell a Kubernetes API-ról. Nézzük meg röviden a Kubernetes belső világát.
A Kubernetes belső világa
A Kubernetes egy független komponensek gyűjteménye, amelyek külön folyamatként futnak a klaszter csomópontjain. Néhány komponens a fő csomópontokon működik, mások a munkacsomópontokon, és minden komponensnek megvan a saját specifikus feladata.
Itt vannak a legfontosabb komponensek a fő csomópontokon:
- Tároló — tárolja a források definícióit ().
- API szerver — biztosítja az API-t és kezeli a tárolást.
- Vezérlő diszpécser — garantálja, hogy a források állapotai megfeleljenek a specifikációknak.
- Scheduler — ütemezi a podokat a munkacsomópontokon.
És itt van a legfontosabb komponens a munkacsomópontokon:
- A Kubelet — kezeli a konténerek indítását a munkacsomóponton.
Ahhoz, hogy megértsük, hogyan működnek együtt ezek a komponensek, nézzünk egy példát.
Tegyük fel, hogy éppen most hajtottad végre a kubectl create -f replicaset.yamlparancsot, ezután a kubectl HTTP POST kérést küldött a (átadva a ReplicaSet erőforrás definícióját).
Mi történik a klaszterben?
- A végrehajtás után
kubectl create -f replicaset.yamlaz API szerver elmenti a ReplicaSet erőforrásod definícióját a tárolóba:
- Ezután a ReplicaSet vezérlő elindul a vezérlő diszpécserben, amely kezeli a ReplicaSet erőforrások létrehozását, módosítását és törlését:

- A ReplicaSet vezérlő létrehozza a pod definíciót minden ReplicaSet replikához (a ReplicaSet definícióban található pod mintájának megfelelően) és elmenti őket a tárolóba:

- Elindul a tervező, amely figyeli azokat a podokat, amelyek még nem lettek hozzárendelve egyetlen munkacsoporthoz sem:

- A tervező kiválasztja a megfelelő munkacsoportot minden egyes pod számára, és hozzáadja ezt az információt a pod definiálásához a tárolóban:

- A munkacsoporton, amelyhez a podot hozzárendelték, elindul a Kubelet, amely figyeli az ehhez a munkacsoporthoz rendelt podokat:

- A Kubelet beolvassa a pod definícióját a tárolóból, és parancsokat ad a konténerfuttató környezetnek, mint például a Docker, a konténerek indítására a munkacsoporton:

Alább olvasható ennek a leírásnak a szöveges változata.
Az API végponthoz küldött kérés a ReplicaSet létrehozásához az API szerver által kerül feldolgozásra. Az API szerver hitelesíti a kérést és elmenti a ReplicaSet erőforrás-definíciót a tárolóba.
Ez az esemény elindítja a ReplicaSet vezérlőt, amely a vezérlőmenedzser alfolyamataként működik. A ReplicaSet vezérlő figyel a ReplicaSet erőforrások létrehozására, frissítésére és törlésére a tárolóban, és értesítést kap arról, amikor ez megtörténik.
A ReplicaSet vezérlő feladata, hogy biztosítsa, hogy a megfelelő számú pod létezzen a ReplicaSet másolataiból. A mi példánkban jelenleg nincsenek podok, ezért a ReplicaSet vezérlő létrehozza ezeket a pod-definíciókat (a ReplicaSet definíciójában szereplő pod-sablon szerint) és elmenti őket a tárolóba.
Az új podok létrehozása elindítja a tervezőt, amely figyeli a pod-definíciókat, amelyek még nem lettek ütemezve munkacsoportokhoz. A tervező kiválasztja a megfelelő munkacsoportot minden egyes pod számára és frissíti a pod-definíciókat a tárolóban.
Vegye figyelembe, hogy eddig a pillanatig sehol a klaszterben nem futott munkafolyamat-kód. Amit eddig tettek, — az a tároló erőforrásainak létrehozása és frissítése volt a fő csomóponton.
Az utolsó esemény elindítja a Kubeletet, amelyek figyelik a munkacsoportokhoz ütemezett podokat. A ReplicaSet podjaival rendelkező munkacsoport Kubeletjének utasítást kell adnia a konténerfuttató környezetnek, mint például a Docker, a szükséges konténerképek letöltésére és elindítására.
Most végre elindult a ReplicaSet alkalmazása!
A Kubernetes API szerepe
Ahogy azt a korábbi példában látták, a Kubernetes komponensek (az API szerver és a tároló kivételével) figyelik a tárolóban lévő erőforrások változásait, és módosítják az erőforrásokkal kapcsolatos információkat a tárolóban.
Természetesen ezek az összetevők nem lépnek közvetlen kapcsolatba a tárolóval, csak a Kubernetes API-n keresztül.
Tekintsük a következő példákat:
- A ReplicaSet vezérlő az API végpontot használja a
figyelésaz ReplicaSet erőforrások változásainak figyelésére. - A ReplicaSet vezérlő az API végpontot használja (pod létrehozása) podok létrehozására.
- A tervező az API végpontot használja (pod módosítása) podok frissítésére a kiválasztott munkanód információival.
Ahogy látja, ez ugyanaz az API, amelyhez a kubectl fordul. Ugyanannak az API-nak a használata, amelyet a belső összetevők és a külső felhasználók is használnak, a Kubernetes tervezésének alapvető elve.
Most összefoglalhatjuk, hogyan működik a Kubernetes:
- A tároló megőrzi az állapotot, vagyis a Kubernetes erőforrásait.
- Az API szerver interfészt biztosít a tárolóhoz a Kubernetes API formájában.
- Minden egyéb összetevő és a Kubernetes felhasználói az API-n keresztül olvassák, figyelik és manipulálják a Kubernetes állapotát (erőforrásait).
Ezeknek a fogalmaknak a megismerése segít jobban megérteni a kubectl-t és kihasználni annak előnyeit.
Most nézzük meg a konkrét tippek és trükkök sorozatát, amelyek javíthatják a kubectl-lal való munkát.
1. A bemeneti sebesség növelése a parancsok kiegészítésével
Az egyik leghasznosabb, de gyakran figyelmen kívül hagyott módszer a kubectl teljesítményének növelésére a parancsok automatikus kiegészítése.
A parancsok kiegészítése lehetővé teszi a kubectl parancsok egyes részeinek automatikus kitöltését a Tab billentyű megnyomásával. Ez működik a részparancsok, opciók és érvek esetében is, beleértve az olyan összetett neveket is, mint az erőforrások nevei.
Nézze meg, hogyan működik a kubectl parancsok kiegészítése:

A parancsok kiegészítése működik a Bash és Zsh parancssorok számára.
részletes utasításokat tartalmaz az automatikus kiegészítés beállítására, de az alábbiakban egy rövid kivonatot adunk.
Hogyan működik a parancsok kiegészítése
A parancsok kiegészítése egy shell funkció, amely a kiegészítő szkript segítségével működik. A kiegészítő szkript egy shell szkript, amely meghatározza a kiegészítés viselkedését egy adott parancs esetében.
A kubectl automatikusan generálja és kimeneti a kiegészítő szkripteket Bash és Zsh számára a következő parancsokkal:
$ kubectl completion bashxargs --show-limits
$ kubectl completion zshElméletileg elegendő, ha ezeket a parancsokat az adott parancssorhoz csatolják, hogy a kubectl képes legyen kiegészíteni a parancsokat.
A gyakorlatban a csatlakozási mód eltér a Bash (beleértve a Linux és MacOS közötti különbségeket) és Zsh esetében. Az alábbiakban mindezeket a lehetőségeket áttekintjük.
Bash Linuxban
A Bash kiegészítő script a bash-completion csomagtól függ, ezért először ezt kell telepíteni:
$ sudo apt-get install bash-completionxargs --show-limits
$ yum install bash-completionTesztelheti, hogy a csomag sikeresen telepítve lett a következő parancs segítségével:
$ type _init_completion Ha a parancs kimenetében a shell függvény kódja jelenik meg, akkor a bash-completion helyesen van telepítve. Ha a parancs ‚Nem található‘ hibát ad, hozzá kell adni a következő sort a fájlhoz ~ /.bashrc:
$ source /usr/share/bash-completion/bash_completion Hozzá kell-e adni ezt a sort a fájlhoz ~ /.bashrc vagy sem, az attól függ, hogy melyik csomagkezelőt használta a bash-completion telepítéséhez. Az APT esetében ez szükséges, a YUM esetében nem.
A bash-completion telepítése után mindent úgy kell beállítani, hogy a kubectl kiegészítő script minden shell munkamenetben bekapcsolva legyen.
Az egyik módszer ennek elérésére, hogy hozzáadja a következő sort a fájlhoz ~ /.bashrc:
source <(kubectl completion bash) A másik lehetőség, hogy a kubectl kiegészítő scriptet a következő könyvtárba helyezi /etc/bash_completion.d (hozza létre, ha nem létezik):
$ kubectl completion bash >/etc/bash_completion.d/kubectl Minden kiegészítő script automatikusan be lesz töltve a bash-completion könyvtárba. /etc/bash_completion.d Mindkét lehetőség egyaránt alkalmazható.
A shell újraindítása után a kubectl parancsok autocompletion működni fog.
Bash MacOS-ban
MacOS-ban a beállítás kicsit bonyolultabb. Az a helyzet, hogy alapértelmezés szerint a MacOS 3.2-es verziójú Bash-t használ, míg a kubectl autocompletion script legalább 4.1-es verziót igényel, és nem működik a 3.2-es Bash-ban.
A MacOS-ban használt elavult Bash verzió kérdései a licencel kapcsolatosak. A 4-es verziójú Bash GPLv3 licensz alatt terjed, amelyet az Apple nem támogat.
A kubectl autocompletion beállításához MacOS-ban újabb Bash verziót kell telepítenie. Emellett az új Bash verziót alapértelmezett shellként is beállíthatja, így a jövőben számos problémát elkerülhet. Ez nem bonyolult, a részletek a „
Bash frissítése MacOS-ban».
bash --version A Bash autocompletion script a).
bash-completion A bash-completion telepítéséhez használhatja a
Homebrew :
$ brew install bash-completion@2 Itt @2 a bash-completion 2 verzióját jelenti. A kubectl automatikus kiegészítése a bash-completion v2-t igényli, a bash-completion v2 pedig legalább 4.1-es Bash verziót követel meg.
A parancs kimenete brew-telepítés tartalmaz egy Caveats szekciót, amelyben meg van adva, hogy mit kell hozzáadni a fájlhoz ~/.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" Javaslom, hogy ezeket a sorokat ne a ~/.bash_profile, míg a ~/.bashrc. Így az automatikus kiegészítés a fő és az alparancssorokban is elérhető lesz.
A parancssor újraindítása után az alábbi parancs segítségével ellenőrizheti a beállítások helyességét:
$ type _init_completionHa a kimenetben shell-funkciót lát, akkor minden rendben van beállítva.
Most biztosítani kell, hogy a kubectl automatikus kiegészítése minden munkamenetben aktív legyen.
Az egyik lehetőség, hogy következő sort hozzáadja a ~/.bashrc:
source <(kubectl completion bash) A másik módszer, hogy az automatikus kiegészítő skriptet a mappába helyezi /usr/local/etc/bash_completion.d:
$ kubectl completion bash
/usr/local/etc/bash_completion.d/kubectlEz a módszer csak abban az esetben működik, ha a bash-completion-t Homebrew segítségével telepítette. Ebben az esetben a bash-completion betölti az összes skriptet ebből a könyvtárból.
Ha a , akkor nem szükséges a korábbi lépést végrehajtania, mivel az automatikus kiegészítő skript automatikusan a /usr/local/etc/bash_completion.d telepítése során kerül elhelyezésre. Ebben az esetben a kubectl automatikus kiegészítése azonnal működni kezd, amint telepítette a bash-completion-t.
Végül ezek a lehetőségek mind egyenértékűek.
Zsh-t
A Zsh automatikus kiegészítő skripteknek nincsenek függőségeik. Csak annyira van szükség, hogy betöltsük őket a parancssor indításakor.
Ezt megteheti, ha hozzáad egy sort a ~/.zshrc fájlhoz:
source <(kubectl completion zsh) Ha hibaüzenetet kapott not found: compdef a parancssor újraindítása után, akkor be kell kapcsolnia a beépített funkciót compdef. Ezt a fájlja elejére való hozzáadásával aktiválhatja. ~/.zshrc a következőket:
autoload -Uz compinit
compinit2. Gyors áttekintés a forrásspecifikációkról
Amikor erőforrások YAML definícióit hozza létre, tudnia kell a mezőket és azok értékeit az erőforrásokhoz. Az információ keresésére az API útmutató az egyik hely, amely teljes specifikációkat tartalmaz minden erőforráshoz.
Azonban nem praktikus állandóan átváltani a böngészőre, amikor valamit keresni kell. Ezért a kubectl biztosít egy parancsot kubectl explain, amely megmutatja az összes erőforrás specifikációját közvetlenül a terminálban.
A parancs formátuma a következő:
$ kubectl explain resource[.field]...A csapat megjeleníti a kért erőforrás vagy mező specifikációját. Az megjelenített információ azonos az API útmutatójában találhatóval.
már tartalmaz egy előre létrehozott önaláírt TLS/SSL tanúsítványt. Ennyi nekem elegendő, mivel zárva tartom a külső hozzáférést. Azoknak, akik más típusú tanúsítványokat szeretnének használni, van kubectl explain csak a mezők első szintű hierarchiáját mutatja.
Nézd meg, hogyan néz ki ez .
Az egész fát megjelenítheted, ha hozzáadod a következő opciót --recursive:
$ kubectl explain deployment.spec --recursiveHa nem vagy biztos abban, hogy pontosan mely erőforrásokra van szükséged, használhatod a következő parancsot, hogy mindet megjelenítsd:
$ kubectl api-resources Ez a parancs a többes számú erőforrásek neveit jeleníti meg, például telepítések $CI_COMMIT_TAG stb.);. Ezen kívül megjeleníti a rövid neveket is, például after_deploy, azok számára, akiknek van rövid nevük. Ne aggódj ezek miatt a különbségek miatt. Mindezek a névváltozatok egyenértékűek a kubectl számára. Tehát bármelyiket használhatod a kubectl explain.
Az alábbi parancsok mind egyenértékűek:
$ kubectl explain deployments.spec
# vagy
$ kubectl explain deployment.spec
# vagy
$ kubectl explain deploy.spec3. Használj egyéni oszlopformátumot
Alapértelmezett módon az kubectl get:
$ kubectl get pods
NÉV KÉSZ ÁLLAPOT ÚJRASZERELÉSEK KOR
engine-544b6b6467-22qr6 1/1 Futtatásban 0 78 nap
engine-544b6b6467-lw5t8 1/1 Futtatásban 0 78 nap
engine-544b6b6467-tvgmg 1/1 Futtatásban 0 78 nap
web-ui-6db964458-8pdw4 1/1 Futtatásban 0 78 napEz a formátum kényelmes, de korlátozott mennyiségű információt tartalmaz. Az erőforrás definíciójának teljes formátumához képest itt csak néhány mezőt mutat.
Ebben az esetben használhatod az egyéni oszlopformátumot. Ez lehetővé teszi, hogy meghatározd, mely adatokat szeretnél megjeleníteni. Bármely erőforrás mezőjét külön oszlopban jelenítheted meg.
Az egyéni formátum használata az alábbi opciókkal határozható meg:
-o custom-columns=:[,:]... Minden oszlopot a következő pár formájában definiálhatsz , ahol — az oszlop neve, míg <jsonpath> — az erőforrás mezőjét meghatározó kifejezés.
Nézzünk meg egy egyszerű példát:
$ kubectl get pods -o custom-columns='NÉV:metadata.name'
NÉV
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4A kimenet egy oszlopot tartalmaz a podok neveivel.
A kifejezés az opcióban a podok neveit választja ki a mezőből metadata.name. Ez azért van, mert a pod neve a mező gyermekmezőjében van meghatározva, amely a metadata a pod erőforrásleírásában. További részletekért lásd a vagy írd be a parancsot kubectl explain pod.metadata.name.
Most assume you want to add an additional column to the output, such as showing the node each pod is running on. To do this, simply add the corresponding column specification to the custom columns option:
$ 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 The expression selects the node name from spec.nodeName — when a pod is assigned to a node, its name is recorded in the spec.nodeName pod's resource specification field. More detailed information can be found in the output of kubectl explain pod.spec.nodeName.
Note that Kubernetes resource fields are case-sensitive.
You can view any resource field as a column. Just look through the resource specification and try it with any fields you like.
But first, let's take a closer look at field selection expressions.
JSONPath expressions
Expressions for selecting resource fields are based on .
JSONPath is a language for querying data from JSON documents. Selecting a single field is the simplest use case of JSONPath. It has much , including selectors, filters, and so on.
Kubectl explain supports a limited set of JSONPath capabilities. Below are the capabilities and examples of their use:
# Выбрать все элементы списка
$ 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'The operator [] holds special significance. Many Kubernetes resource fields are lists, and this operator allows you to select items from those lists. It is often used with a wildcard like [*] to select all items in a list.
Alkalmazási példák
The custom column output format usage possibilities are limitless, as you can display any field or combination of resource fields in the output. Here are some application examples, but feel free to explore them yourself and find useful applications.
- Displaying container images for pods:
$ 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 wordpressThis command displays the names of container images for each pod.
Ne feledje, hogy egy pod több konténert tartalmazhat, így a képek nevei egy sorban, vesszővel elválasztva jelennek meg.
- A csomópontok elérhetőségi zónáinak megjelenítése:
$ 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-1bEz a parancs hasznos, ha a klaszter nyilvános felhőben van telepítve. Megjeleníti az elérhetőségi zónát minden csomóponthoz.
Az elérhetőségi zóna egy felhőszolgáltatói koncepció, amely a replikációs zónát földrajzi régióra korlátozza.
A csomópontok elérhetőségi zónái egy speciális címke által nyerhetők ki — . Ha a klaszter nyilvános felhőben fut, ez a címke automatikusan létrejön, és kitöltődik a csomópontok elérhetőségi zónáinak neveivel.
A címkék nem a Kubernetes erőforrás-specifikáció részét képezik, így nem talál információt róluk a . Azonban láthatók (mint bármilyen más címke), ha YAMl vagy JSON formátumban kér információt a csomópontokról:
$ kubectl get nodes -o yaml # vagy $ kubectl get nodes -o jsonEz egy nagyszerű módja annak, hogy többet megtudjon az erőforrásokról, a resource-specifikációk tanulmányozása mellett.
4. Könnyű váltás klaszterek és névtér között
Amikor a kubectl kérést küld a Kubernetes API felé, először elolvassa a kubeconfig fájlt, hogy megkapja az összes szükséges paramétert a kapcsolódáshoz.
Alapértelmezés szerint a kubeconfig fájl — ez ~/.kube/config. Általában ezt a fájlt egy külön paranccsal hozzák létre vagy frissítik.
Amikor több klaszterrel dolgozik, a kubeconfig fájl tartalmazza az összes klaszterhez való csatlakozási paramétert. Szüksége van egy módszerre, hogy a kubectl parancsnak jelezze, hogy pontosan melyik klaszterrel dolgozik.
A klaszteren belül több névteret is létrehozhat — egyfajta virtuális klaszter a fizikai klaszteren belül. A kubectl azt is meghatározza, hogy melyik névtér használható a kubeconfig fájl adatai alapján. Tehát szüksége van egy módszerre, hogy a kubectl parancsnak jelezze, hogy melyik névteret használja.
Ebben a fejezetben elmagyarázzuk, hogyan működik ez, és hogyan érheti el a hatékony működést.
Kérjük, vegye figyelembe, hogy több kubeconfig fájl is lehet a KUBECONFIG környezeti változóban felsorolva. Ebben az esetben ezek a fájlok egy közös konfigurációba egyesülnek a végrehajtás során. A kubeconfig fájlhoz használt alapértelmezett fájl megváltoztatásához indítsa a kubectl parancsot a paraméterrel --kubeconfig. Lásd még .
Kubeconfig fájlok
Nézzük meg, mit tartalmaz pontosan a kubeconfig fájl:

Ahogy látható, a kubeconfig fájl tartalmaz egy kontextuskészletet. A kontextus három elemből áll:
- Cluster — a klaszter API szerverének URL-je.
- User — a felhasználó hitelesítési adatai a klaszterhez.
- Namespace — a klaszterhez való csatlakozás során használt névtér.
A gyakorlatban gyakran egy kontextust használnak egy klaszterhez a kubeconfig fájlban. Azonban lehet több kontextusa is egy klaszternak, amelyek különböznek a felhasználó vagy a névtér alapján. Az ilyen több kontextusos konfiguráció azonban ritkán fordul elő, így általában kölcsönösen egyértelmű megfeleltetés van a klaszterek és a kontextusok között.
Bármikor az egyik kontextus az aktuális:

Amikor a kubectl beolvassa a konfigurációs fájlt, akkor mindig az aktuális kontextus információit veszi figyelembe. A fenti példában a kubectl a Hare klaszterre fog csatlakozni.
Ennek megfelelően, ha másik klaszterre szeretne váltani, meg kell változtatnia az aktuális kontextust a kubeconfig fájlban:

Most a kubectl a Fox klaszterre fog csatlakozni.
Ha egy másik névtérre szeretne váltani ugyanabban a klaszterben, akkor módosítania kell a namespace elem értékét az aktuális kontextusban:

A fenti példa szerint a kubectl a Fox klaszter Prod névterét fogja használni (korábban Test névtér volt beállítva).
Kérjük, vegye figyelembe, hogy a kubectl külön paramétereket is biztosít --cluster, --user, --namespace és --context, amelyek lehetővé teszik a különböző elemek és az aktuális kontextus felülírását, függetlenül attól, hogy mi van beállítva a kubeconfig fájlban. Lásd kubectl options.
Elméletileg manuálisan is módosíthatja a kubeconfig fájl paramétereit. De ez kényelmetlen. Az ilyen műveletek egyszerűsítésére különféle eszközök állnak rendelkezésre, amelyek lehetővé teszik a paraméterek automatikus módosítását.
Használja a kubectx-ot
Nagyon népszerű eszköz a klaszterek és névterek közötti váltásra.
Az eszköz parancsokat biztosít kubectx és kubens a jelenlegi kontextus és névterek megfelelő megváltoztatásához.
Ahogy már említettük, a jelenlegi kontextus megváltoztatása a klaszter megváltoztatását jelenti, ha csak egy kontextus van a klaszterben.
Íme egy példa ezen parancsok végrehajtására:

Tulajdonképpen ezek a parancsok csak szerkesztik a kubeconfig fájlt, ahogy azt fentebb leírtuk.
A telepítéshez kubectx, kövesse az alábbi utasításokat a
Mindkét parancs támogatja a kontextusok és névterek automatikus kiegészítését, ami lehetővé teszi azok teljes írásának elkerülését. Az automatikus kiegészítés beállítása .
Egy másik hasznos funkció kubectx egy . Ez együttműködik a , amelyet külön kell telepíteni. Az fzf telepítése automatikusan elérhetővé teszi az interaktív módot a kubectx. Az interaktív módban a kontextust és névteret az fzf által biztosított interaktív szabadkereső felületen keresztül választhatja ki.
Parancssori aliasok használata
Nincs szükség külön eszközökre a jelenlegi kontextus és névterek megváltoztatásához, mert a kubectl is biztosít parancsokat ehhez. Így például a kubectl config alparancsokat ad a kubeconfig fájlok szerkesztéséhez.
Íme néhány közülük:
kubectl config get-contexts: az összes kontextus megjelenítése;kubectl config current-context: a jelenlegi kontextus lekérdezése;kubectl config use-context: a jelenlegi kontextus megváltoztatása;kubectl config set-context: a kontextuselem megváltoztatása.
Azonban ezeket a parancsokat közvetlenül használni nem annyira kényelmes, mivel hosszúak. Készíthetünk nekik parancssori aliasokat, amelyeket könnyen végrehajthatunk.
Készítettem egy halom alias-t ezekből a parancsokból, amelyek funkcionalitását a kubectx-hez hasonlóan biztosítják. Itt láthatja működésüket:

Vegye figyelembe, hogy az aliasok az fzf-t használják, hogy interaktív keresőfelületet biztosítsanak (mint az interaktív kubectx módban). Ez azt jelenti, hogy szüksége van , hogy használni tudja ezeket az aliasokat.
Íme maguk az alias definíciók:
# Получить текущий контекст
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/^..//")"' Az aliasok telepítéséhez hozzá kell adni a fenti definíciókat a fájljához, ~/.bashrc vagy ~/.zshrc és újra kell indítani a shell-jét.
Pluginok használata
A kubectl lehetővé teszi pluginok betöltését, amelyek ugyanúgy futnak, mint az alapparancsok. Például telepíthet egy kubectl-foo plugint, és futtathatja azt a parancs kiadásával kubectl foo.
Hasznos lenne a kontextust és a névtér módosítása így, például a kubectl ctx parancs futtatására a kontextus megváltoztatásához és kubectl ns parancs futtatására a névtér megváltoztatásához.
Két plugint írtam, amelyek ezt végzik:
A pluginek működése a korábbi fejezet aliaszain alapul.
Így működnek:

Vegye figyelembe, hogy a pluginek fzf-t használnak az interaktív szabad keresési felület biztosításához (mint az interaktív kubectx módban). Ez azt jelenti, hogy szüksége van, hogy használni tudja ezeket az aliasokat.
A pluginek telepítéséhez le kell töltenie a szkriptjeit, amelyek nevei és bármely katalogusban, amely a PATH változóban szerepel, és futtathatóvá kell tennie őket, például a chmod +xparancs segítségével. Ezt követően használhatja a kubectl ctx és kubectl ns.
5. Beviteli rövidítés automatikus aliaszokkal
A parancssori aliaszok nagyszerű lehetőséget kínálnak a bevitel felgyorsítására. A projekt körülbelül 800 rövidítést tartalmaz a kubectl alapvető parancsaihoz.
Talán meglepődik – hogyan lehet megjegyezni 800 aliaszt? De nem szükséges mindet megjegyeznie, mivel azok egy egyszerű séma alapján épülnek fel, amely alább látható:

Például:
- kgpooyaml — kubectl get pods oyaml
- ksysgsvcw — kubectl -n kube-system get svc w
- ksysrmcm — kubectl -n kube-system rm cm
- kgdepallsl — kubectl get deployment all sl
Ahogy látja, az aliaszok összetevőkből állnak, amelyek mindegyike a kubectl parancsának egy meghatározott elemét jelöli. Minden aliasnak lehet egy összetevője az alapparancshoz, a művelethez és az erőforráshoz, és több összetevője a paraméterekhez. Egyszerűen „kitölti” ezeket az összetevőket balról jobbra a fenti séma szerint.
A jelenlegi részletes séma itt található . Itt találhatja meg a.
Például az kgpooyamlall alias egyenlő a kubectl get pods -o yaml --all-namespaces.
parancs végrehajtásával. Az opciók relatív sorrendje nem számít: a kgpooyamlall parancs az alábbi parancsnak felel meg: kgpoalloyaml.
Nem szükséges, hogy minden összetevőt aliaszként használjon. Például k, kg, klo, ksys, kgpo szintén használható. Továbbá, a parancssorban kombinálhatja az aliaszokat és a szokásos parancsokat vagy opciókat:
Például:
- A
kubectl proxyígy írható:k proxy. - A
kubectl get rolesígy írható:kg roles(jelenleg nincs alias a Roles erőforráshoz). - A konkrét pod adatait a következő parancs segítségével kaphatja meg:
kgpo my-pod — kubectl get pod my-pod.
Vegye figyelembe, hogy néhány alias argumentumot igényel a parancssorban. Például az alias kgpol jelenti kubectl get pods -l. Opció -l megköveteli az argumentumot — a címke specifikációját. Ha alias-t használ, akkor ez így fog kinézni kgpol app=ui.
Mivel az aliasok egy része argumentumokat igényel, az a, f és l aliasokat utolsóként kell használni.
Általában, amint elsajátítja ezt a sémát, intuícióval képes lesz előhívni az aliasokat azokból a parancsokból, amelyeket végre szeretne hajtani, és jelentős időt takaríthat meg a begépelésen.
Telepítés
A kubectl-aliases telepítéséhez le kell töltenie a fájlt a GitHub-ról, és be kell illesztenie a fájlba ~/.bashrc vagy ~/.zshrc:
source ~\/\.kubectl_aliasesAutomatikus kiegészítés
Ahogy már említettük, gyakran további szavakat ad hozzá az aliashoz a parancssorban. Például:
$ kgpooyaml test-pod-d4b77b989Ha használja a kubectl parancs automatikus kiegészítését, valószínűleg már használt automatikus kiegészítést olyan dolgokhoz, mint az erőforrásnevek. De lehet-e ezt megtenni, amikor aliasokat használnak?
Ez egy nagyon fontos kérdés, mert ha az automatikus kiegészítés nem működik, akkor elveszíti az aliasok előnyeinek egy részét.
A válasz attól függ, hogy milyen parancssori környezetet használ:
- Zsh-hez az aliasok automatikus kiegészítése »out of the box« működik.
- Bash esetében sajnos szükséges néhány lépés ahhoz, hogy az automatikus kiegészítés működjön.
Az automatikus kiegészítés engedélyezése aliasok számára Bash-ben
A probléma Bash-sal az, hogy mindig Alias-t próbál kiegészíteni (valahányszor megnyomja a Tab-ot), nem pedig a parancsot, amelyre az alias hivatkozik (ahogy azt a Zsh teszi). Mivel nincs kiegészítő scriptje az összes 800 alias számára, az automatikus kiegészítés nem működik.
Projekt általános megoldást kínál erre a problémára. Csatlakozik az aliasok kiegészítési mechanizmusához, belül kiegészíti az alias-t a parancsra, és visszaadja a kiegészítési lehetőségeket a kiegészített parancsra. Ez azt jelenti, hogy az alias kiegészítése pontosan úgy viselkedik, mint a teljes parancs kiegészítése.
Először elmagyarázom, hogyan kell telepíteni a complete-alias-t, majd ismertetem, hogyan lehet beállítani, hogy lehetővé váljon az összes kubectl alias automatikus kiegészítése.
A complete-alias telepítése
Először is, a complete-alias függ a . Ezért a complete-alias telepítése előtt győződjön meg arról, hogy a bash-completion telepítve van. A telepítési utasításokat korábban megadták Linux és MacOS esetén.
Fontos megjegyzés MacOS felhasználóknak: akárcsak a kubectl automatikus kiegészítő script, a complete-alias sem működik a Bash 3.2-vel, amely alapértelmezetten használatos a MacOS rendszeren. Különösen a complete-alias a bash-completion v2-től függ (brew install bash-completion@2), amelyhez legalább Bash 4.1 szükséges. Ez azt jelenti, hogy a complete-alias használatához MacOS-en újabb verziót kell telepíteni a Bash-ból.
Le kell töltenie a szkriptet a és be kell illesztenie a fájljába ~/.bashrc:
source ~\/bash_completion.shA parancsértelmező újraindítása után a complete-alias teljesen telepítve lesz.
Az autókitöltés aktiválása a kubectl aliasokhoz
Technikailag a complete-alias egy shell funkciót biztosít _complete_alias. Ez a funkció ellenőrzi az alias-t, és visszaadja az alias parancsának autókitöltési javaslatait.
A funkció bizonyos alias-hoz való összekapcsolásához használja a Bash beépített mechanizmusát , hogy beállítsa _complete_alias mint az alias autókitöltési funkcióját.
Példának vegyük az k alias-t, amely a kubectl parancsot jelöli. Az alábbi parancsot kell végrehajtania ahhoz, hogy _complete_alias azt az alias autókitöltési funkciójává állítsa:
$ complete -F _complete_alias k Ennek az a következménye, hogy amikor k aliasra autókitöltést kér, a funkció _complete_alias, amely ellenőrzi az alias-t és visszaadja az autókitöltési javaslatokat a parancshoz. kubectl.
Egy másik példa lehet az alias kg, ami jelenti kubectl get:
$ complete -F _complete_alias kg Hasonlóan az előző példához, ha az kg aliasra autókitöltést kér, ugyanazokat az autókitöltési javaslatokat kapja, mint az kubectl get.
Ne feledje, hogy a complete-alias-t bármilyen aliasra használhatja a rendszerében.
Ezért, hogy aktiválja az autókitöltést az összes kubectl aliashoz, futtassa a fenti parancsot mindegyiknél. Az alábbi kódrészlet pontosan ezt csinálja, amennyiben telepítette a kubectl-aliases-t a ~\/ .kubectl-aliases:
for _a in $(sed '\/^alias \/!d;s\/^alias \/\/;s\/=.*$\/\/ ~\/ .kubectl_aliases); \ndo\n complete -F _complete_alias "$_a"\ndone Ezt a kódrészletet a ~/.bashrc, töltse újra a parancsértelmezőt, és az összes 800 kubectl aliashoz elérhető lesz az autókitöltés.
6. A kubectl kiterjesztése pluginekkel
A , a kubectl támogatja , amely lehetővé teszi a funkcióinak kiegészítését további parancsokkal.
Ha ismeri a Git plugin mechanizmusait Ebben a fejezetben bemutatjuk, hogyan telepíthetők a pluginek, hol találhatók, és hogyan készíthet saját plugineket.
A pluginek telepítése
A fejezetben bemutatjuk, hogyan kell telepíteni a plugineket, hol találhatók, és hogyan készíthetsz saját plugineket.
A kubectl plugin is distributed as a simple executable file named kubectl-x. The prefix kubectl- is required, followed by a new kubectl subcommand that allows you to invoke the plugin.
For example, the hello plugin will be distributed as a file named kubectl-hello.
To install a plugin, you need to copy the file kubectl-x to any directory in your PATH variable and make it executable, for example using chmod +x. Immediately after this, you can invoke the plugin using kubectl x.
You can use the following command to output a list of all plugins currently installed in your system:
$ kubectl plugin listThis command also displays warnings if you have multiple plugins with the same names or if there is a plugin file that is not executable.
Finding and installing plugins using Krew
Kubectl plugins are suitable for sharing or reuse like software packages. But where can you find plugins shared by others?
is aimed at providing a unified solution for sharing, searching, installing, and managing kubectl plugins. The project refers to itself as the 'package manager for kubectl plugins' (Krew is similar to ).
Krew is a list of kubectl plugins that you can choose and install. Krew is also a plugin for kubectl.
This means that installing Krew essentially functions like installing any other kubectl plugin. You can find detailed instructions on the .
The most important Krew commands:
# Поиск в списке плагинов
$ kubectl krew search [<query>]
# Посмотреть информацию о плагине
$ kubectl krew info <plugin>
# Установить плагин
$ kubectl krew install <plugin>
# Обновить все плагины до последней версии
$ kubectl krew upgrade
# Посмотреть все плагины, установленные через Krew
$ kubectl krew list
# Деинсталлировать плагин
$ kubectl krew remove <plugin>Please note that installing plugins using Krew does not interfere with installing plugins the standard way described above.
Note that the command kubectl krew list only displays those plugins that were installed using Krew, while the command kubectl plugin list lists all plugins, meaning those installed using Krew as well as those installed by other means.
Searching for plugins elsewhere
Krew is a young project, currently its only about 30 plugins. If you can't find what you need, you can find plugins elsewhere, such as on GitHub.
I recommend checking the GitHub section . There you will find several dozen available plugins that are worth a look.
Saját pluginek készítése
Ön is — ez nem nehéz. Létre kell hoznia egy végrehajtható fájlt, amely a szükséges feladatokat végzi el, és elneveznie kell kubectl-x és beállítani, ahogyan azt korábban leírtuk.
A fájl lehet bash-script, python-script vagy lefordított go-alkalmazás – ez nem számít. Az egyetlen feltétel az, hogy közvetlenül végrehajthatónak kell lennie az operációs rendszerben.
Most készítsünk egy példát egy pluginról. Az előző szakaszban a kubectl parancsot használta a konténerek listájának megjelenítésére minden pod esetében. Ezt a parancsot könnyen átkonvertálhatja egy pluginná, amelyet például a következőképpen hívhat meg kubectl img.
Hozzon létre egy fájlt. kubectl-img a következő tartalommal:
#!/bin/bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' Most állítsa végrehajthatóvá a fájlt a következő paranccsal chmod +x kubectl-img és helyezze el a PATH bármelyik mappájába. Ezt követően azonnal használhatja a plugint kubectl img.
Ahogy már említettük, a kubectl pluginek bármely programozási nyelven vagy script nyelven írhatók. Ha parancsértelmező scriptet használ, van egy előny a kubectl könnyű hívhatóságában a pluginból. Azonban összetettebb plugineket is írhat valós programozási nyelveken, például . Ha Go-t használ, akkor a , amely kifejezetten a kubectl pluginek írásához készült, is felhasználhatja.
Hogyan oszthatja meg saját plugineit
Ha úgy gondolja, hogy a plugineik hasznosak lehetnek mások számára, ne habozzon megosztani őket a GitHubon. Ne felejtse el hozzáadni őket a következő témához .
A pluginjának hozzáadását a is kérheti. Az ezzel kapcsolatos utasításokat a .
Parancsok automatikus kiegészítése
Jelenleg a pluginek nem támogatják az automatikus kiegészítést. Ez azt jelenti, hogy be kell írnia a plugin teljes nevét és az argumentumok teljes neveit.
A kubectl GitHub tárolóban ehhez a funkcióhoz van . Így lehetséges, hogy ez a funkció valamikor a jövőben megvalósul.
Sok szerencsét!!!
Mit érdemes még olvasni a témában:
- .
- .
- .
Forrás: habr.com







