Skip to content

Commit

Permalink
k8s client demo
Browse files Browse the repository at this point in the history
  • Loading branch information
qinfuxiang committed Oct 26, 2021
1 parent f5699e6 commit eb087e7
Show file tree
Hide file tree
Showing 9 changed files with 783 additions and 0 deletions.
33 changes: 33 additions & 0 deletions fast-k8s-client/.gitignore
Original file line number Diff line number Diff line change
@@ -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/
19 changes: 19 additions & 0 deletions fast-k8s-client/config.yml
Original file line number Diff line number Diff line change
@@ -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==
51 changes: 51 additions & 0 deletions fast-k8s-client/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>fast-k8s-client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>fast-k8s-client</name>
<description>fast-k8s-client</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
<version>12.0.1</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>
7 changes: 7 additions & 0 deletions fast-k8s-client/shell/delete_evict_pod.sh
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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<String, Integer> portMapping = new HashMap<>(16);
private final Map<String, Set<String>> 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<String> 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<String, Map<String, String>> appPodMeta = infoFetcher.getPodMeta(appId);
//
// appPodLabels.getOrDefault(appId, new HashMap<>())
//
// // 4. join the results of step 2 and 3 to figure out final results.
// List<ServiceNode> serviceNodes = new ArrayList<>();
// for (String address : appEndpoints.getAddresses()) {
// Map<String, String> 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<V1Endpoints> 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<V1Endpoints>() {
// @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<String> 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);
// }
}
Loading

0 comments on commit eb087e7

Please sign in to comment.