Как создать контейнер kubernetes и запустить его из другого модуля

У меня есть микросервис grpc A, работающий в кластере kubernetes. Когда эта служба вызывается, я хотел бы создать экземпляр другой микрослужбы grpc B и запустить ее в том же кластере. У меня есть образ второй службы, включенный в контейнер A. Теперь, как я могу создать и запустить микрослужбу B как еще один модуль в кластере.

Спасибо, Мадху.


person Madhu    schedule 11.09.2018    source источник
comment
Извините, я должен был предоставить более подробную информацию. Сервис B — это микросервис grpc, написанный с использованием python. Это служба Watson, которую необходимо обучить на наборе данных. Данные будут отправлены из пользовательского интерфейса в виде электронной таблицы. Внутренняя служба, которая является службой A, должна взять эти данные и создать контейнер/модуль для службы B с этими данными. Служба B берет эти данные и создает декартово произведение этих данных (эти данные будут >200 МБ) и будет отвечать на запросы пользователя, отправившего данные. Этот процесс может повторить любой другой пользователь. Таким образом, для данных каждого пользователя нам нужно раскрутить модуль.   -  person Madhu    schedule 12.09.2018


Ответы (3)


Вам не нужен образ внутри, вам нужен клиент kubernetes, который вы будете использовать для создания развертывания/задания/модуля. Для вашего модуля требуется учетная запись службы с ролью/кластерной ролью RBAC, позволяющей создавать то, что вам нужно. Таким образом вы можете создать сервис, который по запросу взаимодействует с API kubernetes и создает то, что вы хотите.

В целом, это очень похоже на то, как работают операторы, поэтому посмотрите на https://github.com/operator-framework может дать некоторую полезную информацию, но даже простого запуска kubectl внутри модуля может быть достаточно для ваших нужд.

person Radek 'Goblin' Pieczonka    schedule 11.09.2018
comment
Спасибо за информацию. Я рассмотрю предоставленную вами информацию и попробую. - person Madhu; 11.09.2018

Можно сделать именно то, что вы просите, вы можете использовать клиент kubernetes и запустить модуль, дождаться его статуса, получить его IP-адрес и поговорить с ним, а затем убить его; однако вы должны действительно переосмыслить свой дизайн. Есть причина, по которой вы не хотите управлять своими собственными ресурсами: если модуль A раскручивает модуль B и в середине своей работы модуль A теряет соединение с модулем B, модуль B становится осиротевшим. С этим тоже можно справиться, но я бы предпочел вообще этого избежать. Попробуйте разработать свои системы с более гибкой связью, может быть, вы можете использовать очередь вместо grpc?

person Lev Kuznetsov    schedule 11.09.2018

Я нашел этот хороший проект с открытым исходным кодом для java-клиента Kubenetes API https://github.com/fabric8io/kubernetes-client с примерами того, как это сделать.

Я добавил этот пример в ответ на хорошее предложение, сделанное ниже.

В нем есть примеры для создания модулей, развертываний, CronJob и т. д.

Для создания развертывания приведен пример: https://github.com/fabric8io/kubernetes-client/blob/master/kubernetes-examples/src/main/java/io/fabric8/kubernetes/examples/DeploymentExamples.java

public class DeploymentExamples {
  private static final Logger logger = 
    LoggerFactory.getLogger(DeploymentExamples.class);

  public static void main(String[] args) throws InterruptedException {
      Config config = new ConfigBuilder().build();
      KubernetesClient client = new DefaultKubernetesClient(config);

      try {
       // Create a namespace for all our stuff
       Namespace ns = new NamespaceBuilder()
             .withNewMetadata()
             .withName("thisisatest")
             .addToLabels("this", "rocks")
             .endMetadata().build();
       log("Created namespace", client.namespaces().createOrReplace(ns));

        ServiceAccount fabric8 = new ServiceAccountBuilder()
            .withNewMetadata()
            .withName("fabric8")
            .endMetadata().build();
        client
            .serviceAccounts()
            .inNamespace("thisisatest")
            .createOrReplace(fabric8);
        for (int i = 0; i < 2; i++) {
           System.out.println("Iteration:" + (i+1));
           Deployment deployment = new DeploymentBuilder()
                .withNewMetadata()
                .withName("nginx")
                .endMetadata()
                .withNewSpec()
                .withReplicas(1)
                .withNewTemplate()
                .withNewMetadata()
                .addToLabels("app", "nginx")
                .endMetadata()
                .withNewSpec()
                .addNewContainer()
                .withName("nginx")
                .withImage("nginx")
                .addNewPort()
                .withContainerPort(80)
                .endPort()
                .endContainer()
                .endSpec()
                .endTemplate()
                .withNewSelector()
                .addToMatchLabels("app", "nginx")
                .endSelector()
                .endSpec()
                .build();

            deployment = client
                 .apps()
                 .deployments()
                 .inNamespace("thisisatest")
                 .create(deployment);
            log("Created deployment", deployment);

            System.out.println("Scaling up:" + 
                deployment.getMetadata().getName());
            client
               .apps()
               .deployments()
               .inNamespace("thisisatest")
               .withName("nginx").scale(2, true);
            log("Created replica sets:", client.apps().replicaSets()
               .inNamespace("thisisatest").list().getItems());
            System.out.println("Deleting:" + 
               deployment.getMetadata().getName());
            client.resource(deployment).delete();
       }
       log("Done.");
    }finally {
        client.namespaces().withName("thisisatest").delete();
        client.close();
    }

Мадху

person Madhu    schedule 23.02.2019
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы только по ссылкам могут стать недействительными, если связанная страница изменится. - person slfan; 23.02.2019