首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Fabric8 Kubernetes 教程——Metrics、Resource

Fabric8 Kubernetes 教程——Metrics、Resource

作者头像
FunTester
发布于 2025-04-04 04:53:07
发布于 2025-04-04 04:53:07
13402
代码可运行
举报
文章被收录于专栏:FunTesterFunTester
运行总次数:2
代码可运行

Kubernetes 客户端提供了丰富的 API 来管理和操作 Kubernetes 集群中的资源。以下是一些常见的操作示例,涵盖了指标获取、资源管理、自定义资源定义(CRD)以及类型化和无类型资源 API 的使用。

获取 Metrics

Kubernetes 客户端支持从启用了指标的 API 服务器获取指标。你可以通过 client.top() 访问指标。

获取所有节点的 NodeMetrics

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NodeMetricsList nodeMetricList = client.top().nodes().metrics();

获取特定节点的 NodeMetrics

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
NodeMetrics nodeMetric = client.top().nodes().withName("minikube").metric();

获取所有命名空间中所有 Pod 的 PodMetrics

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PodMetricsList podMetricsList = client.top().pods().metrics();

获取某个特定命名空间中所有 Pod 的 PodMetrics

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PodMetricsList podMetricsList = client.top().pods().inNamespace("default").metrics();

获取特定 Pod 的 PodMetrics

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PodMetrics podMetrics = client.top().pods().metrics("default", "nginx-pod");

Resource API

Resource 是 Kubernetes 中表示集群中可用计算资源(如 CPU、内存)的抽象概念,用于定义 Pod 的资源请求(requests)和限制(limits)。

Kubernetes 客户端提供了一个通用 API 来处理不同类型的 Kubernetes 资源。大多数 Kubernetes 资源都扩展了 HasMetadata 类。

从 Kubernetes API 服务器获取 Kubernetes 资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Pod pod = client.resource(pod1).inNamespace("default").get();

将 Kubernetes 资源应用到 Kubernetes 集群(服务器端应用):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Pod pod1 = new PodBuilder()
  .withNewMetadata().withName("resource-pod-" + RandomStringUtils.randomAlphanumeric(6).toLowerCase(Locale.ROOT)).endMetadata()
  .withNewSpec()
  .addNewContainer().withName("nginx").withImage("nginx").endContainer()
  .endSpec()
  .build();

client.resource(pod1).inNamespace("default").serverSideApply();

应用 Kubernetes 资源并等待资源准备就绪:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pod1 = client.resource(pod1).serverSideApply();
Pod p = client.pods().resource(pod1).waitUntilReady(10, TimeUnit.SECONDS);

删除 Kubernetes 资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client.resource(pod1).inNamespace("default").delete();

Resource List

Kubernetes 客户端还提供了一个通用 API 来处理 Kubernetes 列表。

将 Kubernetes 资源列表应用到 Kubernetes 集群:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Service service =  new ServiceBuilder()
  .withNewMetadata().withName("my-service").endMetadata()
  .withNewSpec()
  .addToSelector("app", "Myapp")
  .addNewPort().withProtocol("TCP").withPort(80).withTargetPort(new IntOrString(9376)).endPort()
  .endSpec()
  .build();

ConfigMap configMap = new ConfigMapBuilder()
  .withNewMetadata().withName("my-configmap").endMetadata()
  .addToData(Collections.singletonMap("app", "Myapp"))
  .build();

KubernetesList list = new KubernetesListBuilder().withItems(deployment, service, configMap).build();

// 应用
client.resourceList(list).inNamespace("default").serverSideApply();

删除资源列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client.resourceList(new PodListBuilder().withItems(pod1, pod2, pod3).build()).inNamespace("default").delete();

自定义资源定义(CRD)

自定义资源定义(CRD) 是 Kubernetes 中允许用户扩展 API 的机制,用于定义和管理自定义资源(Custom Resource),满足特定应用或业务需求。

CustomResourceDefinition 是 Kubernetes API 中 CustomResource 对象的模板。

从 yaml 文件加载 CustomResourceDefinition

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CustomResourceDefinition customResourceDefinition = client.apiextensions().v1().customResourceDefinitions().load(new FileInputStream("/sparkapplication-crd.yml")).item();

从 Kubernetes API 服务器获取 CustomResourceDefinition

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CustomResourceDefinition crd = client.apiextensions().v1().customResourceDefinitions().withName("sparkclusters.radanalytics.io").get();

创建 CustomResourceDefinition

代码语言:javascript
代码运行次数:2
运行
AI代码解释
复制
CustomResourceDefinition customResourceDefinition = new CustomResourceDefinitionBuilder()
      .withApiVersion("apiextensions.k8s.io/v1")
      .withNewMetadata().withName("sparkclusters.radanalytics.io")
      .endMetadata()
      .withNewSpec()
      .withNewNames()
      .withKind("SparkCluster")
      .withPlural("sparkclusters")
      .endNames()
      .withGroup("radanalytics.io")
      .withVersion("v1")
      .withScope("Namespaced")
      .withNewValidation()
      .withNewOpenAPIV3SchemaLike(readSchema())
      .endOpenAPIV3Schema()
      .endValidation()
      .endSpec()
      .build();

CustomResourceDefinition crd = client.apiextensions().v1().customResourceDefinitions().resource(customResourceDefinition).create();

应用 CustomResourceDefinition

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CustomResourceDefinition crd = client.apiextensions().v1().customResourceDefinitions().resource(customResourceDefinition).serverSideApply();

列出 CustomResourceDefinition

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CustomResourceDefinitionList crdList = client.apiextensions().v1().customResourceDefinitions().list();

删除 CustomResourceDefinition

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client.apiextensions().v1().customResourceDefinitions().withName("sparkclusters.radanalytics.io").delete();

资源类型化 API

任何资源(无论是自定义资源还是内置资源)都可以通过 client.resources(Class) 方法访问。

获取自定义资源的客户端实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MixedOperation<CronTab, KubernetesResourceList<CronTab>, Resource<CronTab>> cronTabClient = client.resources(CronTab.class);

从 Kubernetes API 服务器获取自定义资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CronTab ct = cronTabClient.inNamespace("default").withName("my-second-cron-object").get();

创建 CustomResource

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cronTabClient.inNamespace("default").create(cronTab1);

列出 CustomResource

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
CronTabList cronTabList = cronTabClient.inNamespace("default").list();

删除 CustomResource

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cronTabClient.inNamespace("default").withName("my-third-cron-object").delete();

替换 CustomResource 的状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cronTabClient.inNamespace("default").resource(updatedCronTab).updateStatus();

修补 CustomResource 的状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cronTabClient.inNamespace("default").resource(updatedCronTab).patchStatus();

编辑 CustomResource 的状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cronTabClient.inNamespace("default").resource(cronTab1).editStatus(cronTab -> updatedCronTab);

监听 CustomResource

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cronTabClient.inNamespace("default").watch(new Watcher<>() {
   @Override
   public void eventReceived(Action action, CronTab resource) {
        // 根据操作类型执行某些操作
   }

   @Override
   public void onClose(WatcherException cause) {
        // 处理关闭事件
   }
});

无类型资源

如果你不需要或不想使用强类型的客户端,Kubernetes 客户端还提供了一个无类型/原始 API 来处理资源。

创建 ResourceDefinitionContext

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ResourceDefinitionContext resourceDefinitionContext = new ResourceDefinitionContext.Builder()
      .withGroup("jungle.example.com")
      .withVersion("v1")
      .withPlural("animals")
      .withNamespaced(true)
      .build();

从 YAML 文件加载资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GenericKubernetesResource customResource = client.genericKubernetesResources(context).load(new FileInputStream("cr.yaml")).item();

从 Kubernetes API 服务器获取资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GenericKubernetesResource customResourceObject = client.genericKubernetesResources(resourceDefinitionContext).inNamespace(currentNamespace).withName("otter").get();

创建资源:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GenericKubernetesResource object = client.genericKubernetesResources(resourceDefinitionContext).inNamespace(currentNamespace).load(new FileInputStream("test-rawcustomresource.yml")).create();

列出 CustomResource

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GenericKubernetesResourceList list = client.genericKubernetesResources(resourceDefinitionContext).inNamespace(currentNamespace).list();

更新 CustomResource

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
GenericKubernetesResource walrus = client.genericKubernetesResources(resourceDefinitionContext).inNamespace(currentNamespace).withName("walrus").get();
Map<String, Object> spec = (Map<String, Object>) walrus.getAdditionalProperties().get("spec");
spec.put("image", "my-updated-awesome-walrus-image");
walrus.getAdditionalProperties().put("spec", spec);
client.genericKubernetesResources(resourceDefinitionContext).inNamespace(currentNamespace).resource(walrus).update();

删除 CustomResource

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
client.genericKubernetesResources(resourceDefinitionContext).inNamespace(currentNamespace).withName("otter").delete();

监听 CustomResource

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
final CountDownLatch closeLatch = new CountDownLatch(1);
client.genericKubernetesResources(crdContext).inNamespace(namespace).watch(new Watcher<>() {
    @Override
    public void eventReceived(Action action, GenericKubernetesResource resource) {
        logger.info("{}: {}", action, resource);
    }

    @Override
    public void onClose(WatcherException e) {
        logger.debug("Watcher onClose");
        closeLatch.countDown();
        if (e != null) {
            logger.error(e.getMessage(), e);
        }
    }
});
closeLatch.await(10, TimeUnit.MINUTES);

Spark Operator

以下示例展示了如何通过 Spark Operator 的示例以两种不同的方式为自定义资源定义相同的上下文。

类型化资源 API:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Group("sparkoperator.k8s.io")
@Plural("sparkapps")
@Version("v1beta2")
@Kind("SparkApplication")
public class SparkOperatorResource extends GenericKubernetesResource implements Namespaced { ... }

使用类型化资源 API 的 SparkOperatorResource

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubernetesClient.resources(SparkOperatorResource.class).inNamespace("myNamespace")...

无类型资源 API:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static ResourceDefinitionContext getResourceDefinitionContext() {
    return new ResourceDefinitionContext.Builder()
            .withGroup("sparkoperator.k8s.io")
            .withPlural("sparkapps")
            .withVersion("v1beta2")
            .withKind("SparkApplication")
            .withNamespaced(true)
            .build();
}

使用无类型资源 API:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kubernetesClient.genericKubernetesResources(getResourceDefinitionContext()).inNamespace("myNamespace")...

通过这些 API,你可以灵活地管理和操作 Kubernetes 集群中的各种资源,无论是内置资源还是自定义资源。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Fabric8 Kubernetes 教程——客户端基础
俗话说,工欲善其事,必先利其器。在使用 Kubernetes 时,首先需要初始化客户端。通常情况下,我们可以这样创建 Kubernetes 客户端:
FunTester
2025/03/20
2200
Fabric8 Kubernetes 教程——客户端基础
Fabric8 Kubernetes 教程——Replication、ConfigMap、Secret
ReplicationController (RC) 是 Kubernetes 中用于确保指定数量的 Pod 副本始终运行的早期控制器,已被更灵活的 ReplicaSet 取代。
FunTester
2025/03/24
1220
Fabric8 Kubernetes 教程——Replication、ConfigMap、Secret
Fabric8 Kubernetes 教程——CSR、ListOptions、DeleteOptions
CertificateSigningRequest (CSR) 是 Kubernetes 中用于请求集群证书颁发机构(CA)签发证书的对象,通常用于为节点或用户申请 TLS 证书。
FunTester
2025/04/04
1180
Fabric8 Kubernetes 教程——CSR、ListOptions、DeleteOptions
Fabric8 Kubernetes 教程——PVC、PV、Network、PDB、Role、Cluster
EndpointSlice 是 Kubernetes 中用于扩展和优化 Endpoints 功能的一种资源对象。它是对传统 Endpoints 的改进,主要用于更高效地管理和存储服务后端的端点信息。
FunTester
2025/03/31
1580
Fabric8 Kubernetes 教程——PVC、PV、Network、PDB、Role、Cluster
从零上手 Fabric8 KubernetesClient
在 Kubernetes 的世界里,管理容器资源的方法可谓是八仙过海,各显神通。最直接的方式当然是使用 kubectl 命令,但如果想在 Java 代码里优雅地操作 Kubernetes,那就得借助 Kubernetes Java 客户端了。虽然官方提供了 kubernetes-client-java,但相比之下,Fabric8 KubernetesClient 更加简洁、强大,API 设计友好,特别适合 Java 开发者。
FunTester
2025/02/24
2970
从零上手 Fabric8 KubernetesClient
Fabric8 Kubernetes 教程——job、service、ingress、statefulSet、daemonSet
在 Kubernetes 的世界中,掌握各种资源的管理和操作是每个开发者和运维人员的必修课。无论是 Job、CronJob、Namespace、ServiceAccount 还是 Ingress,它们都是 Kubernetes 生态中不可或缺的一部分。下面,我们将通过一些常见的操作示例,带您深入了解这些资源的使用方法。
FunTester
2025/03/29
2040
Fabric8 Kubernetes 教程——job、service、ingress、statefulSet、daemonSet
kubernetes学习记录(14)——使用CustomResourceDefinitions(CRD)扩展Kubernetes API
目前我们的kubernetes集群版本为1.15.0,故参考文档为官方文档《Extend the Kubernetes API with CustomResourceDefinitions》
胡了了
2020/02/13
1.7K0
(译)自己的 Kubernetes 控制器(2)——用 Java 开发
前面文章中,我们大概描述了开发自定义 Kubernetes 控制器的基础内容。其中我们提到,只要能够使用 HTTP/JSON 就可以满足开发需求。本文中就言归正传开始开发。
崔秀龙
2020/05/07
1.1K0
一文读懂 Kubernetes APIServer 原理
作者杜杨浩,腾讯云高级工程师,热衷于开源、容器和Kubernetes。目前主要从事Kubernetes集群高可用&备份还原,以及边缘计算相关研发工作 前言 整个Kubernetes技术体系由声明式API以及Controller构成,而kube-apiserver是Kubernetes的声明式api server,并为其它组件交互提供了桥梁。因此加深对kube-apiserver的理解就显得至关重要了。 整体组件功能 kube-apiserver作为整个Kubernetes集群操作etcd的唯一入口,负
腾讯云原生
2021/01/18
1.5K0
Fabric8 Kubernetes 教程——OpenShift 客户端
OpenShift客户端(oc)是Red Hat推出的开源容器平台OpenShift的命令行工具,用于与OpenShift集群交互。通过oc,开发者可以高效管理应用全生命周期——包括部署、扩展、监控及调试容器化应用。它支持Kubernetes原生操作,同时扩展了OpenShift特有功能(如构建镜像、触发部署)。
FunTester
2025/04/06
1700
Fabric8 Kubernetes 教程——OpenShift 客户端
云原生|什么是K8s里的CRD(Custom Resource Definitions)?
Kubernetes 自定义资源定义(Custom Resource Definition,简称 CRD)是一种强大的 Kubernetes API 扩展机制。它允许用户创建和管理自定义资源,这些资源不是 Kubernetes 标准 API 的一部分。CRD 使得 Kubernetes 不仅限于内建资源(如 Pod、Service 等),还可以支持用户定义的资源类型。
琉璃康康
2024/01/22
6.1K1
云原生|什么是K8s里的CRD(Custom Resource Definitions)?
Spark Kubernetes 的源码分析系列 - submit
Kubernetes 是作为新的 resouceManager 集成到 Spark 中的,集成的思路跟将 YARN 集成是类似的,Spark 本身提供 Standalone 这种资源管理的模式,当然是不够的。
runzhliu
2020/08/06
1.5K0
Fabric8 Kubernetes 日志工具实践
最近在使用 Fabric8 Kubernetes Client 的过程中发现了新大陆一样,感觉利用这个库可以进行很多有趣的功能尝试,其中一个便是日志的本地化。
FunTester
2025/04/22
1920
Fabric8 Kubernetes 日志工具实践
部署 Kubernetes + KubeVirt 以及 KubeVirt的基本使用
KubeVirt目的是让虚拟机运行在容器中,下面就用下KubeVirt的几个基本操作:
后端云
2022/06/09
4.4K0
部署 Kubernetes + KubeVirt 以及 KubeVirt的基本使用
kube-apiserver 的设计与实现
kube-apiserver 是 kubernetes 中与 etcd 直接交互的一个组件,其控制着 kubernetes 中核心资源的变化。它主要提供了以下几个功能:
田飞雨
2020/02/27
3.3K0
kube-apiserver 的设计与实现
创建资源池租户
Java版云管平台项目中创建资源池租户,南向接口需要对底层的Kubernetes创建namespace的同时创建同名Kubernetes用户。
后端云
2021/10/09
8130
Kubernetes CRDs 自定义资源
REST API 是 Kubernetes 的基础结构,所有的操作和组件间的通信,包括外部的用户命令,都是由 API Server 处理的 REST API 调用。因此,Kubernetes 中的所有事物都被视为一个 API 对象并且都有一个与之对应的 API 入口。
Allen.Wu
2019/12/12
2.8K0
kubernetes自定义资源对象高级功能
kubernetes自定义资源对象再极大程度提高了API Server的可扩展性,让企业能够根据业务需求通过CRD编写controller或者operator来实现生产中各种特殊场景。随着k8s的版本升级,CRD的功能也越来越完善,下面对其中几点进行说明。
我的小碗汤
2019/05/28
1.3K0
快速上手 K8S Operator
如果你想要对 K8S 做二次开发或者说在原有的基础上封装一些功能让开发者更加好用,那么 Operator 的用法你可必须掌握。
LinkinStar
2023/10/18
3.5K1
Kubernetes 的核心是 API 而非容器
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/08/29
5650
Kubernetes 的核心是 API 而非容器
相关推荐
Fabric8 Kubernetes 教程——客户端基础
更多 >
LV.4
隐藏技能性能测试
目录
  • 获取 Metrics
    • 获取所有节点的 NodeMetrics:
    • 获取特定节点的 NodeMetrics:
    • 获取所有命名空间中所有 Pod 的 PodMetrics:
    • 获取某个特定命名空间中所有 Pod 的 PodMetrics:
    • 获取特定 Pod 的 PodMetrics:
  • Resource API
    • 从 Kubernetes API 服务器获取 Kubernetes 资源:
    • 将 Kubernetes 资源应用到 Kubernetes 集群(服务器端应用):
    • 应用 Kubernetes 资源并等待资源准备就绪:
    • 删除 Kubernetes 资源:
  • Resource List
    • 将 Kubernetes 资源列表应用到 Kubernetes 集群:
    • 删除资源列表:
  • 自定义资源定义(CRD)
    • 从 yaml 文件加载 CustomResourceDefinition:
    • 从 Kubernetes API 服务器获取 CustomResourceDefinition:
    • 创建 CustomResourceDefinition:
    • 应用 CustomResourceDefinition:
    • 列出 CustomResourceDefinition:
    • 删除 CustomResourceDefinition:
  • 资源类型化 API
    • 获取自定义资源的客户端实例:
    • 从 Kubernetes API 服务器获取自定义资源:
    • 创建 CustomResource:
    • 列出 CustomResource:
    • 删除 CustomResource:
    • 替换 CustomResource 的状态:
    • 修补 CustomResource 的状态:
    • 编辑 CustomResource 的状态:
    • 监听 CustomResource:
  • 无类型资源
    • 创建 ResourceDefinitionContext:
    • 从 YAML 文件加载资源:
    • 从 Kubernetes API 服务器获取资源:
    • 创建资源:
    • 列出 CustomResource:
    • 更新 CustomResource:
    • 删除 CustomResource:
    • 监听 CustomResource:
  • Spark Operator
    • 类型化资源 API:
    • 无类型资源 API:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档