Связь с румпелем внутри кластера K8S через официальный метод java-client portForward - PullRequest
0 голосов
/ 03 мая 2019

Я сгенерировал Java-клиент из https://github.com/helm/helm/blob/master/_proto/hapi/services/tiller.proto

, и я могу локально разговаривать с тиллером внутри кластера с помощью созданного клиента:

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());

Но если я пытаюсьчтобы подключиться к экземпляру tiller внутри другого кластера, я должен как-то сделать переадресацию / туннель порта.

С официальным клиентом Java kubernetes я пытался использовать для этого метод 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 я получаю только потоки.С другой стороны, моему клиенту Tiller Protobuf / Grpc нужен Netty Channel, который можно создать только путем предоставления имени хоста и порта.

Я действительно не знаю, как соединить эти два конца вместе.Я знаю, что есть также клиент K8S от fabric8 и https://github.com/microbean/microbean-helm, который использует API fabric8 и выполняет более или менее точно то, что мне нужно, но, поскольку я уже реализовал довольно много вещей, используя официальный API, мой вопрос:Есть ли простой способ решить вышеупомянутую проблему с помощью официального API?

...