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