diff --git a/fast-k8s-client/.gitignore b/fast-k8s-client/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/fast-k8s-client/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/fast-k8s-client/config.yml b/fast-k8s-client/config.yml new file mode 100644 index 0000000..b8df700 --- /dev/null +++ b/fast-k8s-client/config.yml @@ -0,0 +1,19 @@ +apiVersion: v1 +clusters: + - cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1Ea3lOekE1TURJME1Wb1hEVE14TURreU5UQTVNREkwTVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTTk2CmthVjdadkhhY2NFTHgwOW1CQ3ZOTVNyckp3K0pnM05sUUh2MXRrSEJieUczcFJEUGpmVlBTU0ozcVkyS3ErMDAKakZBaEJnZ21TaWMrVWlUS3VxczVMR1hPZlp3bVdON1krY3pvQUV5WFkyQ1oxU0lDMmo5Z2JiL0tUbE5lZlFCZgp5dXV4VU1iZW5hUkY4c1QvbmZ3SzJsUW1vWXV5MHVtQ3FxamlDeU1hT0YvZG83MThPZUFQdDZSdjNsTHI4cDVMCmhPSFBTaTNIQ0hhcGV2QW1OYWJZcUdHaDJ3VDNQaGlsSFBEZnEzcE9jNU1xSFAxMjRaT1ZMYk0zYlpERjlMV0cKZmpxeTdWWGc1L3FBZkNuVzVXQ00zcjFab01vZDFhQ2RVdk9BN0c0TTRlVGZaeFJWTHptUTlBSm9wU2RNSzF3RQpRRWVzRndacFUrMjFlR0h1L1BzQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFESUJqcFZTNUF3aXQ2cWFOdUdBaGR4V2MrbUwKR1drb1pRQUtwZ1Uwd0FLYk9YakdYYzgrWXk4M3RuVzVLbmEwVUhQTDB6UmIvNEI0U1pwUFM2amFRNTNuUklDMgpXd1RGaFhrYWl5aTlkM3pGdjdtTkRMeWJFNWtCam1wS1UzMnl6MWFZWWFhcVlxRmdXZm0wSjZDOGJEWFY3T3BHCitTbmRvZFU3cXdScy8wWkV6L0hUejY1Z2diTkZkcW55dFRYRkZuSnFhcWVsbjhvSGZLN3RsVy9oODNON0xmc2wKVVU2a2ZEcmxHS0tRcEZ5OVAxZ2JtbFlFUVZ3cnBiYVkrc3RoRTkzN0ZweFNCODBqbnlGdVlLWmJzeGhncnhoSwpNcnJIaHdzNmpzMkp1YkFUSVVwMFlhYUZ2c3RsL1RDSHI4MjAvRDhmT2VKWEFneXFzNlR3Y2NqZHcyVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + server: https://192.168.56.112:6443 + name: kubernetes +contexts: + - context: + cluster: kubernetes + user: kubernetes-admin + name: kubernetes-admin@kubernetes +current-context: kubernetes-admin@kubernetes +kind: Config +preferences: {} +users: + - name: kubernetes-admin + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJUnZYYmxYdlhmWXd3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TVRBNU1qY3dPVEF5TkRGYUZ3MHlNakE1TWpjd09UQXlORE5hTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXZoUzU3T3hNK2d2Tk5OZUgKVVVadWtvMXoyT0hCNXpxdXdPOXQvQ0JRU2w4TGx4UCtmQjZYUHY4eFJickdndWlaWUxmdWdvYW8ybEIvdmEzcgoxVlcwQkhoMHBRV3NxaVpNWDR3M1cxcEFhUVd2cFZWaW8rOUtlNTZGUDlyWkF5ek5YeFBKSmRHR01tVHY4TkNkCjR2NEFmOUY5SC9HZHhuKzBrT2tXMWZKZnIwUlJhSFAwUDc2KzlZMjFLUXlXQmpneVpDSU9Pb3VIYnZ0OTg0aEkKZGdVV3FUVnR2REhFNE1NWDNwNHJKR3NmakNaa3F4SnV3YzF5Nm1iK05OeDk0RHBpWkQ1azEyREdhazJvWlRmZwpBTXdLU1d6SzhxOStnTWFCbmR5a3czZW1nblAxM2k2RjZVMzUva2FJKzh1ODNPaTY0VmlHZk51NmU4aytUOXFICjNlZFZSd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFKd1dMS2pCaWxLalRHOFVUcG9KYnRPaFI5dXJDVTZTMFk4dgo4elZlbkJrS3dzTjRhZUxCSjlwclYxeDhqN3NQTEFvRzJsR2xZdE1DaGpWbVhNem5LKzJ4bHVEcTBZQVREcmtFCnRpV3FHVWZlM1JwRDI1ZmxOdE0vQ2VQUjdtUm95SGdpTzNjYUVMbEU5TWVhVXpVK2xhT2VkVm15RHEzUjBGTGYKRm5BeTV0OE5tK1MvdXBoNEZzV3ltWk1IQUdHdFBOdEM3NXp1b1NCQlQxMVNLOTlJUmxkK0VFeFpoWTJoemd3ZAprOWorWWhLdG9pem1kS2pYd0F0Um5XcjFQbXhVQXFBZyswejNwWFJzT2tYeGFjSW8yVWRXSlpGOE54SENBbDcyCkQrOTUzL2ZpZXFJZTIvbFdPbkxlaXZMd0FTZGU4ejMvZUZ0R1ZIeWlhS1BuNGxpZ2krST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBdmhTNTdPeE0rZ3ZOTk5lSFVVWnVrbzF6Mk9IQjV6cXV3Tzl0L0NCUVNsOExseFArCmZCNlhQdjh4UmJyR2d1aVpZTGZ1Z29hbzJsQi92YTNyMVZXMEJIaDBwUVdzcWlaTVg0dzNXMXBBYVFXdnBWVmkKbys5S2U1NkZQOXJaQXl6Tlh4UEpKZEdHTW1UdjhOQ2Q0djRBZjlGOUgvR2R4biswa09rVzFmSmZyMFJSYUhQMApQNzYrOVkyMUtReVdCamd5WkNJT09vdUhidnQ5ODRoSWRnVVdxVFZ0dkRIRTRNTVgzcDRySkdzZmpDWmtxeEp1CndjMXk2bWIrTk54OTREcGlaRDVrMTJER2FrMm9aVGZnQU13S1NXeks4cTkrZ01hQm5keWt3M2VtZ25QMTNpNkYKNlUzNS9rYUkrOHU4M09pNjRWaUdmTnU2ZThrK1Q5cUgzZWRWUndJREFRQUJBb0lCQUdTU3F0MkZHaVdqWU94NApyWXgvYTduM1JqaVhHdld4d3cwcW9sTW85ZEtqLzRuc2RsWk9DVkMzemVaTE1RWEs5SHlNVlpLU2xYME40c2tGCjRTWjd0a2czUStDYzVBTVRTSTIxcndTUytFbVpUSnA2VnpyT1BlYXl0V1pYOFVNUXpZbGsrcVViKzVsbWR0NUEKUTRuN1EyQmVBNHFIV1NmU0lrUWFVSTdiTTIyVUd0OG9FUkszaGVnTnpqeitBVktSN3lBMFRDWEhXMU1IOVB1SQpCY3ZWdGhKZ0JwekNiNWhWcUFyZGF0K2Q2TmdRR3JhbnBZYy9RZXk0dFFwQmwyUXVlQVdiRXpDUVlyenl4RmR6ClphazAyb2ZqeHlNUmZXZUJHRXhwSU0vSnpoTk9WVWJERDFJNzRmakExbkQvZjRLT3JOYXVrcG1BS3lTcnI3dDgKUkEzTUp1RUNnWUVBM0dkNmdwVFgrNDRtNWhXZlNORTNWQi9tZUtWTm1wYjNrY0NTL0VIcFR1OVQ1eFZHVFNQcQp4TTlpY2NtS0JJNE9jN2pXWThMTjRjamZRVzhaOVlNRWtGR3VZMDRXcG9HZSt2OENueW5kU0o0Rk5hKzFUWk11CkdGTStIdjdyR1BrQncxeG1CR0RmNU12RzBBUUIyUStJN0hIVURrWjhKUXU4OXhOeVlMOHY1MDBDZ1lFQTNNZUwKbmt3VEZZQjVvZWN3UHJRTWxFNXN6eDlqcURLQWlwTXcwa1hyUnVuU3NjTENZMTdtTTNWQUhIczFua3pZS2hGQQo4WlFYa1FyajhydCtUaFphVVowK2xhSnNVMzBtajhzV0Q1UUhDRlNnZnR0QzgyaWhhMmdVaEhZdmJlNVpUSHhZCjNZTExxZGxpZHJlcDRBSFZkZDBVZXZ6YlpvSHNMUFc5aDJkY0xPTUNnWUI1UVRpbUZHc0tpdmNkaC9HOHB0VlEKbzhnd3dZaURMdUQrdjdwZHE0bEdrdVpPOEdaZjFBMjV2dnBDN1lUUDRyTlN1UExCcVkrSTB2RDRWNzRwVXE0MQpFNnJrR1RiZTNkcnY3VkdzN09RL3FpZmxsRWdqYUlCb2c0dGVsQklWQ0JFUFFJc2poNFJGcEZJNWFLcjNsdE5XCmVYMFhhWEd0RTlzZTl3VHE4dVBRMVFLQmdDTEx6R1I1aHZSM21EUDlOT3hkQWpLSm5icVRMdWkrZE9YaVJ1cU4KSElURHEzSmF5THBTcGFOc2tsc3F6QXVUL3VtNmFHcnF0VUFsNEVGTWJaNnZCVE1odmxCbEZmK2VsT3BLenNKTAp5VVAxMm9uRDB1eDhEQnphZllsVyt5aXZUU0d4NDJ1ZUJxMVJWcVJ4VS9PN05rSnFRcVVUbnh5cjAyWk9vTDFyCmUrcVRBb0dBYWRETnhxbS9zSHFFTGUxTnZCbDAxZ1NkK2Q1RUsvUloyY0tMT0YyMWlWNXh5bzh1RUladVV2UjkKdVZlVGNnTUVvdlR1UXN4SUJUVFg4Zmh0eUZseFJuU045akEyWXBhRkZoMFZQaXIzZmFGYUltU3lyWkttNGd4aQpDMWt6bnlTejNLbmhWc2RPRFZGY0l3K2EvN2pCYWhrVVNZYnl4ZkhuUWtSNFNoMkdObnM9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== \ No newline at end of file diff --git a/fast-k8s-client/pom.xml b/fast-k8s-client/pom.xml new file mode 100644 index 0000000..cddbf73 --- /dev/null +++ b/fast-k8s-client/pom.xml @@ -0,0 +1,51 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.0.RELEASE + + + com.example + fast-k8s-client + 0.0.1-SNAPSHOT + fast-k8s-client + fast-k8s-client + + 1.8 + + + + org.springframework.boot + spring-boot-starter + + + + org.springframework.boot + spring-boot-starter-test + test + + + io.kubernetes + client-java + 12.0.1 + + + org.projectlombok + lombok + provided + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/fast-k8s-client/shell/delete_evict_pod.sh b/fast-k8s-client/shell/delete_evict_pod.sh new file mode 100644 index 0000000..dd203cb --- /dev/null +++ b/fast-k8s-client/shell/delete_evict_pod.sh @@ -0,0 +1,7 @@ +#!/bin/bash +for each in $(kubectl get pods -n default|grep Evicted|awk '{print $1}'); +do + kubectl delete pods $each -n default +done + +## 删除指定namespace下所有evict的pod \ No newline at end of file diff --git a/fast-k8s-client/src/main/java/fast/cloud/k8s/FastK8sClientApplication.java b/fast-k8s-client/src/main/java/fast/cloud/k8s/FastK8sClientApplication.java new file mode 100644 index 0000000..78287b2 --- /dev/null +++ b/fast-k8s-client/src/main/java/fast/cloud/k8s/FastK8sClientApplication.java @@ -0,0 +1,151 @@ +package fast.cloud.k8s; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +@SpringBootApplication + +public class FastK8sClientApplication implements CommandLineRunner { + private static final Logger logger = LoggerFactory.getLogger(FastK8sClientApplication.class); + + private final Map portMapping = new HashMap<>(16); + private final Map> addressesMapping = new HashMap<>(16); + + public static void main(String[] args) { + SpringApplication.run(FastK8sClientApplication.class, args); + } + + @Override + public void run(String... args) throws Exception { + //直接写config path +// getAllPos(); +// String kubeConfigPath = "config.yml"; +// +// InputStream resourceAsStream = new ClassPathResource("config.yml").getInputStream(); +// //加载k8s, config +// ApiClient client = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new InputStreamReader(resourceAsStream, "UTF-8"))).build(); +// Configuration.setDefaultApiClient(client); +// +// registerWatchersIfNecessary("bfe-device-id-svc"); +// +// Set address = addressesMapping.getOrDefault("bfe-device-id-svc", Collections.emptySet()); +// +// Integer port = portMapping.get("bfe-device-id-svc"); +// +// System.out.println(); + // 3. get pod meta by pod label +// Map> appPodMeta = infoFetcher.getPodMeta(appId); +// +// appPodLabels.getOrDefault(appId, new HashMap<>()) +// +// // 4. join the results of step 2 and 3 to figure out final results. +// List serviceNodes = new ArrayList<>(); +// for (String address : appEndpoints.getAddresses()) { +// Map addressMeta = appPodMeta.getOrDefault(address, new HashMap<>()); +// serviceNodes.add(new ServiceNode(new cn.lalaframework.router.ServiceInstance("k8s", address, appEndpoints.getPort(), addressMeta), +// addressMeta)); +// } + } +// +// private static final String K8S_FACADE_SVC_SUFFIX = "-all"; +// private static final String FIELD_KEY = "metadata.name"; +// +// +// private void getAllPos() throws IOException, ApiException { +// //直接写config path +// String kubeConfigPath = "config.yml"; +// +// InputStream resourceAsStream = new ClassPathResource("config.yml").getInputStream(); +// //加载k8s, config +// ApiClient client = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new InputStreamReader(resourceAsStream, "UTF-8"))).build(); +// +// //将加载config的client设置为默认的client +// Configuration.setDefaultApiClient(client); +// +// //创建一个api +// CoreV1Api api = new CoreV1Api(); +// +// //打印所有的pod +// V1PodList list = api.listPodForAllNamespaces(null, null, null, null, null, null, null, +// null, null); +// +// for (V1Pod item : list.getItems()) { +// System.out.println(item); +// } +// } +// +// +// public void registerWatchersIfNecessary(String appId) { +// CoreV1Api apiHandle = new CoreV1Api(); +// SharedInformerFactory factory = new SharedInformerFactory(); +// +// SharedIndexInformer endpointsInformer = +// factory.sharedIndexInformerFor( +// (CallGeneratorParams params) -> apiHandle.listEndpointsForAllNamespacesCall(false, null, +// String.format("%s=%s", FIELD_KEY, k8sFacadeService(appId)), null, null, null, +// params.resourceVersion, params.timeoutSeconds, params.watch, null), +// V1Endpoints.class, +// V1EndpointsList.class); +// +// endpointsInformer.addEventHandler(new ResourceEventHandler() { +// @Override +// public void onAdd(V1Endpoints v1Endpoints) { +// logger.info("A service endpoint creation event was detected for appId '{}'.", appId); +// onEndpointsEvent(appId, v1Endpoints, null); +// } +// +// @Override +// public void onUpdate(V1Endpoints v1Endpoints, V1Endpoints newV1Endpoints) { +// logger.info("A service endpoint update event was detected for appId '{}'.", appId); +// onEndpointsEvent(appId, newV1Endpoints, v1Endpoints); +// } +// +// @Override +// public void onDelete(V1Endpoints v1Endpoints, boolean b) { +// logger.info("A service endpoint deletion event was detected for appId '{}'.", appId); +// onEndpointsEvent(appId, null, v1Endpoints); +// } +// }); +// } +// +// private static String k8sFacadeService(final String appId) { +// return appId + K8S_FACADE_SVC_SUFFIX; +// } +// +// private synchronized void onEndpointsEvent(String appId, V1Endpoints newEndpoints, V1Endpoints oldEndpoints) { +// Set newAddresses = new HashSet<>(addressesMapping.getOrDefault(appId, Collections.emptySet())); +// if (oldEndpoints != null) { +// if (oldEndpoints.getSubsets().size() > 1) { +// logger.debug("Multiple subsets found in current endpoints list, apply the first group only."); +// } +// V1EndpointSubset subset = oldEndpoints.getSubsets().get(0); +// subset.getAddresses().stream().forEach(e -> newAddresses.remove(e.getIp())); +// } +// +// Integer port = null; +// if (newEndpoints != null && newEndpoints.getSubsets() != null) { +// if (newEndpoints.getSubsets().size() > 1) { +// logger.debug("Multiple subsets found in current endpoints list, apply the first group only."); +// } +// +// V1EndpointSubset subset = newEndpoints.getSubsets().get(0); +// subset.getAddresses().stream().forEach(e -> newAddresses.add(e.getIp())); +// if (subset.getPorts().size() > 1) { +// logger.debug("Multiple ports found in current subset, apply the first one as default traffic port."); +// } +// port = subset.getPorts().get(0).getPort(); +// } +// +// if (port != null) { +// portMapping.put(appId, port); +// } +// addressesMapping.put(appId, newAddresses); +// } +} diff --git a/fast-k8s-client/src/main/java/fast/cloud/k8s/K8sClient.java b/fast-k8s-client/src/main/java/fast/cloud/k8s/K8sClient.java new file mode 100644 index 0000000..a8e487b --- /dev/null +++ b/fast-k8s-client/src/main/java/fast/cloud/k8s/K8sClient.java @@ -0,0 +1,362 @@ +package fast.cloud.k8s; + +import com.google.gson.Gson; +import io.kubernetes.client.custom.IntOrString; +import io.kubernetes.client.openapi.ApiClient; +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.apis.*; +import io.kubernetes.client.openapi.models.*; +import io.kubernetes.client.util.ClientBuilder; +import io.kubernetes.client.util.KubeConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.util.StringUtils; + +import java.io.FileReader; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +/** + * k8s客户端 + * + * @author wanghuidong + * @date 2021/6/18 14:14 + */ +@Slf4j +public class K8sClient { + + /** + * k8s-api客户端 + */ + private ApiClient apiClient; + + private AppsV1Api appsV1Api; + + private ExtensionsV1beta1Api extensionsV1beta1Api; + + private RbacAuthorizationV1Api rbacAuthorizationV1Api; + + private CoreV1Api coreV1Api; + /** + * 构建集群POD内通过SA访问的客户端 + * loading the in-cluster config, including: + * 1. service-account CA + * 2. service-account bearer-token + * 3. service-account namespace + * 4. master endpoints(ip, port) from pre-set environment variables + */ + public K8sClient() { + try { + this.apiClient = ClientBuilder.cluster().build(); + this.coreV1Api = new CoreV1Api(apiClient); + this.appsV1Api = new AppsV1Api(apiClient); + rbacAuthorizationV1Api = new RbacAuthorizationV1Api(apiClient); + extensionsV1beta1Api = new ExtensionsV1beta1Api(apiClient); + } catch (IOException e) { + log.error("构建K8s-Client异常", e); + throw new RuntimeException("构建K8s-Client异常"); + } + } + + /** + * 构建集群外通过UA访问的客户端 + * loading the out-of-cluster config, a kubeconfig from file-system + * + * @param kubeConfigPath kube连接配置文件 + */ + public K8sClient(String kubeConfigPath) { + try { + this.apiClient = ClientBuilder.kubeconfig(KubeConfig.loadKubeConfig(new FileReader(kubeConfigPath))).build(); + this.coreV1Api = new CoreV1Api(apiClient); + this.appsV1Api = new AppsV1Api(apiClient); + rbacAuthorizationV1Api = new RbacAuthorizationV1Api(apiClient); + extensionsV1beta1Api = new ExtensionsV1beta1Api(apiClient); + } catch (IOException e) { + log.error("读取kubeConfigPath异常", e); + throw new RuntimeException("读取kubeConfigPath异常"); + } catch (Exception e) { + log.error("构建K8s-Client异常", e); + throw new RuntimeException("构建K8s-Client异常"); + } + } + + public void get() { + CoreV1Api api = new CoreV1Api(apiClient); + } + + /** + * 获取所有的Pod + * + * @return podList + */ + public V1PodList getAllPodList() { + // new a CoreV1Api + CoreV1Api api = new CoreV1Api(apiClient); + + // invokes the CoreV1Api client + try { + V1PodList list = api.listPodForAllNamespaces(null, null, null, null, null, null, null, null, null, null); + return list; + } catch (ApiException e) { + log.error("获取podlist异常:" + e.getResponseBody(), e); + } + return null; + } + + public V1ServiceList getAllServiceList() { + // new a CoreV1Api + CoreV1Api api = new CoreV1Api(apiClient); + + // invokes the CoreV1Api client + try { + V1ServiceList v1ServiceList = api.listServiceForAllNamespaces(null, null, null, null, null, null, null, null, null, null); + return v1ServiceList; + } catch (ApiException e) { + log.error("获取podlist异常:" + e.getResponseBody(), e); + } + return null; + } + + /** + * 创建k8s service + * + * @param namespace 命名空间 + * @param serviceName 服务名称 + * @param port 服务端口号(和目标pod的端口号一致) + * @param selector pod标签选择器 + * @return 创建成功的service对象 + */ + public V1Service createService(String namespace, String serviceName, Integer port, Map 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); + } catch (Exception e) { + log.error("创建service系统异常:", e); + } + return v1Service; + } + + /** + * 创建k8s V1Ingress + * + * @param namespace 命名空间 + * @param ingressName ingress名称 + * @param annotations ingress注解 + * @param path 匹配的路径 + * @param serviceName 路由到的服务名称 + * @param servicePort 路由到的服务端口 + * @return 创建成功的ingress对象 + */ + public V1Ingress createV1Ingress(String namespace, String ingressName, Map 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); + } catch (Exception e) { + log.error("创建ingress系统异常:", e); + } + return v1Ingress; + } + + + /** + * 创建k8s ExtensionIngress + * + * @param namespace 命名空间 + * @param ingressName ingress名称 + * @param annotations ingress注解 + * @param path 匹配的路径 + * @param serviceName 路由到的服务名称 + * @param servicePort 路由到的服务端口 + * @return 创建成功的ingress对象 + */ + public ExtensionsV1beta1Ingress createExtensionIngress(String namespace, String ingressName, Map 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); + } catch (Exception e) { + log.error("创建ingress系统异常:", e); + } + return extensionsV1beta1Ingress; + } + + +// public T getApiServerResponse(String namespace, Class t) throws ApiException { +// if (t == V1PodList.class) { +// V1PodList v1PodList = api.listNamespacedPod(namespace, true, null, null, null, null, null, null, null, null); +// return (T) v1PodList; +// } else if (t == V1DeploymentList.class) { +// V1DeploymentList v1DeploymentList = appsV1Api.listNamespacedDeployment(namespace, true, null, null, null, null, null, null, null, null); +// return (T) v1DeploymentList; +// } else if (t == V1beta1IngressList.class) { +// V1beta1IngressList v1beta1IngressList = extensionsV1beta1Api.listNamespacedIngress(namespace, true, null, null, null, null, null, null, null, null); +// return (T) v1beta1IngressList; +// } else if (t == V1ServiceList.class) { +// V1ServiceList v1ServiceList = api.listNamespacedService(namespace, true, null, null, null, null, null, null, null, null); +// return (T) v1ServiceList; +// } else if(t == V1ConfigMapList.class) { +// V1ConfigMapList v1ConfigMapList = api.listNamespacedConfigMap(namespace, true, null, null, null, null, null, null, null, null); +// return (T) v1ConfigMapList; +// } else if(t == V1beta1NetworkPolicyList.class) { +// V1beta1NetworkPolicyList v1beta1NetworkPolicyList = extensionsV1beta1Api.listNamespacedNetworkPolicy(namespace, true, null, null, null, null, null, null, null, null); +// return (T) v1beta1NetworkPolicyList; +// } else if(t == V1NodeList.class) { +// V1NodeList v1NodeList = api.listNode(null,"true",null,null,null,null,null,null,null); +// return (T) v1NodeList; +// } else if(t == V1NamespaceList.class) { +// V1NamespaceList v1NamespaceList = api.listNamespace(null,"true",null,null,null,null,null,null,null ); +// return (T) v1NamespaceList; +// } +// return null; +// } +// +// public T getApiServerAllResponse(Class t) throws ApiException { +// if (t == V1PodList.class) { +// V1PodList v1PodList = api.listPodForAllNamespaces(null,null,true,null,null,"true",null,null,null); +// return (T) v1PodList; +// } else if(t == V1ServiceList.class) { +// V1ServiceList v1ServiceList = api.listServiceForAllNamespaces(null,null,true,null,null,"true",null,null,null); +// return (T) v1ServiceList; +// } else if(t == V1EndpointsList.class) { +// V1EndpointsList v1EndpointsList = api.listEndpointsForAllNamespaces(null,null,true,null,null,"true",null,null,null); +// return (T) v1EndpointsList; +// } else if(t == V1ConfigMapList.class) { +// V1ConfigMapList v1ConfigMapList = api.listConfigMapForAllNamespaces(null,null,true,null,null,"true",null,null,null); +// return (T) v1ConfigMapList; +// } else if(t == V1DeploymentList.class) { +// V1DeploymentList v1DeploymentList = appsV1Api.listDeploymentForAllNamespaces(null,null,true,null,null,"true",null,null,null); +// return (T) v1DeploymentList; +// } else if(t == V1beta1IngressList.class) { +// V1beta1IngressList v1beta1IngressList = extensionsV1beta1Api.listIngressForAllNamespaces(null,null,true,null,null,"true",null,null,null); +// return (T) v1beta1IngressList; +// } else if(t == V1beta1NetworkPolicyList.class) { +// V1beta1NetworkPolicyList v1beta1NetworkPolicyList = extensionsV1beta1Api.listNetworkPolicyForAllNamespaces(null,null,true,null,null,"true",null,null,null); +// return (T) v1beta1NetworkPolicyList; +// } +// return null; +// } + + public String getApiServerAllNamespaceResponse(String type) { + try { + String result = ""; + Gson gson = new Gson(); + switch (type) { + case "namespace": + V1NamespaceList v1NamespaceList = coreV1Api.listNamespace(null,true,null,null,null,null,null,null,null ,null); + result = gson.toJson(v1NamespaceList); + break; + case "node": + V1NodeList v1NodeList = coreV1Api.listNode(null,null,null,null,null,null,null,null,null,null); + result = gson.toJson(v1NodeList); + break; + case "pod": + V1PodList v1PodList = coreV1Api.listPodForAllNamespaces(null,null,null,null,null,null,null,null,null,null); + result = gson.toJson(v1PodList); + break; + case "service": + V1ServiceList v1ServiceList = coreV1Api.listServiceForAllNamespaces(null,null,null,null,null,null,null,null,null,null); + result = gson.toJson(v1ServiceList); + break; + case "endPoints": + V1EndpointsList v1EndpointsList = coreV1Api.listEndpointsForAllNamespaces(null,null,null,null,null,null,null,null,null, null); + result = gson.toJson(v1EndpointsList); + break; + case "configMap": + V1ConfigMapList v1ConfigMapList = coreV1Api.listConfigMapForAllNamespaces(null,null,null,null,null,null,null,null,null,null); + result = gson.toJson(v1ConfigMapList); + break; + case "deployment": + V1DeploymentList v1DeploymentList = appsV1Api.listDeploymentForAllNamespaces(true,null,null,null,null,null,null,null,null,null); + result = gson.toJson(v1DeploymentList); + break; + case "ingress": + ExtensionsV1beta1IngressList v1beta1IngressList = extensionsV1beta1Api.listIngressForAllNamespaces(true, null, null, null, null, null, null, null, null, null); + result = gson.toJson(v1beta1IngressList); + break; + default: + System.out.println("输入参数不正确"); + } + return result; + } catch (ApiException e) { + e.printStackTrace(); + } + return null; + } + + public List getServiceByName(String serviceId) throws ApiException { + List items = coreV1Api.listServiceForAllNamespaces(null, null, "metadata.name=" + serviceId, + null, null, null, null, null, null, null).getItems(); + return items; + } + + + public String createHost(String serviceName, String namespace, String clusterDomain) { + return String.format("%s.%s.svc.%s", serviceName, StringUtils.hasText(namespace) ? namespace : "default", + clusterDomain); + } +} diff --git a/fast-k8s-client/src/main/resources/application.properties b/fast-k8s-client/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/fast-k8s-client/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/fast-k8s-client/src/main/resources/config.yml b/fast-k8s-client/src/main/resources/config.yml new file mode 100644 index 0000000..b8df700 --- /dev/null +++ b/fast-k8s-client/src/main/resources/config.yml @@ -0,0 +1,19 @@ +apiVersion: v1 +clusters: + - cluster: + certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJeE1Ea3lOekE1TURJME1Wb1hEVE14TURreU5UQTVNREkwTVZvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTTk2CmthVjdadkhhY2NFTHgwOW1CQ3ZOTVNyckp3K0pnM05sUUh2MXRrSEJieUczcFJEUGpmVlBTU0ozcVkyS3ErMDAKakZBaEJnZ21TaWMrVWlUS3VxczVMR1hPZlp3bVdON1krY3pvQUV5WFkyQ1oxU0lDMmo5Z2JiL0tUbE5lZlFCZgp5dXV4VU1iZW5hUkY4c1QvbmZ3SzJsUW1vWXV5MHVtQ3FxamlDeU1hT0YvZG83MThPZUFQdDZSdjNsTHI4cDVMCmhPSFBTaTNIQ0hhcGV2QW1OYWJZcUdHaDJ3VDNQaGlsSFBEZnEzcE9jNU1xSFAxMjRaT1ZMYk0zYlpERjlMV0cKZmpxeTdWWGc1L3FBZkNuVzVXQ00zcjFab01vZDFhQ2RVdk9BN0c0TTRlVGZaeFJWTHptUTlBSm9wU2RNSzF3RQpRRWVzRndacFUrMjFlR0h1L1BzQ0F3RUFBYU1qTUNFd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFESUJqcFZTNUF3aXQ2cWFOdUdBaGR4V2MrbUwKR1drb1pRQUtwZ1Uwd0FLYk9YakdYYzgrWXk4M3RuVzVLbmEwVUhQTDB6UmIvNEI0U1pwUFM2amFRNTNuUklDMgpXd1RGaFhrYWl5aTlkM3pGdjdtTkRMeWJFNWtCam1wS1UzMnl6MWFZWWFhcVlxRmdXZm0wSjZDOGJEWFY3T3BHCitTbmRvZFU3cXdScy8wWkV6L0hUejY1Z2diTkZkcW55dFRYRkZuSnFhcWVsbjhvSGZLN3RsVy9oODNON0xmc2wKVVU2a2ZEcmxHS0tRcEZ5OVAxZ2JtbFlFUVZ3cnBiYVkrc3RoRTkzN0ZweFNCODBqbnlGdVlLWmJzeGhncnhoSwpNcnJIaHdzNmpzMkp1YkFUSVVwMFlhYUZ2c3RsL1RDSHI4MjAvRDhmT2VKWEFneXFzNlR3Y2NqZHcyVT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + server: https://192.168.56.112:6443 + name: kubernetes +contexts: + - context: + cluster: kubernetes + user: kubernetes-admin + name: kubernetes-admin@kubernetes +current-context: kubernetes-admin@kubernetes +kind: Config +preferences: {} +users: + - name: kubernetes-admin + user: + client-certificate-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUM4akNDQWRxZ0F3SUJBZ0lJUnZYYmxYdlhmWXd3RFFZSktvWklodmNOQVFFTEJRQXdGVEVUTUJFR0ExVUUKQXhNS2EzVmlaWEp1WlhSbGN6QWVGdzB5TVRBNU1qY3dPVEF5TkRGYUZ3MHlNakE1TWpjd09UQXlORE5hTURReApGekFWQmdOVkJBb1REbk41YzNSbGJUcHRZWE4wWlhKek1Sa3dGd1lEVlFRREV4QnJkV0psY201bGRHVnpMV0ZrCmJXbHVNSUlCSWpBTkJna3Foa2lHOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXZoUzU3T3hNK2d2Tk5OZUgKVVVadWtvMXoyT0hCNXpxdXdPOXQvQ0JRU2w4TGx4UCtmQjZYUHY4eFJickdndWlaWUxmdWdvYW8ybEIvdmEzcgoxVlcwQkhoMHBRV3NxaVpNWDR3M1cxcEFhUVd2cFZWaW8rOUtlNTZGUDlyWkF5ek5YeFBKSmRHR01tVHY4TkNkCjR2NEFmOUY5SC9HZHhuKzBrT2tXMWZKZnIwUlJhSFAwUDc2KzlZMjFLUXlXQmpneVpDSU9Pb3VIYnZ0OTg0aEkKZGdVV3FUVnR2REhFNE1NWDNwNHJKR3NmakNaa3F4SnV3YzF5Nm1iK05OeDk0RHBpWkQ1azEyREdhazJvWlRmZwpBTXdLU1d6SzhxOStnTWFCbmR5a3czZW1nblAxM2k2RjZVMzUva2FJKzh1ODNPaTY0VmlHZk51NmU4aytUOXFICjNlZFZSd0lEQVFBQm95Y3dKVEFPQmdOVkhROEJBZjhFQkFNQ0JhQXdFd1lEVlIwbEJBd3dDZ1lJS3dZQkJRVUgKQXdJd0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dFQkFKd1dMS2pCaWxLalRHOFVUcG9KYnRPaFI5dXJDVTZTMFk4dgo4elZlbkJrS3dzTjRhZUxCSjlwclYxeDhqN3NQTEFvRzJsR2xZdE1DaGpWbVhNem5LKzJ4bHVEcTBZQVREcmtFCnRpV3FHVWZlM1JwRDI1ZmxOdE0vQ2VQUjdtUm95SGdpTzNjYUVMbEU5TWVhVXpVK2xhT2VkVm15RHEzUjBGTGYKRm5BeTV0OE5tK1MvdXBoNEZzV3ltWk1IQUdHdFBOdEM3NXp1b1NCQlQxMVNLOTlJUmxkK0VFeFpoWTJoemd3ZAprOWorWWhLdG9pem1kS2pYd0F0Um5XcjFQbXhVQXFBZyswejNwWFJzT2tYeGFjSW8yVWRXSlpGOE54SENBbDcyCkQrOTUzL2ZpZXFJZTIvbFdPbkxlaXZMd0FTZGU4ejMvZUZ0R1ZIeWlhS1BuNGxpZ2krST0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= + client-key-data: LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFb2dJQkFBS0NBUUVBdmhTNTdPeE0rZ3ZOTk5lSFVVWnVrbzF6Mk9IQjV6cXV3Tzl0L0NCUVNsOExseFArCmZCNlhQdjh4UmJyR2d1aVpZTGZ1Z29hbzJsQi92YTNyMVZXMEJIaDBwUVdzcWlaTVg0dzNXMXBBYVFXdnBWVmkKbys5S2U1NkZQOXJaQXl6Tlh4UEpKZEdHTW1UdjhOQ2Q0djRBZjlGOUgvR2R4biswa09rVzFmSmZyMFJSYUhQMApQNzYrOVkyMUtReVdCamd5WkNJT09vdUhidnQ5ODRoSWRnVVdxVFZ0dkRIRTRNTVgzcDRySkdzZmpDWmtxeEp1CndjMXk2bWIrTk54OTREcGlaRDVrMTJER2FrMm9aVGZnQU13S1NXeks4cTkrZ01hQm5keWt3M2VtZ25QMTNpNkYKNlUzNS9rYUkrOHU4M09pNjRWaUdmTnU2ZThrK1Q5cUgzZWRWUndJREFRQUJBb0lCQUdTU3F0MkZHaVdqWU94NApyWXgvYTduM1JqaVhHdld4d3cwcW9sTW85ZEtqLzRuc2RsWk9DVkMzemVaTE1RWEs5SHlNVlpLU2xYME40c2tGCjRTWjd0a2czUStDYzVBTVRTSTIxcndTUytFbVpUSnA2VnpyT1BlYXl0V1pYOFVNUXpZbGsrcVViKzVsbWR0NUEKUTRuN1EyQmVBNHFIV1NmU0lrUWFVSTdiTTIyVUd0OG9FUkszaGVnTnpqeitBVktSN3lBMFRDWEhXMU1IOVB1SQpCY3ZWdGhKZ0JwekNiNWhWcUFyZGF0K2Q2TmdRR3JhbnBZYy9RZXk0dFFwQmwyUXVlQVdiRXpDUVlyenl4RmR6ClphazAyb2ZqeHlNUmZXZUJHRXhwSU0vSnpoTk9WVWJERDFJNzRmakExbkQvZjRLT3JOYXVrcG1BS3lTcnI3dDgKUkEzTUp1RUNnWUVBM0dkNmdwVFgrNDRtNWhXZlNORTNWQi9tZUtWTm1wYjNrY0NTL0VIcFR1OVQ1eFZHVFNQcQp4TTlpY2NtS0JJNE9jN2pXWThMTjRjamZRVzhaOVlNRWtGR3VZMDRXcG9HZSt2OENueW5kU0o0Rk5hKzFUWk11CkdGTStIdjdyR1BrQncxeG1CR0RmNU12RzBBUUIyUStJN0hIVURrWjhKUXU4OXhOeVlMOHY1MDBDZ1lFQTNNZUwKbmt3VEZZQjVvZWN3UHJRTWxFNXN6eDlqcURLQWlwTXcwa1hyUnVuU3NjTENZMTdtTTNWQUhIczFua3pZS2hGQQo4WlFYa1FyajhydCtUaFphVVowK2xhSnNVMzBtajhzV0Q1UUhDRlNnZnR0QzgyaWhhMmdVaEhZdmJlNVpUSHhZCjNZTExxZGxpZHJlcDRBSFZkZDBVZXZ6YlpvSHNMUFc5aDJkY0xPTUNnWUI1UVRpbUZHc0tpdmNkaC9HOHB0VlEKbzhnd3dZaURMdUQrdjdwZHE0bEdrdVpPOEdaZjFBMjV2dnBDN1lUUDRyTlN1UExCcVkrSTB2RDRWNzRwVXE0MQpFNnJrR1RiZTNkcnY3VkdzN09RL3FpZmxsRWdqYUlCb2c0dGVsQklWQ0JFUFFJc2poNFJGcEZJNWFLcjNsdE5XCmVYMFhhWEd0RTlzZTl3VHE4dVBRMVFLQmdDTEx6R1I1aHZSM21EUDlOT3hkQWpLSm5icVRMdWkrZE9YaVJ1cU4KSElURHEzSmF5THBTcGFOc2tsc3F6QXVUL3VtNmFHcnF0VUFsNEVGTWJaNnZCVE1odmxCbEZmK2VsT3BLenNKTAp5VVAxMm9uRDB1eDhEQnphZllsVyt5aXZUU0d4NDJ1ZUJxMVJWcVJ4VS9PN05rSnFRcVVUbnh5cjAyWk9vTDFyCmUrcVRBb0dBYWRETnhxbS9zSHFFTGUxTnZCbDAxZ1NkK2Q1RUsvUloyY0tMT0YyMWlWNXh5bzh1RUladVV2UjkKdVZlVGNnTUVvdlR1UXN4SUJUVFg4Zmh0eUZseFJuU045akEyWXBhRkZoMFZQaXIzZmFGYUltU3lyWkttNGd4aQpDMWt6bnlTejNLbmhWc2RPRFZGY0l3K2EvN2pCYWhrVVNZYnl4ZkhuUWtSNFNoMkdObnM9Ci0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tCg== \ No newline at end of file diff --git a/fast-k8s-client/src/test/java/fast/cloud/k8s/FastK8sClientApplicationTests.java b/fast-k8s-client/src/test/java/fast/cloud/k8s/FastK8sClientApplicationTests.java new file mode 100644 index 0000000..d75a367 --- /dev/null +++ b/fast-k8s-client/src/test/java/fast/cloud/k8s/FastK8sClientApplicationTests.java @@ -0,0 +1,140 @@ +package fast.cloud.k8s; + +import io.kubernetes.client.openapi.ApiException; +import io.kubernetes.client.openapi.models.V1Pod; +import io.kubernetes.client.openapi.models.V1PodList; +import io.kubernetes.client.openapi.models.V1Service; +import io.kubernetes.client.openapi.models.V1ServiceList; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.io.IOException; +import java.util.List; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class FastK8sClientApplicationTests { + + @Test + public void getAllPodListTest() throws IOException { + String kubeConfigPath = "config.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + V1PodList podList = k8sClient.getAllPodList(); + for (V1Pod item : podList.getItems()) { + System.out.println(item.getMetadata().getNamespace() + ":" + item.getMetadata().getName()); + } + } + + @Test + public void getAllServiceListTest() throws IOException { + String kubeConfigPath = "config.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + V1ServiceList allServiceList = k8sClient.getAllServiceList(); + for (V1Service item : allServiceList.getItems()) { + System.out.println(item.getMetadata().getNamespace() + ":" + item.getMetadata().getName()); + } + } + + + @Test + public void getNamespace() throws IOException { + String kubeConfigPath = "config.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + String namespace = k8sClient.getApiServerAllNamespaceResponse("namespace"); + System.out.println(namespace); + } + + @Test + public void getNode() throws IOException { + String kubeConfigPath = "config.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + + String node = k8sClient.getApiServerAllNamespaceResponse("node"); + System.out.println(node); + } + + @Test + public void getService() throws IOException { + String kubeConfigPath = "config.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + + String service = k8sClient.getApiServerAllNamespaceResponse("service"); + System.out.println(service); + } + + @Test + public void getEndPoints() throws IOException { + String kubeConfigPath = "config.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + + String endPoints = k8sClient.getApiServerAllNamespaceResponse("endPoints"); + System.out.println(endPoints); + } + + @Test + public void getConfigMap() throws IOException { + String kubeConfigPath = "config.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + + String configMap = k8sClient.getApiServerAllNamespaceResponse("configMap"); + System.out.println(configMap); + } + + @Test + public void getDeployment() throws IOException { + String kubeConfigPath = "config.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + + String deployment = k8sClient.getApiServerAllNamespaceResponse("deployment"); + System.out.println(deployment); + } + + + @Test + public void getIngress() throws IOException { + String kubeConfigPath = "config.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + + String ingress = k8sClient.getApiServerAllNamespaceResponse("ingress"); + System.out.println(ingress); + } + + @Test + public void getServiceByName() throws IOException, ApiException { + String kubeConfigPath = "config.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + + List v1Services = k8sClient.getServiceByName("name-service"); + V1Service v1Service = v1Services.get(0); + + String host = k8sClient.createHost(v1Service.getMetadata().getName(), + v1Service.getMetadata().getNamespace(), "cluster.local"); + System.out.println(v1Services); + } + + @Test + public void getServiceByName2() throws IOException, ApiException { + String kubeConfigPath = "config-prd.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + + List v1Services = k8sClient.getServiceByName(""); + V1Service v1Service = v1Services.get(0); + + String host = k8sClient.createHost(v1Service.getMetadata().getName(), + v1Service.getMetadata().getNamespace(), "cluster.local"); + System.out.println(v1Services); + } + + + @Test + public void getNode2() throws IOException { + String kubeConfigPath = "config-prd.yml"; + K8sClient k8sClient = new K8sClient(kubeConfigPath); + + String node = k8sClient.getApiServerAllNamespaceResponse("node"); + System.out.println(node); + } + +}