Come utilizzare il client kubernetes per eseguire "kubectl apply"
Ho uno script Python che fondamentalmente esegue i seguenti tre comandi :
kubectl apply -f class.yaml
kubectl apply -f rbac.yaml
kubectl apply -f deployment-arm.yaml
Voglio usare il client kubernetes scritto in python per sostituirlo. Il mio codice attuale, carica i file there yaml (usando pyyaml), li modifica un po ', li inserisce in un file e usa la riga di comando kubectl per eseguire quei tre comandi. Alcuni dei codici:
# 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 ...
Cosa voglio fare: sostituire questi tre comandi con il client kubernetes python. Leggendo i documenti e vedendo l' argomento , mi sono imbattuto nel create_namespaced_deploymentmetodo che penso di dover utilizzare per il deployment_file_pathfile. Ma non riesco a capire cosa devo fare con gli altri due file.
Supponendo che ho già caricato i tre file YAML (utilizzando pyyaml) e modificato (senza dumping in nuovi file) e ora avete dicts YAML liberi deployment_dict, class_dicte rbac_dict, come posso utilizzare il client per eseguire il tre di cui sopra metodi?
EDIT : BTW se non è possibile passare i tre dict, potrei semplicemente scaricarli di nuovo in file ma voglio usare il client python invece di kubectl. Come farlo?
Risposte
C'è una funzione separata per ogni oggetto e azione:
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
Quando usi kubectl applynon ti interessa se l'oggetto esiste già, quale API usare, quale metodo applicare, ma con il client dovrai farlo. Come vedi dall'esempio, devi:
- Carica kube-config.
- Seleziona l'API giusta da usare (crea un oggetto solo dopo aver caricato la configurazione).
- Seleziona il metodo che desideri utilizzare. Nota che
create_somethingnon funzionerà se il filesomethingesiste già.
Grazie al rigoroso modello di denominazione è facile ottenere la funzione richiesta dal client utilizzando
getattr(some_k8s_api, f"{verb}_{namespaced_or_not}_{kind.lower()}")
Ti consiglio di passare attraverso gli esempi forniti dalla libreria, sono davvero fantastici per imparare la cosa.
Non ne ho idea, ma da qualche parte ho visto questo:
cat <<EOF | kubectl apply -f -
<<here the content of the yaml>>
EOF
E visto che funziona, funziona?
cat class.yaml rbac.yaml deployment-arm.yaml | kubectl apply -f -