Jak używać klienta kubernetes do wykonywania polecenia „kubectl apply”

Dec 16 2020

Mam skrypt w Pythonie, który zasadniczo uruchamia następujące trzy polecenia :

kubectl apply -f class.yaml
kubectl apply -f rbac.yaml
kubectl apply -f deployment-arm.yaml

Chcę użyć klienta kubernetes napisanego w Pythonie, aby go zastąpić. Mój obecny kod, ładuje tam pliki yaml (używając pyyaml), edytuje je trochę, wstawia do pliku i używa kubectl wiersza poleceń do wykonania tych trzech poleceń. Część kodu:

# load files, edit them and dump into new files, part ...
result = run(['kubectl', 'apply', '-f', class_file_path])
# status check part ...
result = run(['kubectl', 'apply', '-f', rbac_file_path])
# status check part ...
result = run(['kubectl', 'apply', '-f', deployment_file_path])
# status check part ...

Co chcę zrobić: Zastąp te trzy polecenia klientem python kubernetes. Czytając dokumentację i widząc temat , natknąłem się na create_namespaced_deploymentmetodę, której myślę, że muszę użyć dla deployment_file_pathpliku. Ale wydaje mi się, że nie wiem, co muszę zrobić z dwoma innymi plikami.

Zakładając, że już załadowany trzy pliki yaml (używając pyyaml) i edytować je (bez dumpingu do nowych plików), a teraz masz wolne dicts yaml deployment_dict, class_dictoraz rbac_dictw jaki sposób można korzystać z klienta, aby wykonać trzy powyższe metody?

EDYCJA : BTW, jeśli nie jest możliwe przekazanie trzech dykt, mogę po prostu wrzucić je ponownie do plików, ale chcę użyć klienta Pythona zamiast kubectl. Jak to zrobić?

Odpowiedzi

1 anemyte Dec 23 2020 at 16:35

Dla każdego obiektu i akcji istnieje osobna funkcja:

from kubernetes import client, config
import yaml

body = yaml.safe_load("my_deployment.yml")
config.load_kube_config()
apps_api = client.AppsV1Api()
apps_api.create_namespaced_deployment(body=body, namespace="default")
apps_api.replace_namespaced_deployment(body=body, namespace="default")
apps_api.patch_namespaced_deployment(body=body, namespace="default")
apps_api.delete_namespaced_deployment(body=body, namespace="default")

body = yaml.safe_load("my_cluster_role.yml")
rbac_api = client.RbacAuthorizationV1Api()
rbac_api.create_cluster_role(body=body)
rbac_api.patch_cluster_role(body=body)
rbac_api.replace_cluster_role(body=body)
rbac_api.delete_cluster_role(body=body)

# And so on

Kiedy używasz kubectl apply, nie obchodzi cię, czy obiekt już istnieje, jakiego API użyć, jaką metodę zastosować, ale z klientem będziesz musiał. Jak widać na przykładzie, musisz:

  1. Załaduj kube-config.
  2. Wybierz odpowiedni interfejs API do użycia (utwórz obiekt dopiero po załadowaniu konfiguracji).
  3. Wybierz metodę, której chcesz użyć. Zauważ, że create_somethingnie zadziała, jeśli somethingplik już istnieje.

Dzięki ścisłemu wzorowi nazewnictwa łatwo jest uzyskać wymaganą funkcję od klienta za pomocą

getattr(some_k8s_api, f"{verb}_{namespaced_or_not}_{kind.lower()}")

Polecam przejrzenie przykładów, które zapewnia biblioteka, są one naprawdę świetne, aby się tego nauczyć.

JanosVinceller Dec 29 2020 at 05:07

Nie mam pojęcia, ale gdzieś to widziałem:

cat <<EOF | kubectl apply -f -
<<here the content of the yaml>>
EOF

Skoro to działa, czy to działa?

cat class.yaml rbac.yaml deployment-arm.yaml | kubectl apply -f -