Python выполняет команду kompose и команду kubectl - PullRequest
0 голосов
/ 06 мая 2020

У меня есть проект, который должен прочитать службу Docker Compose, отправленную в другое место, и сохранить ее в compose.yaml, затем преобразовать ее в Kubernetes YAML через kompose и выполнить через kubectl, для чего требуется Python автоматизация.

Как это сделать?

1 Ответ

0 голосов
/ 12 августа 2020

Согласитесь с комментариями об избежании этого, если возможно, но иногда у вас нет такого выбора. Мне приходилось делать что-то подобное раньше, я настоятельно рекомендую 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)
...