
Jeśli pracujesz z Kubernetes, to prawdopodobnie kubectl jest jednym z najczęściej używanych przez Ciebie narzędzi. A za każdym razem, gdy spędzasz dużo czasu na pracy z konkretnym narzędziem, warto je dobrze poznać i nauczyć się efektywnie używać.
Zespół Przetłumaczyłam artykuł Daniela Weibela, w którym znajdziesz porady i triki dotyczące efektywnej pracy z kubectl. Pomaga on również lepiej zrozumieć działanie Kubernetes.
Według autora, celem artykułu jest uczynienie Twojej codziennej pracy z Kubernetes nie tylko bardziej efektywną, ale i bardziej przyjemną!
Wprowadzenie: czym jest kubectl
Zanim nauczysz się używać kubectl bardziej efektywnie, musisz zdobyć podstawowe zrozumienie tego, czym jest i jak działa.
Z perspektywy użytkownika, kubectl to panel sterowania, który pozwala na wykonywanie operacji Kubernetes.
Z technicznego punktu widzenia, kubectl to klient API Kubernetes.
API Kubernetes to HTTP REST API. To API to rzeczywisty interfejs użytkownika Kubernetes, za pomocą którego cały system jest kontrolowany. Oznacza to, że każda operacja Kubernetes jest przedstawiana jako punkt końcowy API i może być wykonana za pomocą zapytania HTTP do tego punktu końcowego.
W związku z tym podstawowym zadaniem kubectl jest wysyłanie zapytań HTTP do API Kubernetes:

Kubernetes to w pełni system zorientowany na zasoby. Oznacza to, że utrzymuje wewnętrzny stan zasobów i wszystkie operacje Kubernetes są operacjami CRUD.
Masz pełną kontrolę nad Kubernetes, zarządzając tymi zasobami, a Kubernetes ustala, co robić na podstawie aktualnego stanu zasobów. Dlatego odniesienie do API Kubernetes jest zorganizowane w formie listy typów zasobów z powiązanymi operacjami.
Przyjrzyjmy się przykładowi.
Załóżmy, że chcesz stworzyć zasób ReplicaSet. Aby to zrobić, opisujesz ReplicaSet w pliku o nazwie replicaset.yaml, a następnie uruchamiasz polecenie:
$ kubectl create -f replicaset.yamlW rezultacie zostanie utworzony zasób ReplicaSet. Ale co dzieje się za kulisami?
W Kubernetes istnieje operacja tworzenia ReplicaSet. Jak każda inna operacja, jest ona oferowana jako punkt końcowy API. Konkretna końcówka API dla tej operacji wygląda następująco:
POST /apis/apps/v1/namespaces/{namespace}/replicasetsPunkty końcowe API wszystkich operacji Kubernetes można znaleźć w (w tym ). Aby wykonać rzeczywiste zapytanie do punktu końcowego, należy wcześniej dodać adres URL serwera API do ścieżek punktów końcowych wymienionych w dokumentacji API.
W związku z tym, gdy wykonujesz powyższą komendę, kubectl wysyła żądanie HTTP POST do wskazanego powyżej punktu końcowego API. Definicja ReplicaSet, którą podałeś w pliku replicaset.yaml, jest przesyłana w ciele żądania.
Tak właśnie działa kubectl dla wszystkich poleceń, które wchodzą w interakcję z klastra Kubernetes. We wszystkich tych przypadkach kubectl po prostu wysyła żądania HTTP do odpowiednich punktów końcowych API Kubernetes.
Zauważ, że można w pełni zarządzać Kubernetes za pomocą narzędzi takich jak curl, ręcznie wysyłając żądania HTTP do API Kubernetes. Kubectl po prostu ułatwia korzystanie z API Kubernetes.
To są podstawy tego, czym jest kubectl i jak działa. Ale jest jeszcze coś, o API Kubernetes, co każdy użytkownik kubectl powinien wiedzieć. Prześledźmy krótko wewnętrzny świat Kubernetes.
Wewnętrzny świat Kubernetes
Kubernetes składa się z zestawu niezależnych komponentów, które działają jako oddzielne procesy na węzłach klastra. Niektóre komponenty działają na głównych węzłach, inne na węzłach roboczych, każdy komponent wykonuje swoją specjalną rolę.
Oto najważniejsze komponenty na głównych węzłach:
- Magazyn — przechowuje definicje zasobów ().
- Serwer API — dostarcza API i zarządza magazynem.
- Menadżer kontrolerów — zapewnia, że stany zasobów odpowiadają specyfikacjom.
- Harmonogram — planuje pod'y na węzłach roboczych.
A oto jeden z najważniejszych komponentów na węzłach roboczych:
- Kubelet — zarządza uruchamianiem kontenerów na węźle roboczym.
Aby zrozumieć, jak te komponenty współpracują, rozważmy przykład.
Załóżmy, że właśnie wykonałeś kubectl create -f replicaset.yaml, po czym kubectl wysłał żądanie HTTP POST do (przekazując definicję zasobu ReplicaSet).
Co się dzieje w klastrze?
- Po wykonaniu
kubectl create -f replicaset.yamlserwer API zapisuje definicję twojego zasobu ReplicaSet w magazynie:
- Następnie uruchamiany jest kontroler ReplicaSet w menedżerze kontrolerów, który zajmuje się tworzeniem, modyfikowaniem i usuwaniem zasobów ReplicaSet:

- Kontroler ReplicaSet tworzy definicję pod'a dla każdej repliki ReplicaSet (zgodnie z szablonem pod'a w definicji ReplicaSet) i zapisuje je w magazynie:

- Rozpoczyna się planista, który śledzi pody, które nie zostały przypisane do żadnego węzła roboczego:

- Planista wybiera odpowiedni węzeł roboczy dla każdego podu i dodaje tę informację do definicji podu w magazynie:

- Na węźle roboczym, do którego przypisano pod, uruchamiany jest Kubelet, który śledzi pody przypisane do tego węzła:

- Kubelet odczytuje definicję podu z magazynu i wydaje polecenia środowisku wykonawczemu kontenerów, na przykład Docker, aby uruchomić kontenery na węźle:

Poniżej znajduje się tekstowa wersja tego opisu.
Zapytanie API do punktu końcowego tworzenia ReplicaSet jest przetwarzane przez serwer API. Serwer API autoryzuje zapytanie i zapisuje definicję zasobu ReplicaSet w magazynie.
To zdarzenie uruchamia kontroler ReplicaSet, który jest podprocesem menedżera kontrolerów. Kontroler ReplicaSet monitoruje tworzenie, aktualizację i usuwanie zasobów ReplicaSet w magazynie i otrzymuje powiadomienie o zdarzeniu, gdy to następuje.
Zadaniem kontrolera ReplicaSet jest upewnienie się, że istnieje wymagana liczba podów repliki ReplicaSet. W naszym przykładzie pody na razie nie istnieją, więc kontroler ReplicaSet tworzy te definicje podów (zgodnie z szablonem podu w definicji ReplicaSet) i zapisuje je w magazynie.
Tworzenie nowych podów uruchamia planista, który śledzi definicje podów, które jeszcze nie zostały zaplanowane dla węzłów roboczych. Planista wybiera odpowiedni węzeł roboczy dla każdego podu i aktualizuje definicje podu w magazynie.
Zauważ, że do tej pory w klastrze nie wykonywał się kod obciążenia roboczego. Wszystko, co do tej pory zrobiono, — to tworzenie i aktualizacja zasobów w magazynie na głównym węźle.
Ostatnie zdarzenie uruchamia Kubelet, który monitoruje pody zaplanowane dla swoich węzłów roboczych. Kubelet węzła roboczego, dla którego są ustawione twoje pody ReplicaSet, musi dać polecenie środowisku wykonawczemu kontenerów, na przykład Docker, aby pobrać wymagane obrazy kontenerów i je uruchomić.
W tym momencie w końcu twoja aplikacja ReplicaSet została uruchomiona!
Rola API Kubernetes
Jak zauważyłeś w poprzednim przykładzie, komponenty Kubernetes (z wyjątkiem serwera API i magazynu) monitorują zmiany zasobów w magazynie i modyfikują informacje o zasobach w magazynie.
Oczywiście, te komponenty nie komunikują się z magazynem bezpośrednio, a jedynie za pośrednictwem API Kubernetes.
Rozważmy następujące przykłady:
- Kontroler ReplicaSet wykorzystuje punkt końcowy API hello
watchw celu obserwowania zmian zasobów ReplicaSet. - Kontroler ReplicaSet wykorzystuje punkt końcowy API (utworzyć pod) do tworzenia podów.
- Planista wykorzystuje punkt końcowy API (zmienić pod) do aktualizacji podów z informacjami o wybranym węźle roboczym.
Jak widać, to to samo API, do którego odwołuje się kubectl. Użycie tego samego API do pracy wewnętrznych komponentów i zewnętrznych użytkowników jest fundamentalną koncepcją projektowania Kubernetes.
Teraz możemy podsumować, jak działa Kubernetes:
- Magazyn przechowuje stan, czyli zasoby Kubernetes.
- Serwer API zapewnia interfejs do magazynu w postaci API Kubernetes.
- Wszystkie inne komponenty i użytkownicy Kubernetes odczytują, obserwują i manipulują stanem (zasobami) Kubernetes za pośrednictwem API.
Znajomość tych koncepcji pomoże lepiej zrozumieć kubectl i maksymalnie wykorzystać jego możliwości.
Teraz przyjrzyjmy się kilku konkretnym wskazówkom i sztuczkom, które mogą poprawić wydajność pracy z kubectl.
1. Przyspieszenie wprowadzania za pomocą uzupełniania poleceń
Jedną z najbardziej przydatnych, ale często pomijanych metod, które mogą zwiększyć wydajność pracy z kubectl, jest uzupełnianie poleceń.
Uzupełnianie poleceń umożliwia automatyczne wypełnianie poszczególnych części poleceń kubectl za pomocą klawisza Tab. Działa to dla podpoleceń, opcji i argumentów, w tym tych bardziej skomplikowanych, jak nazwy zasobów.
Zobacz, jak działa uzupełnianie poleceń kubectl:

Uzupełnianie poleceń działa dla powłok Bash i Zsh.
zawiera szczegółowe instrukcje dotyczące konfigurowania autouzupełniania, ale poniżej przedstawimy krótkie streszczenie.
Jak działa uzupełnianie poleceń
Uzupełnianie poleceń to funkcja powłoki, która działa za pomocą skryptu uzupełnienia. Skrypt uzupełnienia to skrypt powłoki, który definiuje zachowanie uzupełnienia dla konkretnego polecenia.
Kubectl automatycznie generuje i wyprowadza skrypty uzupełnienia dla Bash i Zsh za pomocą następujących poleceń:
$ kubectl completion bashLub:
$ kubectl completion zshTeoretycznie wystarczy podłączyć wyjście tych poleceń do odpowiedniej powłoki, aby kubectl mógł uzupełniać polecenia.
W praktyce sposób połączenia różni się dla Bash (w tym różnice między Linux a MacOS) oraz Zsh. Poniżej omówimy wszystkie te opcje.
Bash w Linux
Skrypt uzupełnienia dla Bash zależy od pakietu bash-completion, więc najpierw trzeba go zainstalować:
$ sudo apt-get install bash-completionLub:
$ yum install bash-completionMożesz przetestować, czy pakiet został pomyślnie zainstalowany za pomocą następującego polecenia:
$ type _init_completion Jeśli w rezultacie wyświetli się kod funkcji powłoki, to bash-completion został poprawnie zainstalowany. Jeśli polecenie zwraca błąd „Nie znaleziono”, musisz dodać następujący wiersz do swojego pliku ~ /.bashrc:
$ source /usr/share/bash-completion/bash_completion To, czy musisz dodać ten wiersz do pliku ~ /.bashrc zależy od menedżera pakietów, którego używałeś do instalacji bash-completion. W przypadku APT jest to konieczne, w przypadku YUM nie.
Po zainstalowaniu bash-completion musisz skonfigurować wszystko, aby skrypt uzupełnienia kubectl był włączony we wszystkich sesjach powłoki.
Jednym ze sposobów na to jest dodanie następującego wiersza do pliku ~ /.bashrc:
source <(kubectl completion bash) Innym sposobem jest dodanie skryptu uzupełnienia kubectl do katalogu /etc/bash_completion.d (stwórz go, jeśli nie istnieje):
$ kubectl completion bash > /etc/bash_completion.d/kubectl Wszystkie skrypty uzupełnienia w katalogu /etc/bash_completion.d są automatycznie włączane w bash-completion.
Obie opcje są równie ważne.
Po ponownym uruchomieniu powłoki autouzupełnianie poleceń kubectl będzie działać.
Bash w MacOS
W MacOS konfiguracja jest nieco bardziej skomplikowana. Chodzi o to, że domyślnie w MacOS zainstalowana jest wersja Bash 3.2, podczas gdy skrypt autouzupełnienia kubectl wymaga wersji Bash nie niższej niż 4.1, a w wersji 3.2 nie działa.
Używanie przestarzałej wersji Bash w MacOS wiąże się z kwestiami licencyjnymi. Wersja Bash 4 jest rozpowszechniana na licencji GPLv3, której nie wspiera Apple.
Aby skonfigurować autouzupełnianie kubectl w MacOS, musisz zainstalować nowszą wersję Bash. Możesz także ustawić zaktualizowany Bash jako domyślną powłokę, co w przyszłości uchroni cię przed wieloma problemami. To nie jest trudne, szczegóły podane są w artykule „».
Przed kontynuowaniem upewnij się, że używasz najnowszej wersji Bash (sprawdź wynik bash --version).
Skrypt autouzupełnienia w Bash zależy od projektu , więc najpierw musisz go zainstalować.
Możesz zainstalować bash-completion za pomocą :
$ brew install bash-completion@2 Tutaj @2 oznacza bash-completion w wersji 2. Autouzupełnianie kubectl wymaga bash-completion v2, a bash-completion v2 wymaga wersji Bash co najmniej 4.1.
Wynik komendy brew-install zawiera sekcję Caveats, w której podano, że należy dodać do pliku ~/.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" Jednak zalecam dodawanie tych linii nie do ~/.bash_profile, a w ~\/ .bashrc. W takim przypadku autouzupełnianie będzie dostępne nie tylko w głównym, ale także w podrzędnych powłokach komend.
Po ponownym uruchomieniu powłoki możesz sprawdzić poprawność instalacji za pomocą następującej komendy:
$ type _init_completionJeśli w wyjściu widzisz funkcję shell, to wszystko jest skonfigurowane prawidłowo.
Teraz musisz zrobić tak, aby autouzupełnianie kubectl było włączone we wszystkich sesjach.
Jednym ze sposobów jest dodanie następującej linii do swojego ~\/ .bashrc:
source <(kubectl completion bash) Drugim sposobem jest dodanie skryptu autouzupełniania do folderu /usr/local/etc/bash_completion.d:
$ kubectl completion bash
>/usr/local/etc/bash_completion.d/kubectlTen sposób zadziała tylko, jeśli instalowałeś bash-completion za pomocą Homebrew. W takim przypadku bash-completion ładuje wszystkie skrypty z tego katalogu.
Jeśli instalowałeś , to nie musisz wykonywać poprzedniego kroku, ponieważ skrypt autouzupełniania zostanie automatycznie umieszczony w folderze /usr/local/etc/bash_completion.d podczas instalacji. W takim przypadku autouzupełnianie kubectl zacznie działać natychmiast po zainstalowaniu bash-completion.
Ostatecznie wszystkie te opcje są równoważne.
Zsh
Skrypty autouzupełniania dla Zsh nie wymagają żadnych zależności. Wszystko, co musisz zrobić, to włączyć je podczas ładowania powłoki.
Możesz to zrobić, dodając linię do swojego ~/.zshrc plik:
source <(kubectl completion zsh) Jeśli otrzymałeś błąd not found: compdef po ponownym uruchomieniu twojej powłoki, musisz włączyć wbudowaną funkcję compdef. Można ją włączyć, dodając na początku swojego pliku ~/.zshrc następujące:
autoload -Uz compinit
compinit2. Szybki przegląd specyfikacji zasobów
Kiedy tworzysz definicje zasobów YAML, musisz znać pola i ich wartość dla tych zasobów. Jednym z miejsc, gdzie można szukać tych informacji, jest przewodnik po API, który zawiera pełne specyfikacje wszystkich zasobów.
Jednak przełączanie się do przeglądarki za każdym razem, gdy potrzebujesz coś wyszukać, jest niewygodne. Dlatego kubectl udostępnia komendę kubectl explain, która pokazuje specyfikacje wszystkich zasobów bezpośrednio w twoim terminalu.
Format komendy jest następujący:
$ kubectl explain resource[.field]...Zespół wyświetli specyfikację żądanego zasobu lub pola. Wyświetlone informacje są identyczne z tymi, które znajdują się w dokumentacji API.
Domyślnie kubectl explain pokazuje tylko pierwszy poziom zagnieżdżenia pól.
Zobacz, jak to wygląda .
Można wyświetlić całe drzewo, dodając opcję --recursive:
$ kubectl explain deployment.spec --recursiveJeśli nie wiesz dokładnie, jakie zasoby są potrzebne, możesz je wszystkie wyświetlić następującą komendą:
$ kubectl api-resources Ta komenda wyświetla nazwy zasobów w liczbie mnogiej, na przykład deployments zamiast deployment. Pokazuje również skróconą nazwę, na przykład deploy, dla tych zasobów, które mają taką nazwę. Nie martw się o te różnice. Wszystkie te warianty nazw są równoważne dla kubectl. Możesz używać dowolnego z nich do kubectl explain.
Wszystkie poniższe komendy są równoważne:
$ kubectl explain deployments.spec
# lub
$ kubectl explain deployment.spec
# lub
$ kubectl explain deploy.spec3. Użyj niestandardowego formatu wyjścia kolumn
Domyślny format wyjścia komendy kubectl get:
$ kubectl get pods
NAZWA GOTOWE STATUS RESTARTY WIEK
engine-544b6b6467-22qr6 1/1 Działa 0 78d
engine-544b6b6467-lw5t8 1/1 Działa 0 78d
engine-544b6b6467-tvgmg 1/1 Działa 0 78d
web-ui-6db964458-8pdw4 1/1 Działa 0 78dTaki format jest wygodny, ale zawiera ograniczoną ilość informacji. W porównaniu do pełnego formatu definicji zasobu, wyświetlane są tylko niektóre pola.
W tym przypadku można użyć niestandardowego formatu wyjścia kolumn. Umożliwia on określenie, jakie dane mają być wyświetlane. Możesz wyświetlić dowolne pole zasobu w osobnej kolumnie.
Użycie niestandardowego formatu określa się za pomocą opcji:
-o custom-columns=:[,:]... Możesz określić każdą kolumnę wyjścia parą , gdzie — nazwa kolumny, a <jsonpath> — wyrażenie definiujące pole zasobu.
Zobaczmy prosty przykład:
$ kubectl get pods -o custom-columns='NAZWA:metadata.name'
NAZWA
engine-544b6b6467-22qr6
engine-544b6b6467-lw5t8
engine-544b6b6467-tvgmg
web-ui-6db964458-8pdw4Wyjście zawiera jedną kolumnę z nazwami podów.
Wyrażenie w opcji wybiera nazwy podów z pola metadata.name. To dlatego, że nazwa podu jest określona w podrzędnym polu name pola metadata w opisie zasobu podu. Można zapoznać się z tym bliżej w lub wpisać komendę kubectl explain pod.metadata.name.
Załóżmy teraz, że chcesz dodać dodatkową kolumnę do wyjścia, na przykład pokazując węzeł, na którym działa każda aplikacja. Aby to zrobić, wystarczy dodać odpowiednią specyfikację kolumny do opcji kolumn niestandardowych:
$ 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 Wyrażenie wybiera nazwę węzła z spec.nodeName — gdy aplikacja jest przypisywana do węzła, jej nazwa jest zapisywana w polu spec.nodeName specyfikacji zasobów aplikacji. Więcej informacji można znaleźć w wyjściu kubectl explain pod.spec.nodeName.
Pamiętaj, że pola zasobów Kubernetes są wrażliwe na wielkość liter.
Możesz wyświetlić dowolne pole zasobu w postaci kolumny. Po prostu przejrzyj specyfikację zasobu i wypróbuj dowolne pola, które Ci się podobają.
Ale najpierw przyjrzyjmy się dokładniej wyrażeniom wybierającym pola.
Wyrażenia JSONPath
Wyrażenia do wybierania pól zasobów opierają się na .
JSONPath to język zapytań do danych w dokumentach JSON. Wybór jednego pola to najprostszy przypadek użycia JSONPath. Ma znacznie , w tym selektory, filtry i tak dalej.
Kubectl explain obsługuje ograniczoną liczbę możliwości JSONPath. Poniżej opisano możliwości i przykłady ich zastosowania:
# Выбрать все элементы списка
$ 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'Oprócz tego ważna jest operator []. Wiele pól zasobów Kubernetes to listy, a ten operator pozwala na wybieranie elementów tych list. Często używa się go z symbolem wieloznacznym, np. [*], aby wybrać wszystkie elementy listy.
Przykłady zastosowania
Możliwości użycia niestandardowego formatu wyjściowego kolumn są nieograniczone, ponieważ możesz wyświetlić dowolne pole lub kombinację pól zasobu w wyjściu. Oto kilka przykładów zastosowań, ale nie wahaj się badać ich samodzielnie i znajdować przydatnych dla siebie zastosowań.
- Wyświetlanie obrazów kontenerów dla aplikacji:
$ 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 wordpressTo polecenie wyświetla nazwy obrazów kontenerów dla każdej aplikacji.
Pamiętaj, że pod może zawierać wiele kontenerów, więc nazwy obrazów będą wyświetlane w jednej linii oddzielone przecinkami.
- Wyświetlanie stref dostępności węzłów:
$ 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-1bTo polecenie jest przydatne, gdy twój klaster jest zlokalizowany w publicznej chmurze. Wyświetla strefę dostępności dla każdego węzła.
Strefa dostępności to koncepcja chmurowa, która ogranicza zasięg replikacji do regionu geograficznego.
Strefy dostępności dla każdego węzła są pozyskiwane dzięki specjalnej etykiecie — . Jeśli klaster działa w publicznej chmurze, ta etykieta jest tworzona automatycznie i wypełniana nazwami stref dostępności dla każdego węzła.
Etykiety nie są częścią specyfikacji zasobów Kubernetes, więc nie znajdziesz o nich informacji w . Można je jednak zobaczyć (tak jak wszystkie inne etykiety), gdy zapytasz o informacje o węzłach w formacie YAML lub JSON:
$ kubectl get nodes -o yaml # albo $ kubectl get nodes -o jsonTo świetny sposób, aby dowiedzieć się więcej o zasobach, oprócz przestudiowania specyfikacji zasobów.
4. Łatwe przełączanie między klastrami i przestrzeniami nazw
Kiedy kubectl wykonuje zapytanie do API Kubernetes, wcześniej odczytuje plik kubeconfig, aby uzyskać wszystkie niezbędne parametry do połączenia.
Domyślnie plik kubeconfig to ~/.kube/config. Zazwyczaj ten plik jest tworzony lub aktualizowany przez specjalne polecenie.
Gdy pracujesz z wieloma klastrami, twój plik kubeconfig zawiera parametry połączenia do wszystkich tych klastrów. Potrzebujesz sposobu, aby wskazać komendzie kubectl, z którym dokładnie klastrem pracujesz.
W obrębie klastra możesz utworzyć wiele przestrzeni nazw — rodzaj wirtualnego klastra w obrębie fizycznego klastra. Kubectl określa, którą przestrzeń nazw używać na podstawie danych pliku kubeconfig. Oznacza to, że potrzebujesz także sposobu na wskazanie komendzie kubectl, z którą przestrzenią nazw pracować.
W tym rozdziale opowiemy, jak to działa i jak osiągnąć efektywną pracę.
Zauważ, że możesz mieć wiele plików kubeconfig wymienionych w zmiennej środowiskowej KUBECONFIG. W takim przypadku wszystkie te pliki zostaną połączone w jedną wspólną konfigurację podczas wykonywania. Możesz także zmienić domyślny plik kubeconfig, uruchamiając kubectl z parametrem --kubeconfig. Zobacz .
Pliki kubeconfig
Przyjrzyjmy się, co dokładnie zawiera plik kubeconfig:

Jak widać, plik kubeconfig zawiera zestaw kontekstów. Kontekst składa się z trzech elementów:
- Cluster — URL API serwera klastra.
- User — dane uwierzytelniające użytkownika w klastrze.
- Namespace — przestrzeń nazw używana podczas łączenia się z klastrem.
W praktyce często używa się jednego kontekstu na klaster w pliku kubeconfig. Niemniej jednak możesz mieć kilka kontekstów dla klastra, różniących się użytkownikiem lub przestrzenią nazw. Taka konfiguracja z wieloma kontekstami jest jednak rzadkością, więc zazwyczaj istnieje jednoznaczne odwzorowanie między klastrami a kontekstami.
W każdym momencie jeden z kontekstów jest bieżący:

Gdy kubectl odczytuje plik konfiguracyjny, zawsze bierze informacje z bieżącego kontekstu. W powyższym przykładzie kubectl połączy się z klastrem Hare.
Odpowiednio, aby przełączyć się na inny klaster, musisz zmienić bieżący kontekst w pliku kubeconfig:

Teraz kubectl połączy się z klastrem Fox.
Aby przełączyć się na inną przestrzeń nazw w tym samym klastrze, musisz zmienić wartość elementu namespace dla bieżącego kontekstu:

W powyższym przykładzie kubectl będzie korzystać z przestrzeni nazw Prod klastra Fox (wcześniej było ustawione na przestrzeń nazw Test).
Zauważ, że kubectl również oferuje opcje --cluster, --user, --namespace i --context, które pozwalają na nadpisanie poszczególnych elementów oraz samego bieżącego kontekstu, niezależnie od tego, co jest ustawione w pliku kubeconfig. Zobacz opcje kubectl.
Teoretycznie możesz ręcznie zmieniać parametry w pliku kubeconfig. Ale to jest niewygodne. Aby uprościć te operacje, istnieje wiele narzędzi, które pozwalają na automatyczne zmienianie parametrów.
Użyj kubectx
Bardzo popularne narzędzie do przełączania między klastrami i przestrzeniami nazw.
Narzędzie udostępnia polecenia kubectx i kubens do zmiany bieżącego kontekstu i przestrzeni nazw odpowiednio.
Jak już wspomniano, zmiana bieżącego kontekstu oznacza zmianę klastra, jeśli masz tylko jeden kontekst dla klastra.
Oto przykład użycia tych poleceń:

W zasadzie, te polecenia jedynie edytują plik kubeconfig, jak opisano powyżej.
Aby zainstalować kubectx, postępuj zgodnie z instrukcjami na
Oba polecenia wspierają autouzupełnianie nazw kontekstów i przestrzeni nazw, co pozwala uniknąć wpisywania ich w całości. Instrukcje dotyczące konfiguracji autouzupełniania .
Inną przydatną funkcją kubectx jest . Działa on w połączeniu z narzędziem , które trzeba zainstalować osobno. Instalacja fzf automatycznie udostępnia tryb interaktywny w kubectx. W trybie interaktywnym możesz wybierać kontekst i przestrzeń nazw za pomocą interaktywnego interfejsu pełnotekstowego, dostarczonego przez fzf.
Zastosowanie aliasów powłoki
Nie potrzebujesz osobnych narzędzi do zmiany bieżącego kontekstu i przestrzeni nazw, ponieważ kubectl również dostarcza polecenia do tego celu. Tak więc polecenie kubectl config udostępnia podpolecenia do edytowania plików kubeconfig.
Oto niektóre z nich:
kubectl config get-contexts: wyświetl wszystkie konteksty;kubectl config current-context: pobierz bieżący kontekst;kubectl config use-context: zmień bieżący kontekst;kubectl config set-context: zmień element kontekstu.
Jednak użycie tych poleceń bezpośrednio nie jest zbyt wygodne, ponieważ są one długie. Można więc stworzyć aliasy powłoki dla ich łatwej realizacji.
Stworzyłem zestaw aliasów oparty na tych poleceniach, które oferują funkcjonalność podobną do kubectx. Możesz zobaczyć ich działanie:

Zauważ, że aliasy wykorzystują fzf do dostarczania interaktywnego interfejsu pełnotekstowego (jak w interaktywnym trybie kubectx). Oznacza to, że musisz , aby używać tych aliasów.
Oto definicje aliasów:
# Получить текущий контекст
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/^..//")"' Aby zainstalować te aliasy, musisz dodać podane powyżej definicje do swojego pliku ~\/ .bashrc lub ~/.zshrc i ponownie uruchomić swoją powłokę.
Zastosowanie wtyczek
Kubectl pozwala na ładowanie wtyczek, które działają tak jak podstawowe polecenia. Można na przykład zainstalować wtyczkę kubectl-foo i uruchamiać ją, wykonując polecenie kubectl foo.
Byłoby wygodnie zmieniać kontekst i przestrzeń nazw w ten sposób, na przykład uruchamiając kubectl ctx do zmiany kontekstu i kubectl ns do zmiany przestrzeni nazw.
Napisałem dwa pluginy, które to robią:
Działanie pluginów opiera się na aliasach z poprzedniego rozdziału.
Oto jak one działają:

Zauważ, że pluginy używają fzf do zapewnienia interaktywnego interfejsu swobodnego wyszukiwania (jak w interaktywnym trybie kubectx). Oznacza to, że musisz, aby używać tych aliasów.
Aby zainstalować pluginy, musisz pobrać skrypty powłoki o nazwach i do dowolnego katalogu w swojej zmiennej PATH i uczynić je wykonywalnymi, na przykład za pomocą chmod +x. Zaraz po tym będziesz mógł używać kubectl ctx i kubectl ns.
5. Skrócenie wejścia za pomocą autoaliasów
Aliaszy powłoki to dobra możliwość przyspieszenia wprowadzania. Projekt zawiera około 800 skrótów dla podstawowych poleceń kubectl.
Możesz się zdziwić — jak zapamiętać 800 aliasów? Ale nie musisz pamiętać ich wszystkich, ponieważ są one skonstruowane według prostego schematu, który przedstawiony jest poniżej:

Na przykład:
- 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
Jak widzisz, aliasy składają się z komponentów, z których każdy oznacza określony element polecenia kubectl. Każdy alias może mieć jeden komponent dla podstawowego polecenia, operacji i zasobu oraz kilka komponentów dla parametrów. Po prostu "wypełniasz" te komponenty od lewej do prawej zgodnie z przedstawionym powyżej schematem.
Aktualny szczegółowy schemat znajduje się na . Tam możesz również znaleźć.
Na przykład alias kgpooyamlall jest równoważny poleceniu kubectl get pods -o yaml --all-namespaces.
Relatywna kolejność opcji nie ma znaczenia: polecenie kgpooyamlall jest równoważne poleceniu kgpoalloyaml.
Możesz nie używać wszystkich komponentów jako aliasów. Na przykład k, kg, klo, ksys, kgpo można także używać. Co więcej, w wierszu poleceń można łączyć aliasy z zwykłymi poleceniami lub opcjami:
Na przykład:
- Zamiast
kubectl proxymożna napisaćk proxy. - Zamiast
kubectl get rolesmożna napisaćkg roles(obecnie nie istnieje alias dla zasobu Roles). - Aby uzyskać dane dla konkretnego poda, można użyć polecenia
kgpo my-pod — kubectl get pod my-pod.
Pamiętaj, że niektóre aliasy wymagają argumentu w wierszu poleceń. Na przykład alias kgpol oznacza kubectl get pods -l. Opcja -l wymaga argumentu – specyfikacji etykiety. Jeśli używasz aliasu, będzie on wyglądał jak kgpol app=ui.
Ze względu na to, że część aliasów wymaga argumentów, aliasy a, f i l należy używać jako ostatnich.
Ogólnie rzecz biorąc, gdy już opanujesz ten schemat, będziesz mógł intuicyjnie wydobywać aliasy z poleceń, które chcesz wykonać, oszczędzając dużo czasu na ich wprowadzanie.
Instalacja
Aby zainstalować kubectl-aliases, musisz pobrać plik z GitHub i dołączyć go do pliku ~\/ .bashrc lub ~/.zshrc:
source ~\/./kubectl_aliasesAutouzupełnianie
Jak już wspomnieliśmy, często dodajesz dodatkowe słowa do aliasu w wierszu poleceń. Na przykład:
$ kgpooyaml test-pod-d4b77b989Jeśli korzystasz z autouzupełniania polecenia kubectl, prawdopodobnie korzystałeś z autouzupełniania dla takich rzeczy jak nazwy zasobów. Ale czy można to zrobić, gdy używane są aliasy?
To bardzo ważne pytanie, ponieważ jeśli autouzupełnianie nie działa, stracisz część zalet aliasów.
Odpowiedź zależy od tego, jaką powłokę używasz:
- Dla Zsh autouzupełnianie dla aliasów działa "od razu".
- Dla Bash, niestety, potrzebne są dodatkowe kroki, aby autouzupełnianie zadziałało.
Włączenie autouzupełniania dla aliasów w Bash
Problem z Bash polega na tym, że stara się uzupełniać (za każdym razem, gdy naciśniesz Tab) alias, a nie polecenie, do którego odnosi się alias (tak jak robi to Zsh). Ponieważ nie masz skryptów uzupełniania dla wszystkich 800 aliasów, autouzupełnianie nie działa.
Projekt zapewnia ogólne rozwiązanie tego problemu. Podłącza się do mechanizmu uzupełniania dla aliasów, wewnętrznie uzupełnia alias do polecenia i zwraca opcje uzupełnienia dla uzupełnionego polecenia. Oznacza to, że uzupełnianie dla aliasu działa dokładnie tak samo jak dla pełnego polecenia.
Najpierw wyjaśnię, jak zainstalować complete-alias, a następnie jak skonfigurować go, aby włączyć uzupełnienie dla wszystkich aliasów kubectl.
Instalacja complete-alias
Przede wszystkim complete-alias zależy od . Dlatego przed instalacją complete-alias musisz upewnić się, że bash-completion jest zainstalowany. Instrukcje dotyczące instalacji zostały wcześniej podane dla Linux i MacOS.
Ważna uwaga dla użytkowników MacOS: podobnie jak skrypt autouzupełniania kubectl, complete-alias nie działa z Bash 3.2, który jest domyślnie używany w MacOS. W szczególności complete-alias zależy od bash-completion v2 (brew install bash-completion@2), co wymaga co najmniej Bash 4.1. Oznacza to, że aby korzystać z complete-alias na MacOS, musisz zainstalować nowszą wersję Bash.
Musisz pobrać skrypt z i włączyć go w swoim pliku ~\/ .bashrc:
source ~/bash_completion.shPo ponownym uruchomieniu powłoki, complete-alias będzie w pełni zainstalowany.
Włączenie autouzupełniania dla aliasów kubectl
Technicznie complete-alias zapewnia funkcję powłoki _complete_alias. Ta funkcja sprawdza alias i zwraca podpowiedzi uzupełnienia dla komendy aliasu.
Aby powiązać funkcję z danym aliasem, należy użyć wbudowanego mechanizmu Bash , aby ustawić _complete_alias jako funkcję uzupełnienia aliasu.
Na przykład przyjmijmy alias k, oznaczający komendę kubectl. Aby ustawić _complete_alias jako funkcję uzupełnienia dla tego aliasu, musisz wykonać następującą komendę:
$ complete -F _complete_alias k Wynikiem tego jest to, że za każdym razem, gdy autouzupełniasz alias k, wywoływana jest funkcja _complete_alias, która sprawdza alias i zwraca podpowiedzi uzupełnienia dla komendy kubectl.
Na drugi przykład weźmy alias kg, który oznacza kubectl get:
$ complete -F _complete_alias kg Podobnie jak w poprzednim przykładzie, kiedy autouzupełniasz kg, otrzymujesz te same podpowiedzi uzupełnienia, które uzyskałbyś dla kubectl get.
Zauważ, że w ten sposób można używać complete-alias dla dowolnego aliasu w Twoim systemie.
W związku z tym, aby włączyć autouzupełnianie dla wszystkich aliasów kubectl, musisz wykonać podaną powyżej komendę dla każdego z nich. Następujący fragment robi dokładnie to, zakładając, że zainstalowałeś kubectl-aliases w ~/kubectl-aliases:
for _a in $(sed '/^alias /!d;s/^alias //;s/=.*$//' ~/kubectl_aliases);
do
complete -F _complete_alias "$_a"
done Ten kawałek kodu należy umieścić w swoim ~\/ .bashrc, ponownie uruchomić powłokę i dla wszystkich 800 aliasów kubectl autouzupełnianie stanie się dostępne.
6. Rozszerzenie kubectl za pomocą wtyczek
Zaczynając od , kubectl obsługuje , które pozwalają na rozszerzenie jego funkcji dodatkowymi komendami.
Jeśli znasz , to wtyczki kubectl są zbudowane na tej samej zasadzie.
W tym rozdziale opowiemy, jak instalować wtyczki, gdzie ich szukać i jak tworzyć własne wtyczki.
Instalacja wtyczek
Wtyczki kubectl są dystrybuowane jako proste pliki wykonywalne o nazwach w postaci kubectl-x. Prefiks kubectl- jest obowiązkowy, następuje po nim nowa podkomenda kubectl, która umożliwia wywołanie wtyczki.
Na przykład, wtyczka hello będzie dystrybuowana jako plik o nazwie kubectl-hello.
Aby zainstalować wtyczkę, musisz skopiować plik kubectl-x do dowolnego katalogu w swojej zmiennej PATH i uczynić go wykonywalnym, na przykład za pomocą chmod +x. Tuż po tym możesz wywołać wtyczkę za pomocą kubectl x.
Możesz użyć następującej komendy, aby wyświetlić listę wszystkich wtyczek, które są obecnie zainstalowane w twoim systemie:
$ kubectl plugin listTa komenda również wyświetla ostrzeżenia, jeśli masz kilka wtyczek o tych samych nazwach, lub jeśli jest plik wtyczek, który nie jest wykonywalny.
Wyszukiwanie i instalacja wtyczek za pomocą Krew
Wtyczki Kubectl są odpowiednie do wspólnego lub ponownego użycia jak pakiety oprogramowania. Ale gdzie można znaleźć wtyczki, które zostały udostępnione przez innych?
ma na celu dostarczenie ujednoliconego rozwiązania do udostępniania, wyszukiwania, instalacji i zarządzania wtyczkami kubectl. Projekt nazywa siebie „menedżerem pakietów dla wtyczek kubectl” (Krew jest podobny do ).
Krew to lista wtyczek kubectl, które możesz wybierać i instalować. Przy tym Krew jest również wtyczką dla kubectl.
To oznacza, że instalacja Krew działa w zasadzie jak instalacja każdej innej wtyczki kubectl. Możesz znaleźć szczegółowe instrukcje na .
Najważniejsze komendy Krew:
# Поиск в списке плагинов
$ kubectl krew search [<query>]
# Посмотреть информацию о плагине
$ kubectl krew info <plugin>
# Установить плагин
$ kubectl krew install <plugin>
# Обновить все плагины до последней версии
$ kubectl krew upgrade
# Посмотреть все плагины, установленные через Krew
$ kubectl krew list
# Деинсталлировать плагин
$ kubectl krew remove <plugin>Weź pod uwagę, że instalacja wtyczek za pomocą Krew nie przeszkadza w instalacji wtyczek w tradycyjny sposób opisany powyżej.
Zauważ, że komenda kubectl krew list wyświetla tylko te wtyczki, które zostały zainstalowane za pomocą Krew, podczas gdy komenda kubectl plugin list wymienia wszystkie wtyczki, czyli te, które są zainstalowane za pomocą Krew, i te, które są zainstalowane innymi sposobami.
Wyszukiwanie wtyczek w innych miejscach
Krew to młody projekt, na ten moment w jego jest około 30 wtyczek. Jeśli nie możesz znaleźć tego, czego potrzebujesz, można znaleźć wtyczki w innym miejscu, na przykład na GitHubie.
Zalecam sprawdzić sekcję GitHub . Tam znajdziesz kilka dziesiątek dostępnych wtyczek, które warto sprawdzić.
Tworzenie własnych wtyczek
Możesz samodzielnie — to nie jest trudne. Musisz stworzyć plik wykonywalny, który zrobi to, co trzeba, nazwać go kubectl-x i zainstalować, jak opisano powyżej.
Plik może być skryptem bash, skryptem python lub skompilowaną aplikacją go — nie ma to znaczenia. Jedynym warunkiem jest to, aby mógł być bezpośrednio wykonywany w systemie operacyjnym.
Stwórzmy teraz przykład wtyczki. W poprzedniej sekcji użyłeś polecenia kubectl do wyświetlenia listy kontenerów dla każdego poda. Można łatwo zamienić to polecenie na wtyczkę, którą możesz wywołać, na przykład używając kubectl img.
Utwórz plik kubectl-img zawartości:
#!/bin/bash
kubectl get pods -o custom-columns='NAME:metadata.name,IMAGES:spec.containers[*].image' Teraz nadaj plikowi uprawnienia do wykonywalności za pomocą chmod +x kubectl-img i przenieś go do dowolnego katalogu w swoim PATH. Od razu po tym możesz korzystać z wtyczki kubectl img.
Jak już wspomniano, wtyczki kubectl mogą być napisane w dowolnym języku programowania lub skryptów. Jeśli używasz skryptów powłoki, to masz przewagę w łatwym wywoływaniu kubectl z wtyczki. Jednak możesz pisać bardziej złożone wtyczki w rzeczywistych językach programowania, korzystając z . Jeśli używasz Go, możesz również skorzystać z , która powstała specjalnie do pisania wtyczek kubectl.
Jak podzielić się swoimi wtyczkami
Jeśli uważasz, że twoje wtyczki mogą być przydatne dla innych, nie wahaj się dzielić nimi na GitHubie. Koniecznie dodaj je do tematu .
Możesz również poprosić o dodanie swojej wtyczki do . Instrukcje, jak to zrobić, znajdziesz w .
Automatyczne uzupełnianie poleceń
Obecnie wtyczki nie obsługują automatycznego uzupełniania. Musisz więc wpisywać pełne nazwy wtyczek i pełne nazwy argumentów.
W repozytorium GitHub kubectl znajduje się . Możliwe zatem, że ta funkcja zostanie wdrożona w przyszłości.
Powodzenia!!!
Co jeszcze przeczytać na ten temat:
- .
- .
- .
Źródło: habr.com







