利用io.fabric8 java客户端操作k8s

1、导入jar包

        <!-- https://mvnrepository.com/artifact/io.fabric8/kubernetes-client -->
        <dependency>
            <groupId>io.fabric8</groupId>
            <artifactId>kubernetes-client</artifactId>
            <version>4.2.1</version>
        </dependency>

2、创建k8s客户端

由于是多集群的k8s客户端,利用集群id做key,缓存客户端

package com.cn21.mec.meao.common.cache;

import com.cn21.mec.core.entity.api.model.Cluster;
import com.cn21.mec.core.exception.ResourceNotFoundException;
import com.cn21.mec.core.utils.BaseCache;
import com.cn21.mec.meao.dao.ClusterDao;
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 org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static com.cn21.mec.core.constants.Constants.MEC_CLUSTER;

@Component
public class KubeClientCache extends BaseCache<Cluster, KubernetesClient> {
    private Map<Integer, KubernetesClient> kubernetesClientMap;

    @Resource
    private ClusterDao clusterDao;

    public KubeClientCache() {
        kubernetesClientMap = new HashMap<>();
    }

    @Override
    public void refresh() {
        List<Cluster> clusters = loadFromDB();

        for (Cluster cluster: clusters) {
            Config config = new ConfigBuilder()
                    .withMasterUrl(cluster.getCcpAccessAddress())
                    .withCaCertData(cluster.getAccessCaData())
                    .withClientCertData(cluster.getAccessCrtData())
                    .withClientKeyData(cluster.getAccessKeyData())
                    .build();

            this.kubernetesClientMap.put(cluster.getClusterId(), new DefaultKubernetesClient(config));
        }
    }

    @Override
    protected List<Cluster> loadFromDB() {
        return clusterDao.getAll();
    }

    @Override
    public KubernetesClient get(Object key) {
        KubernetesClient kubernetesClient = kubernetesClientMap.get((Integer) key);
        if (kubernetesClient == null) {
            throw new ResourceNotFoundException(MEC_CLUSTER, key);
        }
        return kubernetesClient;
    }

    @Override
    public void set(Object key, KubernetesClient kubernetesClient) {
        this.kubernetesClientMap.put((Integer) key, kubernetesClient);
    }

    @Override
    public void delete(Object key) {
        this.kubernetesClientMap.remove((Integer) key);
    }

    @Override
    public void setWithExpireTime(Object key, KubernetesClient kubernetesClient, long seconds) {

    }
}
package com.cn21.mec.core.utils;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;

import java.util.List;

/**
 * Base Redis Cache
 * @author zoup
 * @version 2018-09-27
 */
public abstract class BaseCache<T, V> implements CommandLineRunner {
    @Autowired
    private CacheCenter cacheCenter;

    /**
     * 初始化
     * @author zoup
     */
    public void init() {
        cacheCenter.newCache(this);
        refresh();
    }

    /**
     * 刷新
     * @author zoup
     */
    public abstract void refresh();

    /**
     * 加载表数据
     * @author zoup
     * @return List<T> 数据库实体
     */
    protected abstract List<T> loadFromDB();

    /**
     * 读取缓存
     * @author zoup
     * @param key 缓存key
     * @return V 缓存实体
     */
    public abstract V get(Object key);

    /**
     * 写入缓存
     * @author zoup
     * @param key 缓存key
     * @param v 缓存实体
     */
    public abstract void set(Object key, V v);

    /**
     * 删除缓存
     * @param key 缓存key
     */
    public abstract void delete(Object key);

    /**
     * 写入缓存并设置过期时间,默认为String类型,时间单位为秒
     * @author zoup
     * @param key 缓存key
     * @param v 缓存实体
     */
    public abstract void setWithExpireTime(Object key, V v, long seconds);

    @Override
    public void run(String... args) throws Exception {
        init();
    }
}

3、对deployment进行操作


/* 1、设置deployment的唯一LabelSelector
*  2、设置pods的selector:orgId/serviceSetId/departmentId/deploymentName
*  3、创建,由缓存获取客户端,之后代码类似
*/
//设置deployment的唯一LabelSelector
pDeployment.getDeployment().getSpec().getSelector().getMatchLabels().put(Constants.ORG_ID,pDeployment.getDpOrgId().toString());

pDeployment.getDeployment().getSpec().getSelector().getMatchLabels().put(Constants.DEPARTMENT_ID,pDeployment.getDpDepartmentId().toString());

pDeployment.getDeployment().getSpec().getSelector().getMatchLabels().put(Constants.SERVICE_SET_ID,pDeployment.getServiceSetId().toString());

pDeployment.getDeployment().getSpec().getSelector().getMatchLabels().put(Constants.DEPLOYMENT_NAME,pDeployment.getName());


// 设置pods的selector:orgId/serviceSetId/departmentId/deploymentName

pDeployment.getDeployment().getSpec().getTemplate().getMetadata().getLabels().put(ORG_ID,pDeployment.getDpOrgId().toString());

pDeployment.getDeployment().getSpec().getTemplate().getMetadata().getLabels().put(Constants.DEPARTMENT_ID,pDeployment.getDpDepartmentId().toString());

pDeployment.getDeployment().getSpec().getTemplate().getMetadata().getLabels().put(Constants.SERVICE_SET_ID,pDeployment.getServiceSetId().toString());

pDeployment.getDeployment().getSpec().getTemplate().getMetadata().getLabels().put(Constants.DEPLOYMENT_NAME,pDeployment.getName());


// 创建
kubeClientCache.get(clusterId).apps().deployments().inNamespace(pDeployment.getNamespace()).create(deployment);

// 修改deployment
kubeClientCache.get(clusterId).apps().deployments().inNamespace(pDeployment.getNamespace()).withName(pDeployment.getName()).replace(deployment);

//获取详情
kubeClientCache.get(clusterId).apps().deployments().inNamespace(pDeployment.getNamespace()).withName(pDeploy.getName()).get();


// k8s删除 deployment rs pods,其中pods的labels为deployment中LabelSelector设置

//删除deployment,需要删除rs以及对应Labels的pods
Map<String, String> map = new HashMap<>();
map.put(ORG_ID, pDeploy.getDpOrgId().toString());
map.put(DEPARTMENT_ID, pDeploy.getDpDepartmentId().toString());
map.put(SERVICE_SET_ID, pDeploy.getServiceSetId().toString());
map.put(DEPLOYMENT_NAME, pDeploy.getName());

//删除deployment
kubeClientCache.get(clusterId).apps().deployments().inNamespace(pDeploy.getNamespace()).withName(pDeploy.getName()).delete();

//删除rs kubeClientCache.get(clusterId).apps().replicaSets().inNamespace(pDeploy.getNamespace()).withLabels(map).delete();

//删除pods
kubeClientCache.get(clusterId).pods().inNamespace(pDeploy.getNamespace()).withLabels(map).delete();

4、对service进行操作

//创建service
// 设置pods的selector :ServiceSetId作为service选择pods的唯一选择器   pService.getService().getSpec().getSelector().put(Constants.SERVICE_SET_ID,pService.getServiceSetId().toString());

pService.getService().getSpec().getSelector().put(Constants.ORG_ID,pService.getDpOrgId().toString());

pService.getService().getSpec().getSelector().put(Constants.DEPARTMENT_ID,pService.getDpDepartmentId().toString());

// 设置service的labels:orgId/departmentId/serviceSetId

pService.getService().getMetadata().getLabels().put(Constants.ORG_ID,pService.getDpOrgId().toString());

pService.getService().getMetadata().getLabels().put(Constants.DEPARTMENT_ID,pService.getDpDepartmentId().toString());

pService.getService().getMetadata().getLabels().put(Constants.SERVICE_SET_ID,pService.getServiceSetId().toString());


// 创建service
kubeClientCache.get(clusterId).services().inNamespace(pService.getNamespace()).create(service);


// 修改k8s service
kubeClientCache.get(clusterId).services().inNamespace(pService.getNamespace()).withName(redisPService.getName()).replace(service);


//获取service详情
kubeClientCache.get(clusterId).services().inNamespace(pService.getNamespace()).withName(redisPService.getName()).get();


//删除service
kubeClientCache.get(clusterId).services().inNamespace(redisPService.getNamespace()).withName(redisPService.getName()).delete();

5、对命名空间进行操作

// 创建命名空间
kubeClientCache.get(kubeBaseBean.getClusterId()).namespaces().create(namespace);

// 删除命名空间
 kubeClientCache.get(kubeBaseBean.getClusterId()).namespaces().withName(kubeBaseBean.getNamespace()).delete();

6、configMap进行操作

// 创建 configMap   其他操作与上类似
kubeClientCache.get(pConfigMap.getClusterId())
                .configMaps()
                .inNamespace(pConfigMap.getNamespace())
                .create(pConfigMap.getConfigMap());

 

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
好的,下面是集成 `io.fabric8 kubernetes-client` 的步骤: 1. 在 `pom.xml` 文件中加入 `io.fabric8` 的依赖: ```xml <dependency> <groupId>io.fabric8</groupId> <artifactId>kubernetes-client</artifactId> <version>4.13.0</version> </dependency> ``` 2. 创建 `KubernetesConfig` 类,用于配置 Kubernetes 的连接参数,例如: ```java import io.fabric8.kubernetes.client.Config; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class KubernetesConfig { @Value("${kubernetes.master}") private String kubernetesMaster; @Value("${kubernetes.api.token}") private String kubernetesApiToken; @Bean public Config kubernetesConfig() { Config config = new Config(); config.setMasterUrl(kubernetesMaster); config.setBearerToken(kubernetesApiToken); return config; } } ``` 其中,`kubernetes.master` 和 `kubernetes.api.token` 分别是 Kubernetes 的 API Server 地址和 API Token,可以通过配置文件或环境变量来设置。 3. 创建 `KubernetesClient` 类,用于创建 Kubernetes 的客户端对象,例如: ```java import io.fabric8.kubernetes.client.DefaultKubernetesClient; import io.fabric8.kubernetes.client.KubernetesClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class KubernetesClientConfig { @Autowired private Config kubernetesConfig; @Bean public KubernetesClient kubernetesClient() { return new DefaultKubernetesClient(kubernetesConfig); } } ``` 其中,`KubernetesClient` 是 `io.fabric8 kubernetes-client` 中的核心类,用于与 Kubernetes API Server 进行交互。 现在,你就可以在 Spring Boot 应用中使用 `KubernetesClient` 对象来操作 Kubernetes 了。
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值