Как использовать kubernetes-client для выполнения «kubectl apply»

Dec 16 2020

У меня есть скрипт python, который в основном выполняет следующие три команды :

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

Я хочу использовать kubernetes-client, написанный на python, чтобы заменить его. Мой текущий код загружает там файлы yaml (используя pyyaml), немного редактирует их, вставляет в файл и использует командную строку kubectl для выполнения этих трех команд. Некоторые из кода:

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

Что я хочу сделать: заменить эти три команды на python kubernetes-client. Читая документы и просматривая тему , я наткнулся на create_namespaced_deploymentметод, который, как мне кажется, мне нужно использовать для deployment_file_pathфайла. Но я не могу понять, что мне нужно делать с двумя другими файлами.

Предполагая , что я уже загрузил три YAML файлов ( с помощью PyYAML) и редактировать их (без сброса в новые файлы) , и теперь у вас есть свободная YAML dicts deployment_dict, class_dictи rbac_dict, как я могу использовать клиент для выполнения трех выше методов?

РЕДАКТИРОВАТЬ : Кстати, если невозможно передать три dicts, я мог бы просто снова сбросить их в файлы, но я хочу использовать клиент python вместо kubectl. Как это сделать?

Ответы

1 anemyte Dec 23 2020 at 16:35

Для каждого объекта и действия есть отдельная функция:

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

Когда вы используете, kubectl applyвам все равно, существует ли объект уже, какой API использовать, какой метод применить, но с клиентом вам придется. Как видно из примера, вам необходимо:

  1. Загрузите kube-config.
  2. Выберите правильный API для использования (создайте объект только после загрузки конфигурации).
  3. Выберите метод, который хотите использовать. Обратите внимание, что create_somethingне будет работать, если он somethingуже существует.

Благодаря строгому шаблону именования легко получить необходимую функцию от клиента, используя

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

Я рекомендую вам просмотреть примеры, которые предоставляет библиотека, они действительно хороши для изучения этой вещи.

JanosVinceller Dec 29 2020 at 05:07

Понятия не имею, но где-то видел вот это:

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

И если это работает, это работает?

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