这里使用的包是
<dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java</artifactId> <version>9.0.0</version> </dependency> <dependency> <groupId>io.kubernetes</groupId> <artifactId>client-java-api</artifactId> <version>9.0.0</version> </dependency>
@Configuration
@Slf4j
public class K8sConfig {
@Value("${vtd.k8s.configDir}")
private String k8sConfigDir;
@Bean
public ApiClient configuration() throws IOException {
// ApiClient apiClient = new ApiClient();
ApiClient apiClient = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(k8sConfigDir))).build();
// 配置K8s ApiServer地址
io.kubernetes.client.openapi.Configuration.setDefaultApiClient(apiClient);
return apiClient;
}
}
这里需要说明下 k8sConfigDir 这个值 是k8s 权限验证的 config文件,如果本地跑的话 需要拷贝config下来到本地路径上面,我这里是
configDir: G:\parallel-simulation-platform\smul-controller\config
还需要注意这个config中的参数 server 如果是一个域名的话,要去修改hosts文件 把域名和ip做一个配置。也可以不是域名 直接写死 k8s的服务ip。
下面是创建pod:
@Test
public void testK8s() throws IOException, ApiException {
// 指定分类
Yaml.addModelMap("v1", "Pod", V1Pod.class);
// 加载配置文件
ResourceLoader resourceLoader =new DefaultResourceLoader();
InputStream inputStream = resourceLoader.getResource("k8s-templates/test_pod.yaml").getInputStream();
Reader reader = new InputStreamReader(inputStream);
V1Pod v1Pod = (V1Pod) Yaml.load(reader);
inputStream.close();
reader.close();
// 打印格式
System.out.println(Yaml.dump(v1Pod));
// 创建pod,是在默认的空间名称下创建的 所以是default
CoreV1Api api = new CoreV1Api();
V1Pod v1Pod1 = api.createNamespacedPod("default", v1Pod, "false", null, null);
//创建好后,获取默认空间名下,labels 名称是carlink的 pod列表
V1PodList list = api.listNamespacedPod("default", null, null, null, null, "k8s.kuboard.cn/name=carlink", null, null, null, null);
List<V1Pod> items = list.getItems();
System.out.println("容器个数:{}" + items.size());
System.out.println(items.get(0).getStatus().getPhase());
}
这里说明下,加载的配置文件,是放在项目的resouce 目录下的 k8s-templates 的目录下名称是test_pod.yaml
这里的labels 参数要写全如图:
k8s.kuboard.cn/name: carlink 对应写入的参数就是 k8s.kuboard.cn/name=carlink
这里读取这个yaml文件的方式是可以直接打包一起在生产环境中使用的。另外一种是通过
File 文件的读取绝对路径的方式,这种比较灵活的就是 可以单独修改yaml'文件不需要重新打包代码,根据实际情况选择符合自己的读取yaml文件方式。
删除pod:
@Test
public void getPodStatus() throws ApiException, IOException, InterruptedException {
CoreV1Api api = new CoreV1Api();
Date dates = new Date();
//这里的名称空间是default,删除labels为 k8s.kuboard.cn/name=carlink的pod,这里注意如果多个pod的labels 都一样 别误删除了不需要删除的,最好取不一样的名称。这里另外一种根据 pod名称来删除有异常。暂时未找到问题
V1Status status = api.deleteCollectionNamespacedPod("default",null,null,null,null,null, "k8s.kuboard.cn/name=carlink",null,null,null,null,30,null);
//V1Status status = api.deleteNamespacedPod("carlink","default",null, null, null,null,null,null);
System.out.println("status:"+ status.getStatus());
while (true){
V1PodList list = api.listNamespacedPod("default", null, null, null, null, "k8s.kuboard.cn/name=carlink", null, null, null, null);
List<V1Pod> items = list.getItems();
System.out.println("容器个数:{}" + items.size());
if (items.size() == 0){
System.out.println("删除时长:{}"+ChronoUnit.MILLIS.between(dates.toInstant(),new Date().toInstant()));
break;
}
Thread.sleep(2000);
}
}