Cómo utilizar el cliente de kubernetes para ejecutar "kubectl apply"

Dec 16 2020

Tengo un script de Python que básicamente ejecuta los siguientes tres comandos :

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

Quiero usar el cliente de kubernetes escrito en python para reemplazarlo. Mi código actual carga los archivos yaml (usando pyyaml), los edita un poco, los inserta en un archivo y usa la línea de comando kubectl para ejecutar esos tres comandos. Algunos de los códigos:

# 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 ...

Lo que quiero hacer: Reemplazar esos tres comandos con python kubernetes-client. Al leer los documentos y ver el tema , me encontré con el create_namespaced_deploymentmétodo que creo que necesito usar para el deployment_file_patharchivo. Pero parece que no puedo entender qué tengo que hacer con los otros dos archivos.

Suponiendo que ya he cargado los tres archivos YAML (usando PyYAML) y los editado (sin discriminar precios en nuevos archivos) y ahora tiene dicts YAML libres deployment_dict, class_dicty rbac_dict, ¿Cómo puedo utilizar el cliente para ejecutar los tres anteriores métodos?

EDITAR : Por cierto, si no es posible pasar los tres dictados, podría simplemente volcarlos en archivos nuevamente, pero quiero usar el cliente de Python en lugar de kubectl. ¿Cómo hacerlo?

Respuestas

1 anemyte Dec 23 2020 at 16:35

Hay una función separada para cada objeto y acción:

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

Cuando lo usa kubectl apply, no le importa si el objeto ya existe, qué API usar, qué método aplicar, pero con el cliente tendrá que hacerlo. Como puede ver en el ejemplo, necesita:

  1. Cargue kube-config.
  2. Seleccione la API correcta para usar (cree un objeto solo después de cargar la configuración).
  3. Seleccione el método que desea utilizar. Tenga en cuenta que create_somethingno funcionará si somethingya existe.

Gracias al estricto patrón de nomenclatura, es fácil obtener la función requerida del cliente usando

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

Te recomiendo que revises los ejemplos que proporciona la biblioteca, realmente son geniales para aprenderlo.

JanosVinceller Dec 29 2020 at 05:07

No tengo idea, pero en algún lugar vi esto:

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

Y dado que funciona, ¿funciona?

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