研究了几个小时,终于成功调用,记录一下。
K8s的所有操作基本都是通过调用kube-apiserver这个组件进行的,它提供了restful api供外部系统访问,当然为了保证整个k8s集群的安全性,k8s提供了多种认证方式来保证集群的安全性:比如客户端证书、静态token、静态密码文件、ServiceAccountTokens等等。你可以同时使用一种或多种认证方式。只要通过任何一个都被认作是认证通过,我们一般都是使用证书方式:客户端证书认证叫作TLS双向认证。
调用方式:
1.命令行方式
2.java使用客户端client-java调用
命令行方式
执行命令调用api,查看命名空间default下所有pod:
curl https://localhost:6443/api/v1/namespaces/default/pods --cacert /etc/kubernetes/pki/apiserver.crt --cert /etc/kubernetes/pki/apiserver-kubelet-client.crt --key /etc/kubernetes/pki/apiserver-kubelet-client.key -k
执行结果:
java使用客户端client-java调用
1.配置客户端证书验证,我们通过配置一个kubelet.conf文件来讲解下。
红框标出的3个参数分别如下:
- certificate-authority-data:CA证书
- client-certificate-data:TLS 证书
- client-key-data:TLS Key
这里的三个参数,其实也可以使用路径方式配置,例如:
- certificate-authority:/etc/kubernetes/pki/apiserver.crt
- client-certificate:/etc/kubernetes/pki/apiserver-kubelet-client.crt
- client-key:/etc/kubernetes/pki/apiserver-kubelet-client.key
2.在pom文件引用jar包:
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
<version>4.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp</groupId>
<artifactId>okhttp</artifactId>
<version>2.5.0</version>
</dependency>
3.Java调用API
package com.data.k8s;
import java.io.IOException;
import io.kubernetes.client.ApiClient;
import io.kubernetes.client.ApiException;
import io.kubernetes.client.Configuration;
import io.kubernetes.client.apis.CoreV1Api;
import io.kubernetes.client.models.V1Node;
import io.kubernetes.client.models.V1NodeList;
import io.kubernetes.client.models.V1Pod;
import io.kubernetes.client.models.V1PodList;
import io.kubernetes.client.util.Config;
public class App
{
public static void main( String[] args ) throws IOException, ApiException
{
ApiClient client=Config.fromConfig("c:/kubelet.conf");
Configuration.setDefaultApiClient(client);
CoreV1Api api=new CoreV1Api();
V1PodList list=api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null);
for (V1Pod item:list.getItems()) {
System.out.println( item.getMetadata().getName());
}
}
}
成功调用接口,返回pod列表: