我有一个在 Kubernetes 集群中运行的 gRPC 微服务 A。当调用此服务时,我希望创建另一个 gRPC 微服务 B 的实例并在同一集群中运行它。我已经将第二个服务的镜像包含在容器 A 中。现在,我该如何创建并运行微服务 B 作为集群中的另一个 pod。
谢谢, Madhu
我有一个在 Kubernetes 集群中运行的 gRPC 微服务 A。当调用此服务时,我希望创建另一个 gRPC 微服务 B 的实例并在同一集群中运行它。我已经将第二个服务的镜像包含在容器 A 中。现在,我该如何创建并运行微服务 B 作为集群中的另一个 pod。
谢谢, Madhu
你所要求的是可以实现的,你可以使用 Kubernetes 客户端来启动一个 Pod,等待其状态,获取其 IP 并与其通信,然后将其关闭;但是你应该重新考虑你的设计。如果 Pod A 启动了 Pod B,并且在 Pod A 的工作过程中与 Pod B 断开连接,那么 Pod B 就会变成孤儿。这也是可以处理的,但我宁愿完全避免这种情况。尝试使用更灵活的耦合方式来设计你的系统,也许你可以使用队列而不是 gRPC?
我找到了一个很好的针对 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