这里使用的包是

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

 

 

Logo

开源、云原生的融合云平台

更多推荐