我们如何构建一个动态的Kubernetes API服务器用于API... - Ænix

作者:API传播员 · 2025-12-15 · 阅读时间:5分钟
Kubernetes API聚合层是一种扩展API功能的强大工具,允许开发者构建动态扩展API服务器以支持命令式逻辑、子资源管理和动态响应生成。通过注册APIService,Kubernetes可将特定资源请求重定向到扩展服务器,实现复杂验证和自定义输出,提升平台灵活性和可扩展性。

什么是 Kubernetes API 聚合层?

Kubernetes 提供了多种方式来扩展其 API 服务器,并将其API 框架中。


API 聚合层与扩展 API 服务器的基础概念

在深入探讨之前,我们需要明确一些定义:

  • API 聚合层:Kubernetes 的一个特性,用于扩展 API 功能。
  • 扩展 API 服务器:API 聚合层的具体实现,类似于标准的 Kubernetes API 服务器,但独立运行,专门处理特定资源类型的请求。

通过 API 聚合层,开发者可以编写自己的扩展 API 服务器,并将其注册为 Kubernetes 的 APIService。这种机制允许 Kubernetes 将特定组的资源请求重定向到扩展 API 服务器进行处理。

列出已注册的 APIService

可以通过以下命令查看所有已注册的 APIService:

kubectl get apiservices.apiregistration.k8s.io

示例输出:

NAME                            SERVICE                     AVAILABLE   AGE
v1alpha1.apps.cozystack.io      cozy-system/cozystack-api   True        7h29m

当 Kubernetes API 服务器接收到对 v1alpha1.apps.cozystack.io 组中资源的请求时,这些请求会被重定向到扩展 API 服务器,由后者根据业务逻辑进行处理。


为什么选择 API 聚合层?

子资源的支持

Kubernetes 中的子资源是对主要资源(如 Pods、Deployments)的附加操作接口。例如:

  • /status:独立于父对象的状态字段。
  • /exec/portforward/log:用于命令式操作,如查看日志、代理连接或在容器中执行命令。

为了支持这些命令式操作,扩展 API 服务器是必不可少的。以下是一些典型的例子:

  • KubeVirt:扩展 Kubernetes API 以支持虚拟机操作,提供 /restart/console 等子资源。
  • Knative:为无服务器计算扩展 Kubernetes API,支持 /scale 子资源以实现自动扩缩。

动态生成响应

扩展 API 服务器允许开发者动态生成响应,而无需将数据存储在 etcd 中。例如:

  • metrics-server:实时从 Kubelet 获取节点和 Pod 的指标数据,无需存储在 etcd 中。
  • Postgres 集成:通过扩展 API 服务器,Postgres 数据库中的实体(如用户、授权)可以直接映射为 Kubernetes 资源,支持使用 kubectl 进行管理。

复杂验证逻辑

扩展 API 服务器支持更复杂的验证逻辑,例如:

  • 即时的服务器端验证,无需依赖 webhook。
  • 自定义的表输出格式,而不受 CRD 的 additionalPrinterColumns 限制。

实现扩展 API 服务器的关键步骤

选择开发工具

以下是两种常见的工具:

  1. apiserver-builder:提供类似于 kubebuilder 的框架,但已多年未更新。
  2. sample-apiserver:一个基于 Kubernetes 官方库的现成示例,可作为项目的基础。

我们选择了第二种方案,因为它更稳定且易于集成。

配置扩展 API 服务器

为了实现动态资源注册和转换,我们采取了以下步骤:

  1. 定义配置结构:通过配置文件动态生成资源类型。
  2. 实现资源转换逻辑:将自定义资源与 HelmRelease 资源相互转换。
  3. 实现核心方法:包括 Get()Delete()List()Create() 方法。

以下是一个示例配置:

apiVersion: apps.cozystack.io/v1alpha1
kind: ConfigMap
metadata:
  name: cozystack-config
data:
  types:
    - name: Bucket
      mapping: HelmRelease
    - name: Redis
      mapping: HelmRelease

使用扩展 API 服务器的实际案例

在 Cozystack 平台中,我们通过扩展 API 服务器实现了以下功能:

动态资源注册

通过以下命令查看所有动态注册的资源:

kubectl api-resources | grep cozystack

示例输出:

buckets                   apps.cozystack.io/v1alpha1      true        Bucket
redis                     apps.cozystack.io/v1alpha1      true        Redis

资源管理示例

  • 列出 S3 数据包:

    kubectl get buckets.apps.cozystack.io -n tenant-kvaps

    示例输出:

    NAME         READY   AGE    VERSION
    foo          True    22h    0.1.0
  • 列出 Redis 实例:

    kubectl get redis.apps.cozystack.io -n tenant-kvaps

    示例输出:

    NAME         READY   AGE    VERSION
    redis-test   True    18d    0.1.0

API 聚合层的最佳实践与注意事项

适用场景

  • 实现命令式逻辑和子资源。
  • 动态生成响应或使用非 etcd 后端。
  • 需要复杂的验证逻辑或自定义表输出。

避免的反模式

  • 如果无法保证后端的高可用性,可能会影响 Kubernetes 的核心功能(如命名空间删除)。
  • 对于简单的资源类型,建议优先使用 CRD 和控制器。

未来计划

我们的扩展 API 服务器将继续优化,计划包括:

  • 基于 Helm charts 自动生成 OpenAPI 验证规范。
  • 开发控制器以收集发布信息并改进用户体验。
  • 更新仪表板以直接支持新的 API。

通过 API 聚合层,我们能够快速扩展 Kubernetes 的功能,为平台提供更高的灵活性和可扩展性。

原文链接: https://blog.aenix.io/how-we-built-a-dynamic-kubernetes-api-server-for-the-api-aggregation-layer-in-cozystack-15709a183c86