我在kubernetes集群中运行了一个grpc微服务A。调用此服务时,我想创建另一个grpc微服务B的实例,然后在同一集群中运行它。我将第二个服务的映像包含在容器A中。现在,我如何创建微服务B并将其作为集群中的另一个Pod运行。
谢谢 马杜
答案 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等的示例。
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();
}
马杜