Java Fabric 8 - Get Pods of Kubernetes service and starting service using Fabric8 Java API

10/26/2017

I am trying below code to get the available pods of Kubernetes service using Fabric8 java API

ConnectionExample.java:

package examples;

import java.util.*;

import io.fabric8.kubernetes.api.KubernetesClient;
import io.fabric8.kubernetes.api.KubernetesFactory;
import io.fabric8.kubernetes.api.model.IntOrString;
import io.fabric8.kubernetes.api.model.Service;

public class ConnectionExample {
   private String ip;
   private String port;

   public ConnectionExample(String ip, String port) {
      this.ip= ip;
      this.port = port;
   }

   public KubernetesClient getConnection() {
      final String URI = "http://" + ip+ ":" + port;
      final KubernetesClient kubernetes = new KubernetesClient(new KubernetesFactory(URI));

      return kubernetes;
   }
}

App.java

package examples;

/**
 * Hello world!
 *
 */
public class App {
    public static void main( String[] args ) {
        System.out.println( "Hello World!" );
        ConnectionExample connectionExample = new ConnectionExample("XXX.XXX.XXX.XX", "1234");
        System.out.println("Retrun: "+connectionExample.getConnection());

        System.out.println("List of Pods: "+connectionExample.getConnection().getPods());

        //connectionExample.getConnection().createService(entity, namespace)
    }
}   

I am getting below error

2017-10-26 15:09:04 WARN  PhaseInterceptorChain:452 - Interceptor for
WebClient has thrown exception, unwinding now
org.apache.cxf.interceptor.Fault: Could not send Message.
    at org.apache.cxf.interceptor.MessageSenderInterceptor$MessageSenderEndingInterceptor.handleMessage(MessageSenderInterceptor.java:64)
    at org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:307)
    at org.apache.cxf.jaxrs.client.AbstractClient.doRunInterceptorChain(AbstractClient.java:619)
    at org.apache.cxf.jaxrs.client.ClientProxyImpl.doChainedInvocation(ClientProxyImpl.java:674)
    at org.apache.cxf.jaxrs.client.ClientProxyImpl.invoke(ClientProxyImpl.java:224)
    at com.sun.proxy.$Proxy19.getPods(Unknown Source)
    at io.fabric8.kubernetes.api.KubernetesClient.getPods(KubernetesClient.java:154)
    at io.fabric8.kubernetes.api.KubernetesClient.getPods(KubernetesClient.java:149)

And also wondering how to pass username and password of the kubernetes service

I am trying to start kubernetes service from java class using fabric8 java API

-- Naga Sai A
fabric8
java
kubernetes

2 Answers

10/28/2017

You need to use ssl certificate from config file to authenitcate. copy your config file to $HOME/.kube/config location and try to run this example program.

/**
 * Copyright (C) 2015 Red Hat, Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *         http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.fabric8.kubernetes.examples;

import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.ConfigBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClientException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class ListExamples {

  private static final Logger logger = LoggerFactory.getLogger(ListExamples.class);

  public static void main(String[] args) {

    System.setProperty("KUBERNETES_AUTH_TRYKUBECONFIG_SYSTEM_PROPERTY","true");
    Config   config = Config.autoConfigure();


    try (final KubernetesClient client = new DefaultKubernetesClient(config)) {


      System.out.println(
        client.namespaces().list()
      );


      System.out.println(
        client.namespaces().withLabel("this", "works").list()
      );

      System.out.println(
        client.pods().withLabel("this", "works").list()
      );

   System.out.println(
        client.pods().inNamespace("test").withLabel("this", "works").list()
      );

      System.out.println(
        client.pods().inNamespace("test").withName("testing").get()
      );
    } catch (KubernetesClientException e) {
      logger.error(e.getMessage(), e);
    }
  }

}
-- sfgroups
Source: StackOverflow

2/28/2018
public static void main(String[] args) throws Exception{

    try {

        String url = "cluster_endpoint";
        String oathToken = "serviceAccountToken";
        Config config =  new ConfigBuilder()
                .withMasterUrl("")
                .withTrustCerts(true)
                .withOauthToken(oathToken.replaceAll("(\\r|\\n)", ""))
                .build();

        KubernetesClient client = new DefaultKubernetesClient(config);
        System.out.println(client.pods().inNamespace("default").list());

    } catch (KubernetesClientException kce) {
        logger.error("KubernetesClientException : {}, {}", KubernetesErrorUtil.getErrorMsg(kce), kce);
    } catch (Exception e){
        logger.error("Exception :");
        e.printStackTrace();
    }
}

This will get the client using serviceAccountToken. You can create service account and give it the required permissions by creating ClusterRole or Role and ClusterRoleBinding or RoleBinding.

Also there are other ways you can get the client:

  • 1) using kubeconfig file
  • 2) using certificate that is used in api-server

    Config config = new ConfigBuilder() .withMasterUrl(masterURL) .withClientCertFile(certFile) .build();

or contents of certificate file-

Config config = new ConfigBuilder() .withMasterUrl(masterURL) .withClientCertData(certFile) .build();

-- Rishi Anand
Source: StackOverflow