与民同乐 發表於 2020-5-21 23:41:00

Kubernetes fabric8 JavaAPI

<h3 id="kubernetes-fabric8-javaapi">Kubernetes fabric8 JavaAPI</h3>
<h4 id="一依赖准备">一、依赖准备</h4>
<pre><code class="language-java">&lt;dependency&gt;
        &lt;groupId&gt;io.fabric8&lt;/groupId&gt;
        &lt;artifactId&gt;kubernetes-client&lt;/artifactId&gt;
        &lt;version&gt;4.9.0&lt;/version&gt;
&lt;/dependency&gt;
下列展示代码中可能包含演示需要的依赖包,需要手动导入。全文手动原创,非其他博客及官方转载。
</code></pre>
<h4 id="二代码例子及分析">二、代码例子及分析</h4>
<h5 id="1客户端的创建">1.客户端的创建</h5>
<p>​        Kubernetes 的资源默认是对内部是可见并可以访问的,我们可以通过以下方式去访问Kubernetes 获取我们想要的资源。</p>
<ol>
<li>对于Kubernetes 可以通过 <strong>JavaAPI</strong> 通过安全证书文件、Token或admin.conf配置外部访问</li>
<li>同样也可以配置这些配置文件通过<strong>HTTP</strong>访问apiService访问</li>
<li>内部也可以通过<strong>kube-proxy</strong>将内部数据暴露出来进行访问的方式。</li>
</ol>
<h6 id="javaapi访问"><strong>JavaAPI访问</strong></h6>
<p>​        1.1 通过安全证书访问</p>
<p>需要安全证书文件:apiserver-kubelet-client.crt、apiserver-kubelet-client.key、ca.crt</p>
<pre><code class="language-java">//创建 Config 用于创建 Client
Config config = new ConfigBuilder()
                  .withMasterUrl("ip")
                  .withCaCertData("ca.crt内容")
                  .withClientCertData("apiserver-kubelet-client.crt内容")
                  .withClientKeyData("apiserver-kubelet-client.key内容")
                  .build();
// 创建Client
KubernetesClient kubernetesClient = new DefaultKubernetesClient(config);
</code></pre>
<p>​        1.2 通过配置文件访问</p>
<p>需要配置文件:admin.conf</p>
<pre><code class="language-java">config = Config.fromKubeconfig("admin.conf内容");
KubernetesClient kubernetesClient = new DefaultKubernetesClient(config);
</code></pre>
<p>​        1.3 kube-proxy 配置后通过 HTTP 直接访问</p>
<p>首先在服务器中开启kube-proxy代理暴露8080端口:nohup kubectl proxy --port=8080 &amp;</p>
<pre><code class="language-java">config = new ConfigBuilder().withMasterUrl("http://127.0.0.1:8080").build();
KubernetesClient kubernetesClient = new DefaultKubernetesClient(config);
//通过http访问k8s中的路径资源
HttpClient httpClient = HttpClientBuilder.create().build();

HttpGet httpGet = new HttpGet("http://127.0.0.1:8080/apis/devices.kubeedge.io/v1alpha1/devices");
                HttpResponse response = null;
                response = httpClient.execute(httpGet);
                HttpEntity responseEntity = response.getEntity();
                StatusLine statusLine = response.getStatusLine();
                int code = statusLine.getStatusCode();
                String result = EntityUtils.toString(responseEntity);
</code></pre>
<p>​        1.4 http浏览器直接访问K8S资源的,这里暂不讲解。</p>
<h5 id="2访问操作podnodespace等基础资源">2.访问操作pod、nodeSpace等基础资源</h5>
<pre><code class="language-java">//查看Pod
MixedOperation&lt;Pod, PodList, DoneablePod, PodResource&lt;Pod, DoneablePod&gt;&gt; operation= client.pods();
//创建Pod,获取资源处理类,在传入组装号的Pod类
NonNamespaceOperation pods =client.pods().inNamespace("default");
//配置Pod,还可以通过 pod 类组装,想要运行 这里的参数是不够的,仅作演示
Pod pod1 =new PodBuilder().withNewMetadata().withName("pod1").withNamespace("default").and().build();
pods.create(pod1);
//删除同上
pods.delete(pod1);
</code></pre>
<h5 id="3访问操作复杂管理器deployment控制器">3.访问操作复杂管理器Deployment控制器</h5>
<pre><code class="language-java">import io.fabric8.kubernetes.api.model.*;
import io.fabric8.kubernetes.api.model.apps.Deployment;
import io.fabric8.kubernetes.api.model.apps.DeploymentSpec;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
* @author wanchen.chen
* @ClassName K8sDeploymentConf
* @Despriction: 用于组合 Deployment
* @date 2020/5/17 23:40
* @Version 1.0
**/
public class K8sDeploymentConf {

    /**
   *
   * @param appName
   * @param image
   * @param nodeName
   * @return
   */
    public static Deployment getDepandDeployment(String appName,String image,String nodeName){
      //参数传递
      String appGroup = "appGroup";
      //参数
      Map&lt;String,String&gt; labels = new HashMap&lt;String,String&gt;();
      labels.put("app",appGroup);
      Map&lt;String,String&gt; nodeSelector = new HashMap&lt;String,String&gt;();
      nodeSelector.put("name",nodeName);
      //mataData 数据组装
      ObjectMeta mataData = new ObjectMeta();
      mataData.setName(appName);
      mataData.setLabels(labels);
      //镜像设置
      Container container = new Container();
      container.setName(appName);
      container.setImage(image);
      container.setImagePullPolicy("IfNotPresent");
      SecurityContext sc = new SecurityContext();
      sc.setPrivileged(true);
      container.setSecurityContext(sc);
      List&lt;Container&gt; containers = new ArrayList&lt;&gt;();
      containers.add(container);
      //Spec 数据组装
      //1.selector
      LabelSelector ls =new LabelSelector();
      ls.setMatchLabels(labels);
      //2.template
      ObjectMeta empMataData = new ObjectMeta();
      empMataData.setLabels(labels);
      PodSpec pods = new PodSpec();
      pods.setHostNetwork(true);
      pods.setNodeSelector(nodeSelector);
      pods.setContainers(containers);
      //2.2 组装
      PodTemplateSpec pt = new PodTemplateSpec();
      pt.setMetadata(empMataData);
      pt.setSpec(pods);
      //3.spec 组合
      DeploymentSpec ds = new DeploymentSpec();
      ds.setReplicas(1);
      ds.setSelector(ls);
      ds.setTemplate(pt);
      //Deployment 设置
      Deployment deployment =new Deployment();
      deployment.setApiVersion("apps/v1");
      deployment.setKind("Deployment");
      deployment.setMetadata(mataData);
      deployment.setSpec(ds);
      return deployment;
    }

}
</code></pre>
<p>Deployment操作:</p>
<pre><code class="language-java">//将基础Client转换为AppsAPIGroupClient,用于操作deployment
AppsAPIGroupClient oclient =client.adapt(AppsAPIGroupClient.class);
MixedOperation&lt;Deployment, DeploymentList, DoneableDeployment, RollableScalableResource&lt;Deployment, DoneableDeployment&gt;&gt; operation1
                =oclient.deployments();
//将资源转换为JSON 查看
DeploymentList deploymentList =operation1.list();
List&lt;Deployment&gt; deployments = deploymentList.getItems();
JSONArray jsonArray=JSON.parseArray(JSON.toJSONString(deployments));
//创建Deployment,返回创建好的Deployment文件
oclient.deployments().create(K8sDeploymentConf.getDepandDeployment("appName","image","nodeName"));
//删除同上,返回结果为boolean类型数据
oclient.deployments().delete(K8sDeploymentConf.getDepandDeployment("appName","image","nodeName"));
</code></pre>
<h4 id="三博客参考及持续更新">三、博客参考及持续更新</h4>
<p>感谢以下博客作业的辛苦创作,参考博客:</p>
<p>https://www.jianshu.com/p/6bce2c2d1853</p>
<p>https://blog.csdn.net/Ay_Ly/article/details/90404445</p>


</div>
<div id="MySignature" role="contentinfo">
    深夜码文不易,若对看官有帮助,望看官可以在右侧打赏。<br><br>
来源:https://www.cnblogs.com/wanchen-chen/p/12934449.html
頁: [1]
查看完整版本: Kubernetes fabric8 JavaAPI