Согласитесь с комментариями об избежании этого, если возможно, но иногда у вас нет такого выбора. Мне приходилось делать что-то подобное раньше, я настоятельно рекомендую Python Kube Client для управления командами kubectl, у них есть отличная документация!
Следующий код будет читать docker-compose.yaml
строка файла и создание любых служб и развертываний, необходимых для запуска в Kube, с помощью команды Kompose.
import subprocess
import yaml
from kubernetes import client, config
def load_in_kube(compose_str):
COMPOSE_FILE_NAME = "compose.yaml"
with open(COMPOSE_FILE_NAME, "w") as text_file:
text_file.write(compose_str)
# Save the output to string, rather than a file.
output = subprocess.check_output(["kompose", "convert", "-f", COMPOSE_FILE_NAME, "--stdout"])
yaml_output = yaml.safe_load(output)
config.load_kube_config("service-controller/.kube/config")
for item in yaml_output["items"]:
if item["kind"] == "Service":
try:
kube_client = client.CoreV1Api()
namespace = "default"
kube_client.create_namespaced_service(namespace, item, pretty="true")
except Exception as e:
print(f"Exception when trying to create the service in Kube: {e}\n")
elif item["kind"] == "Deployment":
try:
kube_client = client.AppsV1Api()
namespace = "default"
kube_client.create_namespaced_deployment(namespace, item, pretty="true")
except Exception as e:
print(f"Exception when trying to create the service in Kube: {e}\n")
if __name__ == "__main__":
compose_str = """version: "3.1"
services:
hello-world:
build: .
image: hello-world-api
container_name: hello-world
ports:
- "5555:5555"
entrypoint: python api.py
environment:
- DEBUG=True
"""
load_in_kube(compose_str)