Comment utiliser le client kubernetes pour exécuter «kubectl apply»
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_deployment
méthode que je pense devoir utiliser pour le deployment_file_path
fichier. 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_dict
et 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
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 apply
vous 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:
- Chargez kube-config.
- Sélectionnez la bonne API à utiliser (créez un objet uniquement après avoir chargé la configuration).
- Sélectionnez la méthode que vous souhaitez utiliser. Notez que
create_something
cela ne fonctionnera pas si lesomething
fichier 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.
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 -