用Java创建Kubernetes服务

时间:2015-10-27 15:50:33

标签: java service kubernetes fabric8

我正在使用fabric8.io在Kubernetes中编排应用程序容器。我正在寻找创建一个服务来管理某个端口上具有特定标签的pod。是否有API的特定示例执行此操作。我在例子中找不到它

https://github.com/fabric8io/kubernetes-client/blob/master/kubernetes-examples/src/main/java/io/fabric8/kubernetes/examples/FullExample.java#L75

似乎没有javadoc可用???

3 个答案:

答案 0 :(得分:6)

Fabric8的Kubernetes客户端使用的生成模型和DSL具有与精确结构。

因此,为了创建一个看起来像的服务实例:

 {
   "kind": "Service",
   "apiVersion": "v1",
   "metadata": {
       "name": "myservice"
   },
   "spec": {
       "ports": [
           {
              "protocol": "TCP",
              "port": 80,
              "targetPort": 8080,
          }
      ],
      "selector": {
          "key": "value1",
      },¬
      "portalIP": "172.30.234.134",
      "type": "ClusterIP",
  }

}

您可以使用以下代码:

Service service = new ServiceBuilder()
          .withNewMetadata()
              .withName("myservice")
          .endMetadata()
          .withNewSpec()
            .addNewPort()
              .withProtocol("TCP")
              .withPort(80)
              .withNewTargetPort(8080)
            .endPort()
            .addToSelector("key1", "value1")
            .withPortalIP("172.30.234.134")
            .withType("ClusterIP")
          .endSpec()
          .build();

如果不需要保存服务对象的引用而您只想创建它,则可以将其内联为:

client.services().createNew()
          .withNewMetadata()
              .withName("myservice")
          .endMetadata()
          .withNewSpec()
            .addNewPort()
              .withProtocol("TCP")
              .withPort(80)
              .withNewTargetPort(8080)
            .endPort()
            .addToSelector("key1", "value1")
            .withPortalIP("172.30.234.134")
            .withType("ClusterIP")
          .endSpec()
          .done();

JSON等效的更紧凑,因为可以提交默认值,也可以选择内联一些像选择器这样的东西。

这不仅适用于服务,也适用于每一个Kubernetes / Openshift资源。

如果你有JSON或YAML,你可以通过向客户端提供输入流来轻松加载它们:

Service service = client.services().load(inputStream).get();

此处有更多选项,例如直接创建服务:

Service newService = client.services().load(inputStream).create();

无论lang格式如何,记住结构始终是相同的总是有帮助的。几乎所有内容都可以内联,因此IDE中的选项卡完成确实非常有用。

答案 1 :(得分:3)

我使用相同的库,而你是对的,创建部门的文档有点缺乏。我不得不使用Eclipse来手动探索API,因为我也找不到任何解释。这是它的工作原理。

KubernetesClient client = new KubernetesClient(masterURL);
Service serv = (Service) KubernetesHelper.loadJson(serviceJson);
Service result = client.services().create(serv);

基本上,您使用KubernetesClient创建所有对象。它将为每个对象以及与之关联的任何操作提供方法(服务,复制控制器等)。第二行将服务定义文件或String加载到Service对象中。然后使用客户端在Kubernetes中创建对象。

KubernetesHelper对象可以加载yaml或json。您还可以使用ServiceBuilder对象以编程方式构建它。

编辑:在回顾标记为kubernetes的答案之后,我在一个问题中发现了这个问题基本上是一样的:example to deploy docker image on kubernetes from java

答案 2 :(得分:0)

如果你不知道你正在创建的资源类型(pod,服务,部署等),那么你可以使用

npm install -g@angular/cli

它将创建或更新已创建的资源。

注意: 如果要定义要在单个yaml文件中创建的多个资源以及使用最新的kubernetes客户端,则只能创建第一个资源。

使用kubernetes dashboard或kubectl,您应该能够在同一个yaml文件中创建多个资源。