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

时间:2018-09-11 13:43:21

标签: kubernetes grpc-java

我在kubernetes集群中运行了一个grpc微服务A。调用此服务时,我想创建另一个grpc微服务B的实例,然后在同一集群中运行它。我将第二个服务的映像包含在容器A中。现在,我如何创建微服务B并将其作为集群中的另一个Pod运行。

谢谢 马杜

3 个答案:

答案 0 :(得分:1)

您不需要内部映像,您需要的是一个Kubernetes客户端,该客户端将用于创建部署/作业/吊舱。您的广告连播需要一个具有RBAC角色/集群角色的服务帐户,该帐户可以创建所需的内容。这样,您可以创建一个按需与kubernetes api交互并创建所需内容的服务。

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

答案 1 :(得分:0)

可以完全按照您的要求进行操作,可以使用kubernetes客户端并启动一个pod,等待其状态,获取其IP并与之对话,然后杀死它;但是,您应该重新考虑您的设计。有一个您不想处理自己的资源的原因-如果Pod A旋转Pod B并通过其工作的中途Pod A断开与Pod B的连接,则Pod B变成孤立的。也可以处理此问题,但我宁愿完全避免这种情况。尝试使用更灵活的耦合设计系统,也许您可​​以使用队列而不是grpc?

答案 2 :(得分:-1)

我找到了一个针对kubenetes API java-client https://github.com/fabric8io/kubernetes-client的优秀开源项目,并提供了有关如何执行此操作的示例。

我添加此示例是为了响应以下提出的好建议。

它具有创建Pod,Deployment,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();
    }

马杜