如何创建一个 Kubernetes 容器并从另一个 Pod 中运行它

4

我有一个在 Kubernetes 集群中运行的 gRPC 微服务 A。当调用此服务时,我希望创建另一个 gRPC 微服务 B 的实例并在同一集群中运行它。我已经将第二个服务的镜像包含在容器 A 中。现在,我该如何创建并运行微服务 B 作为集群中的另一个 pod。

谢谢, Madhu


抱歉,我应该提供更多细节。服务B是使用Python编写的grpc微服务。这是一个Watson服务,需要对一组数据进行训练。数据将使用电子表格从UI发送。服务A作为后端服务应该获取这些数据并为服务B使用这些数据旋转容器/ pod。服务B接收此数据并创建此数据的笛卡尔积(此数据将> 200MB),并将响应来自推送数据的用户的查询。任何其他用户都可以重复此过程。因此,对于每个用户的数据,我们需要旋转一个pod。 - Madhu
3个回答

1
你不需要在内部放置图片,而是需要一个Kubernetes客户端,用于创建部署/作业/容器。你的Pod需要一个有RBAC角色/集群角色的服务帐户,允许创建所需内容。这样,你可以创建一个服务,按需与Kubernetes API交互并创建所需内容。
总的来说,这与操作员的工作方式非常相似,因此查看https://github.com/operator-framework可能会提供一些有用的见解,但甚至只是在Pod内启动kubectl可能已经足够满足你的需求了。

感谢您提供的信息。我会仔细审查并尝试使用它。 - Madhu

0

你所要求的是可以实现的,你可以使用 Kubernetes 客户端来启动一个 Pod,等待其状态,获取其 IP 并与其通信,然后将其关闭;但是你应该重新考虑你的设计。如果 Pod A 启动了 Pod B,并且在 Pod A 的工作过程中与 Pod B 断开连接,那么 Pod B 就会变成孤儿。这也是可以处理的,但我宁愿完全避免这种情况。尝试使用更灵活的耦合方式来设计你的系统,也许你可以使用队列而不是 gRPC?


0

我找到了一个很好的针对 Kubernetes API 的 Java 客户端的开源项目https://github.com/fabric8io/kubernetes-client,其中还有一些操作示例。

我为下面提出的好建议添加了这个示例。

它包括创建 Pod、部署、Cron 作业等操作的范例。

比如,创建 Deployment 的示例代码可在以下链接找到: 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();
    }

Madhu


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。仅有链接的答案如果链接页面更改可能会变得无效。 - slfan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接