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

文章插图
从
Kubernetes的架构图可以看出,我们只要和API server做好交互就可以了,实际上kubectl也是如此的 。那我们就可以使用任何语言来操作Kubernetes 。本文将介绍
Java方面最好用的客户端库fabric8io/kubernetes-client,它支持Kubernetes和OpenShift,并被许多项目引用,如Spring Cloud、Spark、Istio Java API等,可见它的优秀之处 。2 如何使用本文将通过代码演示一些常用操作 。
2.1 引入依赖目前的最新版本为
5.0.0,通过maven引入最新依赖如下:<dependency><groupId>io.fabric8</groupId><artifactId>kubernetes-client</artifactId><version>5.0.0</version></dependency>这个依赖包含了相关的核心类、模型类、Json和okhttp3等 。
文章插图
看它的依赖就可以学习优秀的项目是如何组织和管理的 。
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
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...

文章插图
多读书,多分享;多写作,多整理 。
- 春季老年人吃什么养肝?土豆、米饭换着吃
- 三八妇女节节日祝福分享 三八妇女节节日语录
- 老人谨慎!选好你的“第三只脚”
- 校方进行了深刻的反思 青岛一大学生坠亡校方整改校规
- 脸皮厚的人长寿!有这特征的老人最长寿
- 长寿秘诀:记住这10大妙招 100%增寿
- 春季老年人心血管病高发 3条保命要诀
- 眼睛花不花要看四十八 老年人怎样延缓老花眼
- 香槟然能防治老年痴呆症? 一天三杯它人到90不痴呆
- 老人手抖的原因 为什么老人手会抖
