最好的时光 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作

我最新最全的文章都在 南瓜慢说 www.pkslow.com,欢迎大家来喝茶!
1 Kubernetes Java客户端对于Kubernetes集群的操作,官方提供了命令行工具kubectl,这也是我们最常用且必须掌握的方式 。通过kubectl来实现增删改查操作,方便而直接 。但总有一些更复杂的场景难以满足,比如我希望在数据库的某个值达到10万后就触发一个Kubernetes Job去处理某项任务 。即使shell编程似乎也可以解决,但为了项目维护,如果能整合到现有代码里,岂不是更好?

最好的时光 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作

文章插图
Kubernetes的架构图可以看出,我们只要和API server做好交互就可以了,实际上kubectl也是如此的 。那我们就可以使用任何语言来操作Kubernetes
本文将介绍Java方面最好用的客户端库fabric8io/kubernetes-client,它支持KubernetesOpenShift,并被许多项目引用,如Spring CloudSparkIstio Java API等,可见它的优秀之处 。
2 如何使用本文将通过代码演示一些常用操作 。
2.1 引入依赖目前的最新版本为5.0.0,通过maven引入最新依赖如下:
<dependency><groupId>io.fabric8</groupId><artifactId>kubernetes-client</artifactId><version>5.0.0</version></dependency>这个依赖包含了相关的核心类、模型类、Jsonokhttp3等 。
最好的时光 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作

文章插图
看它的依赖就可以学习优秀的项目是如何组织和管理的 。
2.2 创建客户端创建客户端最简单的方式是使用默认配置:
KubernetesClient client = new DefaultKubernetesClient();它会从目录~/.kube/config中读取配置文件 。如果想要修改配置,可以通过配置以下设置:
  • 系统属性(System Properties)
  • 环境变量(Enviroment Variables)
  • Kube配置文件
  • ServiceAccount的Token和加载的CA证书
系统属性和环境变量列表可查看官网 。
当然,还可以通过Java来自定义配置:
Config config = new ConfigBuilder().withMasterUrl("https://localhost:6443").build();KubernetesClient client = new DefaultKubernetesClient(config);2.3 创建资源这个Java库使用了大量的Builder模式来创建对象,创建命令空间如下:
Namespace namespace = new NamespaceBuilder().withNewMetadata().withName("pkslow").addToLabels("reason", "pkslow-sample").endMetadata().build();client.namespaces().createOrReplace(namespace);【最好的时光 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作】非常灵活,上面例子添加了名字和标签,最后通过createOrReplace方法可新建,如果存在可替换 。
对于Pod也是类似的:
Pod pod = new PodBuilder().withNewMetadata().withName("nginx").addToLabels("app", "nginx").endMetadata().withNewSpec().addNewContainer().withName("nginx").withImage("nginx:1.19.5").endContainer().endSpec().build();client.pods().inNamespace("pkslow").createOrReplace(pod);指定名字、标签和镜像后就可以创建了 。
2.4 查看资源查看资源可以查询所有,或者通过条件options来过滤,具体代码如下:
// 查看命名空间NamespaceList namespaceList = client.namespaces().list();namespaceList.getItems().forEach(namespace ->System.out.println(namespace.getMetadata().getName() + ":" + namespace.getStatus().getPhase()));// 查看PodListOptions options = new ListOptions();options.setLabelSelector("app=nginx");Pod nginx = client.pods().inNamespace("pkslow").list(options).getItems().get(0);System.out.println(nginx);2.5 修改资源修改资源是通过edit方法来实现的,可通过命名空间和名字来定位到资源,然后进行修改,示例代码如下:
// 修改命名空间client.namespaces().withName("pkslow").edit(n -> new NamespaceBuilder(n).editMetadata().addToLabels("project", "pkslow").endMetadata().build());// 修改Podclient.pods().inNamespace("pkslow").withName("nginx").edit(p -> new PodBuilder(p).editMetadata().addToLabels("app-version", "1.0.1").endMetadata().build());2.6 删除资源删除资源也是类似的,先定位再操作:
client.pods().inNamespace("pkslow").withName("nginx").delete();2.7 通过yaml文件操作我们还可以直接通过yaml文件来描述资源,而不用Java来定义,这样可以更直观和方便 。完成yaml文件的编写后,Load成对应的对象,再进行各种增删改查操作,示例如下:
yaml文件定义了一个Deployment
apiVersion: apps/v1kind: Deploymentmetadata:name: nginx-deploymentlabels:myapp: nginxspec:replicas: 1selector:matchLabels:myapp: nginxtemplate:metadata:labels:myapp: nginxspec:containers:- name: nginximage: nginx:1.7.9ports:- containerPort: 80Java代码如下:
Deployment deployment = client.apps().deployments().load(Fabric8KubernetesClientSamples.class.getResourceAsStream("/deployment.yaml")).get();client.apps().deployments().inNamespace("pkslow").createOrReplace(deployment);2.8 监听事件我们还可以通过监听资源的事件,来进行对应的反应,比如有人删除了Pod就记录日志到数据库等,这个功能还是非常有用的 。示例代码如下:
client.pods().inAnyNamespace().watch(new Watcher<Pod>() {@Overridepublic void eventReceived(Action action, Pod pod) {System.out.println("event " + action.name() + " " + pod.toString());}@Overridepublic void onClose(WatcherException e) {System.out.println("Watcher close due to " + e);}});通过一个Watcher监听了Pod的所有动作事件,然后打印动作名和对应的Pod 。输出后的日志如下:
event ADDED Pod(apiVersion=v1, kind=Pod, metadata=https://tazarkount.com/read/ObjectMeta(event MODIFIED Pod(apiVersion=v1, kind=Pod, metadata=ObjectMeta(event DELETED Pod(apiVersion=v1, kind=Pod, metadata=ObjectMeta(event MODIFIED Pod(apiVersion=v1, kind=Pod, metadata=ObjectMeta(日志太长,就不完全显示 。
3 总结这个Kubernetes的Java客户端实在是好用,API简单易用,即使不用文档也能通过方法名判断 。最让人惊喜的是,官方还提供了许多绝佳的示例,简直不要太友好 。
使用这个API,在项目中可以更灵活地管理和使用Kubernetes应用了 。
代码请查看:https://github.com/LarryDpk/pkslow-samples
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
最好的时光 最好的Kubernetes客户端Java库fabric8io,快来自定义你的操作

文章插图
多读书,多分享;多写作,多整理 。