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 评论