Jak używać klienta kubernetes do wykonywania polecenia „kubectl apply”
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_deployment
metodę, której myślę, że muszę użyć dla deployment_file_path
pliku. 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_dict
oraz rbac_dict
w 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
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:
- Załaduj kube-config.
- Wybierz odpowiedni interfejs API do użycia (utwórz obiekt dopiero po załadowaniu konfiguracji).
- Wybierz metodę, której chcesz użyć. Zauważ, że
create_something
nie zadziała, jeślisomething
plik 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ć.
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 -