Verwendung des kubernetes-Clients zum Ausführen von "kubectl apply"
Ich habe ein Python-Skript, das im Grunde die folgenden drei Befehle ausführt :
kubectl apply -f class.yaml
kubectl apply -f rbac.yaml
kubectl apply -f deployment-arm.yaml
Ich möchte den in Python geschriebenen kubernetes-Client verwenden , um ihn zu ersetzen. Mein aktueller Code lädt die dortigen yaml-Dateien (mit pyyaml
), bearbeitet sie ein wenig, fügt sie in eine Datei ein und verwendet die Befehlszeile kubectl, um diese drei Befehle auszuführen. Ein Teil des Codes:
# 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 ...
Was ich tun möchte: Ersetzen Sie diese drei Befehle durch den Python-Kubernetes-Client. Als ich die Dokumente las und das Thema sah , stieß ich auf die create_namespaced_deployment
Methode, die ich für die deployment_file_path
Datei verwenden muss. Aber ich kann anscheinend nicht herausfinden, was ich mit den beiden anderen Dateien tun muss.
Unter der Annahme , dass ich bereits die drei yaml Dateien (mit pyyaml) geladen und sie bearbeiten (ohne in neue Dateien Dumping) und jetzt haben Sie freien yaml dicts deployment_dict
, class_dict
und rbac_dict
, Wie kann ich den Client die drei oben genannten Methoden auszuführen?
BEARBEITEN : Übrigens, wenn es nicht möglich ist, die drei Wörter zu übergeben, könnte ich sie einfach wieder in Dateien ablegen, aber ich möchte den Python-Client anstelle des Kubectl verwenden. Wie es geht?
Antworten
Für jedes Objekt und jede Aktion gibt es eine separate Funktion:
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
Wenn Sie verwenden, ist es kubectl apply
Ihnen egal, ob das Objekt bereits vorhanden ist, welche API verwendet werden soll, welche Methode angewendet werden soll, aber beim Client müssen Sie dies tun. Wie Sie aus dem Beispiel sehen, müssen Sie:
- Laden Sie kube-config.
- Wählen Sie die richtige API aus (erstellen Sie ein Objekt erst, nachdem Sie die Konfiguration geladen haben).
- Wählen Sie die Methode aus, die Sie verwenden möchten. Beachten Sie, dass dies
create_something
nicht funktioniert, wenn dassomething
bereits vorhanden ist.
Dank des strengen Namensmusters ist es einfach, die erforderliche Funktion vom Client zu erhalten
getattr(some_k8s_api, f"{verb}_{namespaced_or_not}_{kind.lower()}")
Ich empfehle Ihnen, die Beispiele durchzugehen , die die Bibliothek bereitstellt. Sie sind wirklich großartig, um die Sache zu lernen.
Ich habe keine Ahnung, aber irgendwo habe ich das gesehen:
cat <<EOF | kubectl apply -f -
<<here the content of the yaml>>
EOF
Und genommen funktioniert das, funktioniert das?
cat class.yaml rbac.yaml deployment-arm.yaml | kubectl apply -f -