通过官方的Java客户端portForward方法与K8S集群内的分er进行通信

时间:2019-05-03 17:52:10

标签: java protocol-buffers netty kubernetes-helm grpc-java

我已经从https://github.com/helm/helm/blob/master/_proto/hapi/services/tiller.proto生成了Java客户端

并且我能够与创建的客户端在集群内部本地与分till交谈:

ManagedChannel channel = NettyChannelBuilder
    .forAddress("tiller-deploy.kube-system.svc.cluster.local", 44134)
    .negotiationType(NegotiationType.PLAINTEXT).build();

ReleaseServiceGrpc.ReleaseServiceBlockingStub blockingStub = 
  ReleaseServiceGrpc.newBlockingStub(channel).withCallCredentials(new CallCredentials() {

  @Override
  public void applyRequestMetadata(RequestInfo requestInfo, Executor executor, MetadataApplier metadataApplier) {
    Metadata metadata = new Metadata();
    metadata.put(Metadata.Key.of("x-helm-api-client", Metadata.ASCII_STRING_MARSHALLER), "v2.13.1");
    metadataApplier.apply(metadata);
  }

  @Override
  public void thisUsesUnstableApi() {
  }
});

Tiller.GetHistoryResponse history = blockingStub.getHistory(Tiller.GetHistoryRequest.newBuilder()
    .setName(name).setMax(10).build());

但是,如果我要连接到另一个群集中的分till实例,则必须以某种方式进行端口转发/隧道操作。

在正式的kubernetes Java客户端中,我尝试为此使用portForward方法:

ApiClient client = createClient();

PortForward f = new PortForward(client);
PortForward.PortForwardResult forward = f.forward(tillerPod, Collections.singletonList(44134));

InputStream os = forward.getOutboundStream(44134);
InputStream is = forward.getInputStream(44134);

但是从这个API我只能得到Streams。另一方面,我的Tiller Protobuf / Grpc客户端需要只能创建的Netty渠道 通过提供主机名和端口。

我真的不知道如何将这两个目的放在一起。我知道,还有fabric8和https://github.com/microbean/microbean-helm的K8S客户端 使用fabric8 API或多或少地完全满足了我的需要,但是由于我已经使用官方API实现了很多东西 我的问题是:有没有一种简便的方法可以通过官方API解决上述问题?

0 个答案:

没有答案