Comment utiliser le client kubernetes pour exécuter «kubectl apply»

Dec 16 2020

J'ai un script python qui exécute essentiellement les trois commandes suivantes :

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

Je veux utiliser le client kubernetes écrit en python pour le remplacer. Mon code actuel, charge les fichiers yaml (en utilisant pyyaml), les édite un peu, les insère dans un fichier et utilise la ligne de commande kubectl pour exécuter ces trois commandes. Certains 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 ...

Ce que je veux faire: remplacez ces trois commandes par le client python kubernetes. En lisant la documentation et en voyant le sujet , je suis tombé sur la create_namespaced_deploymentméthode que je pense devoir utiliser pour le deployment_file_pathfichier. Mais je n'arrive pas à comprendre ce que je dois faire avec les deux autres fichiers.

En supposant que je l' ai déjà chargé les trois fichiers YAML ( en utilisant des PyYAML) et elles ont été éditées (sans dumping dans de nouveaux fichiers) et maintenant vous avez dicts YAML libres deployment_dict, class_dictet rbac_dict, Comment puis - je utiliser le client pour exécuter les trois méthodes ci - dessus?

EDIT : BTW s'il n'est pas possible de passer les trois dicts, je pourrais simplement les vider à nouveau dans des fichiers mais je veux utiliser le client python au lieu du kubectl. Comment faire?

Réponses

1 anemyte Dec 23 2020 at 16:35

Il existe une fonction distincte pour chaque objet et action:

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

Lorsque vous utilisez, kubectl applyvous ne vous souciez pas de savoir si l'objet existe déjà, de l'API à utiliser, de la méthode à appliquer, mais avec le client, vous devrez le faire. Comme vous le voyez dans l'exemple, vous devez:

  1. Chargez kube-config.
  2. Sélectionnez la bonne API à utiliser (créez un objet uniquement après avoir chargé la configuration).
  3. Sélectionnez la méthode que vous souhaitez utiliser. Notez que create_somethingcela ne fonctionnera pas si le somethingfichier existe déjà.

Grâce au modèle de dénomination strict, il est facile d'obtenir la fonction requise du client en utilisant

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

Je vous recommande de parcourir les exemples fournis par la bibliothèque, ils sont vraiment géniaux pour apprendre la chose.

JanosVinceller Dec 29 2020 at 05:07

Je n'ai aucune idée, mais quelque part j'ai vu ceci:

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

Et pris cela fonctionne, est-ce que cela fonctionne?

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