拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Kubernetes Java客户端快速入门

Kubernetes Java客户端快速入门

白鹭 - 2021-11-24 1072 0 0

1.简介

在本教程中,我们将展示如何使用Java应用程序的官方客户端库来使用Kubernetes API。

2.为什么要使用Kubernetes API?

**如今,可以肯定地说,Kubernetes已成为管理容器化应用程序的de facto**标准。它提供了丰富的API,使我们能够部署,扩展和监视应用程序以及相关的资源,例如存储,机密和环境变量。实际上,考虑此API的一种方法是常规操作系统中可用的系统调用的分布式模拟。

大多数时候,我们的应用程序可以忽略它们在Kubernetes下运行的事实。这是一件好事,因为它使我们能够在本地进行开发,并通过一些命令和YAML命令,仅需少量更改即可将它们快速部署到多个云提供商。

但是,在一些有趣的用例中,我们需要与Kubernetes API对话以实现特定功能:

  • 启动外部程序以执行某些任务,然后检索其完成状态
  • 根据客户需求动态创建/修改某些服务
  • 为跨多个Kubernetes集群甚至跨云提供商运行的解决方案创建自定义监控仪表板

当然,这些用例并不常见,但是由于有了它的API,我们将看到它们非常容易实现。

此外,由于Kubernetes API是一个开放规范,因此我们可以确信我们的代码将在不对任何经过认证的实现进行任何修改的情况下运行

3.本地开发环境

在继续创建应用程序之前,我们需要做的第一件事就是获得对运行中的Kubernetes集群的访问权限。尽管我们可以为此使用公共云提供商,但本地环境通常可以对其设置的所有方面提供更多控制。

有一些适合此任务的轻量级发行版:

实际的设置步骤超出了本文的范围,但是,无论选择哪种选项,只要在开始任何开发之前确保[kubectl](https://kubernetes.io/docs/reference/kubectl/overview/)是可以运行的

4. Maven依赖

首先,让我们将Kubernetes Java API依赖项添加到我们项目的pom.xml

<dependency>

 <groupId>io.kubernetes</groupId>

 <artifactId>client-java</artifactId>

 <version>11.0.0</version>

 </dependency>

可以从Maven Central下载最新版本的[client-java](https://search.maven.org/search?q=g:io.kubernetes%20a:client-java)

5.您好,Kubernetes

现在,让我们创建一个非常简单的Kubernetes应用程序,该应用程序将列出可用的节点以及有关它们的一些信息。

尽管它很简单,但此应用程序说明了连接到运行中的集群并执行API调用必须执行的必要步骤。无论我们在实际应用程序中使用哪种API,这些步骤始终是相同的。

5.1。 ApiClient初始化

ApiClient类是API中最重要的类之一,因为它包含执行对Kubernetes API服务器的调用的所有逻辑。创建此类实例的推荐方法是使用Config类中可用的静态方法之一。特别是,最简单的方法是使用defaultClient()方法:

ApiClient client = Config.defaultClient();

使用此方法可确保我们的代码可以在远程和群集方案中运行。同样,它将自动按照**kubectl**实用程序所使用的相同步骤来查找配置文件

  • KUBECONFIG环境变量定义的配置文件
  • $HOME/.kube/config文件
  • /var/run/secrets/kubernetes.io/serviceaccount下的服务账户令牌
  • 直接访问http://localhost:8080

第三步是使我们的应用程序可以在群集中作为任何pod一部分运行的步骤,只要为其提供了适当的服务账户即可。

另外,请注意,如果在配置文件中定义了多个上下文,则此过程将选择“当前”上下文,如使用kubectl config set-context命令定义的那样。

5.2。创建一个API存根

一旦掌握了ApiClient实例,就可以使用它为任何可用的API创建存根。在我们的例子中,我们将使用CoreV1Api类,其中包含我们需要列出可用节点的方法:

CoreV1Api api = new CoreV1Api(client);

在这里,我们使用现有的ApiClient创建API存根。

请注意,还有一个no-args构造函数可用,但通常,我们应避免使用它not使用它的原因是,在内部它将使用全局ApiClient ,该全局ApiClient必须事先通过Configuration.setDefaultApiClient()进行设置。这会在使用存根之前对调用此方法的人产生隐式依赖,从而可能导致运行时错误和维护问题。

更好的方法是使用任何依赖项注入框架进行此初始连接,并在需要时将结果存根注入。

5.3。调用Kubernetes API

最后,让我们进入返回可用节点的实际API调用。 CoreApiV1存根具有一种精确执行此操作的方法,因此这很简单:

V1NodeList nodeList = api.listNode(null, null, null, null, null, null, null, null, 10, false);

 nodeList.getItems()

 .stream()

 .forEach((node) -> System.out.println(node));

在我们的示例中,我们null ,因为它们是可选的。最后两个参数与所有listXXX呼叫相关,因为它们指定了呼叫超时以及这是否是Watch呼叫。检查方法的签名将显示剩余的参数:

public V1NodeList listNode(

 String pretty,

 Boolean allowWatchBookmarks,

 String _continue,

 String fieldSelector,

 String labelSelector,

 Integer limit,

 String resourceVersion,

 String resourceVersionMatch,

 Integer timeoutSeconds,

 Boolean watch) {

 // ... method implementation

 }

对于此快速介绍,我们将仅忽略分页,监视和过滤器参数。在这种情况下,返回值是一个POJO,其中包含返回文档的Java表示形式。对于此API调用,文档包含V1Node对象的列表,其中包含有关每个节点的几条信息。这是此代码在控制台上产生的典型输出:

class V1Node {

 metadata: class V1ObjectMeta {

 labels: {

 beta.kubernetes.io/arch=amd64,

 beta.kubernetes.io/instance-type=k3s,

 // ... other labels omitted

 }

 name: rancher-template

 resourceVersion: 29218

 selfLink: null

 uid: ac21e09b-e3be-49c3-9e3a-a9567b5c2836

 }

 // ... many fields omitted

 status: class V1NodeStatus {

 addresses: [class V1NodeAddress {

 address: 192.168.71.134

 type: InternalIP

 }, class V1NodeAddress {

 address: rancher-template

 type: Hostname

 }]

 allocatable: {

 cpu=Quantity{number=1, format=DECIMAL_SI},

 ephemeral-storage=Quantity{number=18945365592, format=DECIMAL_SI},

 hugepages-1Gi=Quantity{number=0, format=DECIMAL_SI},

 hugepages-2Mi=Quantity{number=0, format=DECIMAL_SI},

 memory=Quantity{number=8340054016, format=BINARY_SI},

 pods=Quantity{number=110, format=DECIMAL_SI}

 }

 capacity: {

 cpu=Quantity{number=1, format=DECIMAL_SI},

 ephemeral-storage=Quantity{number=19942490112, format=BINARY_SI},

 hugepages-1Gi=Quantity{number=0, format=DECIMAL_SI},

 hugepages-2Mi=Quantity{number=0, format=DECIMAL_SI},

 memory=Quantity{number=8340054016, format=BINARY_SI},

 pods=Quantity{number=110, format=DECIMAL_SI}}

 conditions: [

 // ... node conditions omitted

 ]

 nodeInfo: class V1NodeSystemInfo {

 architecture: amd64

 kernelVersion: 4.15.0-135-generic

 kubeProxyVersion: v1.20.2+k3s1

 kubeletVersion: v1.20.2+k3s1

 operatingSystem: linux

 osImage: Ubuntu 18.04.5 LTS

 // ... more fields omitted

 }

 }

 }

我们可以看到,有很多可用的信息。为了进行比较,这是默认设置下kubectl

[email protected]:~# kubectl get nodes

 NAME STATUS ROLES AGE VERSION

 rancher-template Ready control-plane,master 24h v1.20.2+k3s1

六,结论

在本文中,我们对Java的Kubernetes API进行了简要介绍。在以后的文章中,我们将更深入地研究此API,并探索其一些其他功能:

  • 解释可用的API调用变体之间的区别
  • 使用Watch实时监视集群事件
  • 如何使用分页从集群中高效检索大量数据
标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *