Verwendung des kubernetes-Clients zum Ausführen von "kubectl apply"

Dec 16 2020

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_deploymentMethode, die ich für die deployment_file_pathDatei 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_dictund 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

1 anemyte Dec 23 2020 at 16:35

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 applyIhnen 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:

  1. Laden Sie kube-config.
  2. Wählen Sie die richtige API aus (erstellen Sie ein Objekt erst, nachdem Sie die Konfiguration geladen haben).
  3. Wählen Sie die Methode aus, die Sie verwenden möchten. Beachten Sie, dass dies create_somethingnicht funktioniert, wenn das somethingbereits 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.

JanosVinceller Dec 29 2020 at 05:07

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 -