【问题标题】:How to create a kubernetes container and run it from another pod如何创建一个 kubernetes 容器并从另一个 pod 运行它
【发布时间】:2018-09-11 13:43:21
【问题描述】:

我有一个 grpc 微服务 A 在 kubernetes 集群中运行。当调用这个服务时,我想创建另一个grpc微服务B的实例,并在同一个集群中运行它。我有容器 A 中包含的第二个服务的映像。现在如何创建和运行微服务 B 作为集群中的另一个 pod。

谢谢 马杜

【问题讨论】:

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

标签: kubernetes grpc-java


【解决方案1】:

你不需要里面有镜像,你需要的是一个 Kubernetes 客户端,你将使用它来创建部署/作业/pod。您的 pod 需要一个具有 RBAC 角色/集群角色的服务帐户,以便创建您需要的内容。通过这种方式,您可以创建一个按需与 kubernetes api 交互并创建您想要的内容的服务。

总而言之,这与操作员的工作方式非常相似,因此查看 https://github.com/operator-framework 可能会提供一些有用的见解,但即使只是在 pod 内启动 kubectl 也可能足以满足您的需求。

【讨论】:

  • 感谢您的信息。我会查看您提供的信息并尝试一下。
【解决方案2】:

可以完全按照您的要求进行操作,您可以使用 kubernetes 客户端并启动 pod,等待其状态,获取其 IP 并与之交谈,然后将其杀死;但是你真的应该重新考虑你的设计。您不想处理自己的资源是有原因的——如果 pod A 启动了 pod B,并且在其工作的中途 pod A 失去了与 pod B 的连接,则 pod B 成为孤立的。也可以处理这个问题,但我宁愿完全避免这种情况。尝试使用更灵活的耦合来设计您的系统,也许您可​​以使用队列而不是 grpc?

【讨论】:

    【解决方案3】:

    我为 kubenetes API java-client https://github.com/fabric8io/kubernetes-client 找到了这个很好的开源项目,并提供了如何执行此操作的示例。

    我添加了这个例子来响应下面的好建议。

    它有用于创建 Pod、部署、CronJobs 等的示例。

    为了创建一个部署,提供的示例是: 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();
        }
    

    马杜

    【讨论】:

    • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效
    猜你喜欢
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多