1、pom.xml
<!-- k8s client -->
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
<version>12.0.1</version>
</dependency>
2、把k8s-confg配置放在项目的resource下
~/.kube/config
3、k8s服务器配置token
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
export CLUSTER_NAME="kubernetes"
APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 -d)
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
成功如下:
echo $TOKEN
4、把这个token配置到java项目中
5、k8s 连接工具类
import com.example.modelmanager.exception.BizException;
import io.kubernetes.client.custom.IntOrString;
import io.kubernetes.client.openapi.ApiClient;
import io.kubernetes.client.openapi.ApiException;
import io.kubernetes.client.openapi.apis.CoreV1Api;
import io.kubernetes.client.openapi.apis.ExtensionsV1beta1Api;
import io.kubernetes.client.openapi.apis.NetworkingV1Api;
import io.kubernetes.client.openapi.auth.ApiKeyAuth;
import io.kubernetes.client.openapi.models.*;
import io.kubernetes.client.util.ClientBuilder;
import io.kubernetes.client.util.KubeConfig;
import io.kubernetes.client.util.Yaml;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import org.springframework.util.ResourceUtils;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.util.Map;
@Slf4j
@Component
public class K8sHandleTools {
@Value("${k8s.token}")
private String k8sToken;
/*
* 加载yaml配置文件
*
* @param path
* @throws IOException
*/
public static Object loadYaml(String path) throws IOException {
Reader reader = new FileReader(path);
return Yaml.load(reader);
}
public ApiClient getApiClient(String k8sConfig) {
try {
String kubeConfigPath = ResourceUtils.getURL(k8sConfig).getPath();
ApiClient client =
ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build();
// Configuration.setDefaultApiClient(client);
// ApiClient defaultClient = Configuration.getDefaultApiClient();
// ApiKeyAuth BearerToken = (ApiKeyAuth) defaultClient.getAuthentication("BearerToken");
ApiKeyAuth BearerToken = (ApiKeyAuth) client.getAuthentications().get("BearerToken");
BearerToken.setApiKey(k8sToken);
return client;
} catch (IOException e) {
log.error("读取kubeConfigPath异常", e);
throw new BizException("500","读取kubeConfigPath异常");
} catch (Exception e) {
log.error("构建K8s-Client异常", e);
throw new BizException("500","构建K8s-Client异常");
}
}
public V1Pod deletePod(ApiClient apiClient, String namespace, String podName) {
// new a CoreV1Api
CoreV1Api api = new CoreV1Api(apiClient);
// invokes the CoreV1Api client
try {
return api.deleteNamespacedPod(podName,namespace,null,null,null,null,null,null);
} catch (ApiException e) {
log.error("deletePod 异常:" + e.getResponseBody(), e);
throw new BizException("500", e.getMessage());
}
}
public V1PodList getNamesapcePod(ApiClient apiClient, String namespace) {
// new a CoreV1Api
CoreV1Api api = new CoreV1Api(apiClient);
// invokes the CoreV1Api client
try {
return api.listNamespacedPod(namespace,null,null, null,null,null,null,null,null,null,null);
} catch (ApiException e) {
log.error("获取 NamesapcePod 异常:" + e.getResponseBody(), e);
throw new BizException("500", e.getMessage());
}
}
/**
* 获取所有的Pod
*
* @return podList
*/
public V1PodList getAllPodList(ApiClient apiClient) {
// new a CoreV1Api
CoreV1Api api = new CoreV1Api(apiClient);
// invokes the CoreV1Api client
try {
return api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null, null);
} catch (ApiException e) {
log.error("获取podlist异常:" + e.getResponseBody(), e);
throw new BizException("500", e.getMessage());
}
}
/**
* 创建k8s service
*
* @param namespace 命名空间
* @param serviceName 服务名称
* @param port 服务端口号(和目标pod的端口号一致)
* @param selector pod标签选择器
* @return 创建成功的service对象
*/
public V1Service createService(ApiClient apiClient, String namespace, String serviceName, Integer port, Map<String, String> selector) {
//构建service的yaml对象
V1Service svc = new V1ServiceBuilder()
.withNewMetadata()
.withName(serviceName)
.endMetadata()
.withNewSpec()
.addNewPort()
.withProtocol("TCP")
.withPort(port)
.withTargetPort(new IntOrString(port))
.endPort()
.withSelector(selector)
.endSpec()
.build();
// Deployment and StatefulSet is defined in apps/v1, so you should use AppsV1Api instead of CoreV1API
CoreV1Api api = new CoreV1Api(apiClient);
V1Service v1Service = null;
try {
v1Service = api.createNamespacedService(namespace, svc, null, null, null);
} catch (ApiException e) {
log.error("创建service异常:" + e.getResponseBody(), e);
throw new BizException("500", e.getMessage());
} catch (Exception e) {
log.error("创建service系统异常:", e);
throw new BizException("500", e.getMessage());
}
return v1Service;
}
/**
* 创建k8s V1Ingress
*
* @param namespace 命名空间
* @param ingressName ingress名称
* @param annotations ingress注解
* @param path 匹配的路径
* @param serviceName 路由到的服务名称
* @param servicePort 路由到的服务端口
* @return 创建成功的ingress对象
*/
public V1Ingress createV1Ingress(ApiClient apiClient, String namespace, String ingressName, Map<String, String> annotations, String path,
String serviceName, Integer servicePort) {
//构建ingress的yaml对象
V1Ingress ingress = new V1IngressBuilder()
.withNewMetadata()
.withName(ingressName)
.withAnnotations(annotations)
.endMetadata()
.withNewSpec()
.addNewRule()
.withHttp(new V1HTTPIngressRuleValueBuilder().addToPaths(new V1HTTPIngressPathBuilder()
.withPath(path)
.withPathType("Prefix")
.withBackend(new V1IngressBackendBuilder()
.withService(new V1IngressServiceBackendBuilder()
.withName(serviceName)
.withPort(new V1ServiceBackendPortBuilder()
.withNumber(servicePort).build()).build()).build()).build()).build())
.endRule()
.endSpec()
.build();
//调用对应的API执行创建ingress的操作
NetworkingV1Api api = new NetworkingV1Api(apiClient);
V1Ingress v1Ingress = null;
try {
v1Ingress = api.createNamespacedIngress(namespace, ingress, null, null, null);
} catch (ApiException e) {
log.error("创建ingress异常:" + e.getResponseBody(), e);
throw new BizException("500", e.getMessage());
} catch (Exception e) {
log.error("创建ingress系统异常:", e);
throw new BizException("500", e.getMessage());
}
return v1Ingress;
}
/**
* 创建k8s ExtensionIngress
*
* @param namespace 命名空间
* @param ingressName ingress名称
* @param annotations ingress注解
* @param path 匹配的路径
* @param serviceName 路由到的服务名称
* @param servicePort 路由到的服务端口
* @return 创建成功的ingress对象
*/
public ExtensionsV1beta1Ingress createExtensionIngress(ApiClient apiClient, String namespace, String ingressName, Map<String, String> annotations, String path,
String serviceName, Integer servicePort) {
//构建ingress的yaml对象
ExtensionsV1beta1Ingress ingress = new ExtensionsV1beta1IngressBuilder()
.withNewMetadata()
.withName(ingressName)
.withAnnotations(annotations)
.endMetadata()
.withNewSpec()
.addNewRule()
.withHttp(new ExtensionsV1beta1HTTPIngressRuleValueBuilder().addToPaths(new ExtensionsV1beta1HTTPIngressPathBuilder()
.withPath(path)
.withBackend(new ExtensionsV1beta1IngressBackendBuilder()
.withServiceName(serviceName)
.withServicePort(new IntOrString(servicePort)).build()).build()).build())
.endRule()
.endSpec()
.build();
//调用对应的API执行创建ingress的操作
ExtensionsV1beta1Api api = new ExtensionsV1beta1Api(apiClient);
ExtensionsV1beta1Ingress extensionsV1beta1Ingress = null;
try {
extensionsV1beta1Ingress = api.createNamespacedIngress(namespace, ingress, null, null, null);
} catch (ApiException e) {
log.error("创建ingress异常:" + e.getResponseBody(), e);
throw new BizException("500", e.getMessage());
} catch (Exception e) {
log.error("创建ingress系统异常:", e);
throw new BizException("500", e.getMessage());
}
return extensionsV1beta1Ingress;
}
}
6、连接测试
@RestController
@Api(tags = "引擎管理接口")
@RequestMapping("/engine")
@Slf4j
public class EngineController {
@ApiOperation("引擎连接接口")
@PostMapping("/k8s")
public ResultBody connectK8s(String namespace, String podName){
V1PodList v1PodList = k8sHandleTools.getNamesapcePod(k8sHandleTools.getApiClient(k8sConfig),"default");
for(V1Pod v1Pod: v1PodList.getItems()){
log.info(v1Pod.toString());
}
return ResultBody.success("connect k8s success");
}
}