Come utilizzare il client kubernetes per eseguire "kubectl apply"

Dec 16 2020

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

1 anemyte Dec 23 2020 at 16:35

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:

  1. Carica kube-config.
  2. Seleziona l'API giusta da usare (crea un oggetto solo dopo aver caricato la configurazione).
  3. Seleziona il metodo che desideri utilizzare. Nota che create_somethingnon funzionerà se il file somethingesiste 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.

JanosVinceller Dec 29 2020 at 05:07

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 -