Как использовать kubernetes-client для выполнения «kubectl apply»
У меня есть скрипт 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. Как это сделать?
Ответы
Для каждого объекта и действия есть отдельная функция:
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 использовать, какой метод применить, но с клиентом вам придется. Как видно из примера, вам необходимо:
- Загрузите kube-config.
- Выберите правильный API для использования (создайте объект только после загрузки конфигурации).
- Выберите метод, который хотите использовать. Обратите внимание, что
create_something
не будет работать, если онsomething
уже существует.
Благодаря строгому шаблону именования легко получить необходимую функцию от клиента, используя
getattr(some_k8s_api, f"{verb}_{namespaced_or_not}_{kind.lower()}")
Я рекомендую вам просмотреть примеры, которые предоставляет библиотека, они действительно хороши для изучения этой вещи.
Понятия не имею, но где-то видел вот это:
cat <<EOF | kubectl apply -f -
<<here the content of the yaml>>
EOF
И если это работает, это работает?
cat class.yaml rbac.yaml deployment-arm.yaml | kubectl apply -f -