一、依赖包
<!-- https://mvnrepository.com/artifact/io.fabric8/kubernetes-client --> <dependency> <groupId>io.fabric8</groupId> <artifactId>kubernetes-client</artifactId> <version>5.12.4</version> </dependency>
二、连接kubernetes集群
2.1、通过admin.conf连接kubernetes集群
通过kubernetes集群的admin.conf文件连接,admin.conf文件在kubernets集群主节点的/etc/kubernetes目录下,然后拷贝到项目的src/main/resources目录下即可。
package com.lxk.k8s;
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.PodList;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@Slf4j
public class MainTest {
public static void main(String[] args) {
KubernetesClient client = null;
try {
System.setProperty(Config.KUBERNETES_KUBECONFIG_FILE,
MainTest.class.getClassLoader().getResource("admin.conf").getPath());
client = new DefaultKubernetesClient();
} catch (Exception e) {
e.printStackTrace();
}
PodList list = client.pods().inNamespace("default").list();
List<Pod> items = list.getItems();
items.stream().forEach(pod -> {
log.info("{}" , pod.getMetadata().getName());
});
}
}
2.2 、通过token连接kubernetes集群
kubectl -n kube-system describe $(kubectl -n kube-system get secret -n kube-system -o name | grep namespace) | grep token
package com.lxk.k8s;
import io.fabric8.kubernetes.api.model.Pod;
import io.fabric8.kubernetes.api.model.PodList;
import io.fabric8.kubernetes.client.Config;
import io.fabric8.kubernetes.client.ConfigBuilder;
import io.fabric8.kubernetes.client.DefaultKubernetesClient;
import io.fabric8.kubernetes.client.KubernetesClient;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@Slf4j
public class MainTest02 {
public static void main(String[] args) {
KubernetesClient client = null;
String token = "eyJhbGciOiJSUzI1NiIsImtpZCI6IkF5V3puNUlFOHhweVRZaVBDN2lPcThuYUhGU21NZWxRVWZkdWpCTklxZW8ifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJrdWJlLXN5c3RlbSIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VjcmV0Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlci10b2tlbi1oZndybiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJuYW1lc3BhY2UtY29udHJvbGxlciIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50LnVpZCI6IjA4MzM1YzA0LTZhMjMtNGNmMS1iN2RhLTQ5YjMwYjM5YWYxYiIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDprdWJlLXN5c3RlbTpuYW1lc3BhY2UtY29udHJvbGxlciJ9.jpX65fZ9UU7fBBlVv_odx_oKXa9rE81LwEkHLuSAuHq10o7EqCx87DlZBioT11dwHAOwVxo3gENvPkQU704ImW9r5kYwhUltz6RtQMlyyp25Ov4Cd3X83gFRV6IGo58lqc7NgEn-HYxm9aU1PoQOHXH7gi2FGgfcUc7WBzUYyO-l26cfe15-7lQnutzBLt2djjfJs8jDEXlzW5dkyAUe2vYSgXIAfbm24zi2NCltSmdVWgoWwGuDWQ2rAxtMFBF087Z-nuC1sU1AIMidQ79CIX60twTCNgE9hZbovZjns8-mL75ujkcr7HucdvJqIOORTGVPynCjKg4vHuPZNioyQQ";
try {
Config build = new ConfigBuilder().withMasterUrl("https://192.168.71.201:6443").withTrustCerts(true).withOauthToken(token).build();
client = new DefaultKubernetesClient(build);
} catch (Exception e) {
e.printStackTrace();
}
PodList list = client.pods().inNamespace("default").list();
List<Pod> items = list.getItems();
items.stream().forEach(pod -> {
log.info("{}", pod.getMetadata().getName());
});
}
}
三、创建和管理资源
一旦我们连接到了Kubernetes集群,我们可以使用io.fabric8.kubernetes-client来创建、更新和删除Kubernetes资源,例如部署、服务、Pod等。
以下是一个创建和删除Deployment的示例:
public static void main(String[] args) {
KubernetesClient client = null;
try {
System.setProperty(Config.KUBERNETES_KUBECONFIG_FILE,
MainTest.class.getClassLoader().getResource("admin.conf").getPath());
client = new DefaultKubernetesClient();
} catch (Exception e) {
e.printStackTrace();
}
PodList list = client.pods().inNamespace("default").list();
List<Pod> items = list.getItems();
items.stream().forEach(pod -> {
log.info("{}" , pod.getMetadata().getName());
});
// 创建一个Deployment
Deployment deployment = new DeploymentBuilder()
.withNewMetadata()
.withName("my-deployment")
.addToLabels("app", "my-app")
.endMetadata()
.withNewSpec()
.withReplicas(3)
.withNewTemplate()
.withNewMetadata()
.addToLabels("app", "my-app")
.endMetadata()
.withNewSpec()
.addNewContainer()
.withName("my-container")
.withImage("my-image:latest")
.endContainer()
.endSpec()
.endTemplate()
.endSpec()
.build();
client.apps().deployments().createOrReplace(deployment);
//client.apps().deployments().delete(deployment);
// 删除Deployment
client.apps().deployments().withName("my-deployment").delete();
client.close();
}
上述代码中,我们使用DeploymentBuilder创建了一个Deployment对象,并使用createOrReplace方法将其创建或更新到集群中。我们还可以使用delete方法删除指定的Deployment。
类似地,可以使用io.fabric8.kubernetes-client来创建和管理其他资源,例如Service、Pod、ConfigMap等。
四、监控和查询集群
// 监听Pod的变化
final CountDownLatch deleteLatch = new CountDownLatch(1);
Watch watch = client.pods().withName("pod1").watch(new Watcher<Pod>() {
@Override
public void eventReceived(Action action, Pod resource) {
switch (action) {
case DELETED:
deleteLatch.countDown();
}
}
@Override
public void onClose(WatcherException e) {
}
});
deleteLatch.await(10, TimeUnit.MINUTES);