教程云原生容器编排【免费下载链接】kubernetes-handbookKubernetes 架构与生态从云原生到 AI 原生基础设施的构建指南项目地址https://gitcode.com/gh_mirrors/ku/kubernetes-handbook点击查看免费下载在 Kubernetes 的 API 扩展体系里APIService是apiregistration.k8s.io组中的核心资源对象它负责将一个外部聚合API server 提供的特定GroupVersion注册进集群使该 API 能与内置 API 一样被kubectl、认证授权体系和 HPA 等组件统一使用。本文以本仓库 concepts/apiservice.md 为主线结合 concepts/aggregated-api-server.md 的架构说明与 manifests/HPA/custom-metrics.yaml 的实战清单完整讲解 APIService 的字段语义、创建与验证流程、集群查询方法以及它在自定义指标 HPA 场景中的落地方式。读完本文你将能够读懂任何聚合 API 的注册清单并独立完成一个自定义 API 从注册到可用的全流程。APIService 是什么聚合 API server 的注册表Kubernetes 原生 API server 是一个巨石monolithic应用。为了把这块巨石拆开、让用户在不修改 Kubernetes 官方源码的前提下集成自己的 API serverKubernetes 引入了 Aggregated聚合的API server 机制详见 concepts/aggregated-api-server.md。聚合机制的核心组件是kube-aggregator它负责三件事提供用于注册 API server 的 API——即apiregistration.k8s.io组用户通过创建APIService资源对象完成注册汇总所有 API server 的信息——维护集群中全部已注册 API 的GroupVersion清单代理所有客户端到 API server 的请求——kubectl、API server 及其他客户端对聚合 API 的请求统一由它转发到对应的后端服务。kube-aggregator有两种启用方式一种是test mode / single-user mode作为独立进程运行另一种是gateway modekube-apiserver嵌入到kube-aggregator组件中作为集群的 gateway 聚合所有 apiserver。kube-aggregator的二进制文件已经包含在 Kubernetes release 中。在 1.7 版本中apiregistration.k8s.io/v1beta1API 已内置在集群中因此可以直接通过 YAML 定义APIService来注册聚合 API——这正是本文主角APIService的用武之地。APIService 的结构定义APIService用来表示一个特定的GroupVersion中的 server。其结构定义位于 Kubernetes 代码仓库的staging/src/k8s.io/kube-aggregator/pkg/apis/apiregistration/types.go中即apiregistration内部 API 类型定义所在位置这从侧面说明APIService属于kube-aggregator项目内部核心 API 的一部分。一个典型的 APIService 示例配置如下与 manifests/HPA/custom-metrics.yaml 中注册自定义指标 API 的清单一致apiVersion: apiregistration.k8s.io/v1beta1 kind: APIService metadata: name: v1alpha1.custom-metrics.metrics.k8s.io spec: insecureSkipTLSVerify: true group: custom-metrics.metrics.k8s.io groupPriorityMinimum: 1000 versionPriority: 5 service: name: api namespace: custom-metrics version: v1alpha1APIService 字段详解使用apiregistration.k8s.io/v1beta1版本的 APIService在metadata.name中定义该 API 的名字。命名约定为version.group例如上面的v1alpha1.custom-metrics.metrics.k8s.io表示注册custom-metrics.metrics.k8s.io组的v1alpha1版本。各spec字段的含义如下字段说明insecureSkipTLSVerify当与该后端服务通信时禁用 TLS 证书认证。强烈建议不要设置该参数默认为false应使用caBundleCA 证书内容代替以保证通信安全service与该 APIService 通信时引用的 Service需注明nameService 名字和namespace所属命名空间。如果为空则该 API groupversion 的所有通信将由聚合层在本地的 443 端口处理即本地服务模式groupPriorityMinimum该组 API 的处理优先级。主要排序基于groupPriorityMinimum数字越大优先级越高客户端会优先与其通信处理请求次要排序基于字母表顺序例如v1.bar比v1.foo优先级更高versionPriority控制组内 API 版本的顺序必须大于零。主要排序基于versionPriority从高到低20 大于 10次要排序基于对象名称的字母比较v1.foo排在v1.bar之前。由于各版本都在同一个组内数字可以很小一般小于 10group/version共同构成要注册的GroupVersion对应 REST 路径/apis/group/versioncaBundle用于验证后端服务证书的 CA 证书PEM 格式。在创建时不设置、而使用insecureSkipTLSVerify: true时查询到的对象中该字段会显示为null创建与验证 APIService将上面的 YAML 保存为文件后使用kubectl create即可创建对应的 APIServicekubectl create -f apiservice.yaml创建完成后可以用kubectl get查看我们创建的 APIService 的完整对象kubectl get apiservice v1alpha1.custom-metrics.metrics.k8s.io -o yaml输出示例apiVersion: apiregistration.k8s.io/v1beta1 kind: APIService metadata: creationTimestamp: 2017-12-14T08:27:35Z name: v1alpha1.custom-metrics.metrics.k8s.io resourceVersion: 35194598 selfLink: /apis/apiregistration.k8s.io/v1beta1/apiservices/v1alpha1.custom-metrics.metrics.k8s.io uid: a31a3412-e0a8-11e7-9fa4-f4e9d49f8ed0 spec: caBundle: null group: custom-metrics.metrics.k8s.io groupPriorityMinimum: 1000 insecureSkipTLSVerify: true service: name: api namespace: custom-metrics version: v1alpha1 versionPriority: 5 status: conditions: - lastTransitionTime: 2017-12-14T08:27:38Z message: all checks passed reason: Passed status: True type: Available注意status.conditions中的Available条件status: True、reason: Passed、message: all checks passed表示该 APIService 已通过聚合层对后端 Service 的连通性与 TLS 校验可以正常提供服务。若后端 Service 不可达、镜像拉取失败或证书校验失败Available会变为False此时应优先检查spec.service指向的 Service 是否存在、其selector是否命中后端 Pod。查看集群支持的 APIService 与 API 版本作为 Kubernetes 中的一种资源对象APIService 可以直接用kubectl get apiservice查看。例如查看集群中所有的 APIService$ kubectl get apiservice NAME AGE v1. 2d v1.authentication.k8s.io 2d v1.authorization.k8s.io 2d v1.autoscaling 2d v1.batch 2d v1.monitoring.coreos.com 1d v1.networking.k8s.io 2d v1.rbac.authorization.k8s.io 2d v1.storage.k8s.io 2d v1alpha1.custom-metrics.metrics.k8s.io 2h v1beta1.apiextensions.k8s.io 2d v1beta1.apps 2d v1beta1.authentication.k8s.io 2d v1beta1.authorization.k8s.io 2d v1beta1.batch 2d v1beta1.certificates.k8s.io 2d v1beta1.extensions 2d v1beta1.policy 2d v1beta1.rbac.authorization.k8s.io 2d v1beta1.storage.k8s.io 2d v1beta2.apps 2d v2beta1.autoscaling 2d从输出可以看到v1.这类只有组名没有子组名的条目表示核心 API 组v1alpha1.custom-metrics.metrics.k8s.io就是通过 APIService 注册进来的聚合 API——它的AGE为 2h明显晚于其他内置 API正是我们刚刚创建的那个对象。另外查看当前 Kubernetes 集群支持的所有 API 版本还可以使用kubectl api-versions$ kubectl api-versions apiextensions.k8s.io/v1beta1 apiregistration.k8s.io/v1beta1 apps/v1beta1 apps/v1beta2 authentication.k8s.io/v1 authentication.k8s.io/v1beta1 authorization.k8s.io/v1 authorization.k8s.io/v1beta1 autoscaling/v1 autoscaling/v2beta1 batch/v1 batch/v1beta1 certificates.k8s.io/v1beta1 custom-metrics.metrics.k8s.io/v1alpha1 extensions/v1beta1 monitoring.coreos.com/v1 networking.k8s.io/v1 policy/v1beta1 rbac.authorization.k8s.io/v1 rbac.authorization.k8s.io/v1beta1 storage.k8s.io/v1 storage.k8s.io/v1beta1 v1注意其中出现的custom-metrics.metrics.k8s.io/v1alpha1——它与kubectl get apiservice中新增的v1alpha1.custom-metrics.metrics.k8s.io一一对应这正是 APIService 注册生效的直接证据聚合 API 一旦注册成功就会自动出现在kubectl api-versions的列表中可供其他控制器与客户端发现和使用。实战用 APIService 注册自定义指标 API驱动 HPA 扩缩容APIService 最常见的落地场景之一是注册自定义指标 APIcustom.metrics.k8s.io以驱动基于自定义指标的 HPA例如根据 QPS、http_requests等业务指标自动扩缩容。本仓库 concepts/custom-metrics-hpa.md 记录了完整的部署思路核心步骤包括1. 确认版本并配置 kube-apiserver 的聚合参数Kubernetes 1.7 版本中需要修改 kube-apiserver 的启动配置本仓库对应的环境配置文件为 etc/kubernetes/apiserver通过 systemd/kube-apiserver.service 中的$KUBE_API_ARGS传入增加以下参数以启用 request header 认证聚合层与 API server 之间传递用户身份信息的基础--requestheader-client-ca-file/etc/kubernetes/ssl/ca.pem \ --requestheader-allowed-namesaggregator \ --requestheader-extra-headers-prefixX-Remote-Extra- \ --requestheader-group-headersX-Remote-Group \ --requestheader-username-headersX-Remote-User \ --proxy-client-cert-file/etc/kubernetes/ssl/kubernetes.pem \ --proxy-client-key-file/etc/kubernetes/ssl/kubernetes-key.pem这些参数用于配置 aggregator 的 CA 证书与代理客户端证书是 APIService 后端如自定义指标 API server能正确通过认证的必要条件。2. 部署自定义指标 API server本仓库的 manifests/HPA/custom-metrics.yaml 是完整的一体化清单它按顺序包含Namespace: custom-metrics与ServiceAccount: custom-metrics-apiserver两个 RBAC 绑定custom-metrics:system:auth-delegatorClusterRoleBinding将认证委托给核心 API server和custom-metrics-auth-readerRoleBinding读取kube-system中extension-apiserver-authentication-reader的认证配置Deployment: custom-metrics-apiserver运行k8s-prometheus-adapter镜像仓库示例中镜像地址为harbor-001.jimmysong.io/library/k8s-prometheus-adapter实际部署时应替换为你自己的镜像仓库地址并通过--prometheus-urlhttp://sample-metrics-prom.default.svc:9090指向 PrometheusService: apinamespace 为custom-metrics端口 443即 APIService 的spec.service所指的后端APIService 资源即上文反复出现的v1alpha1.custom-metrics.metrics.k8s.io注册清单两个授权 HPA 控制器访问自定义指标 API 的 RBAC 对象custom-metrics-server-resourcesClusterRole 及其绑定。部署完成后自定义 API 即可通过浏览器访问http://api-server-address:8080/apis/custom-metrics.metrics.k8s.io/v1alpha1也可以使用kubectl get --raw直接查询$ kubectl get --rawapis/custom-metrics.metrics.k8s.io/v1alpha1 {kind:APIResourceList,apiVersion:v1,groupVersion:custom-metrics.metrics.k8s.io/v1alpha1,resources:[{name:jobs.batch/http_requests,singularName:,namespaced:true,kind:MetricValueList,verbs:[get]},{name:namespaces/http_requests,singularName:,namespaced:false,kind:MetricValueList,verbs:[get]},...]}返回的APIResourceList中列出了 Prometheus 暴露的各类指标资源如pods/http_requests、services/up、namespaces/scrape_duration_seconds等这些就是 HPA 可以直接引用的指标名。3. 编写基于自定义指标的 HPAmanifests/HPA/hpa.yaml 给出了引用http_requests指标的 HPA 示例kind: HorizontalPodAutoscaler apiVersion: autoscaling/v2beta1 metadata: name: sample-metrics-app-hpa spec: scaleTargetRef: kind: Deployment name: sample-metrics-app minReplicas: 2 maxReplicas: 10 metrics: - type: Object object: target: kind: Service name: sample-metrics-app metricName: http_requests targetValue: 100spec.metrics中通过type: Object引用名为sample-metrics-app的 Service并以http_requests为指标名、targetValue: 100为目标值。HPA 控制器会通过kube-controller-manager的--horizontal-pod-autoscaler-use-rest-clientstrue参数走 REST 客户端向 APIService 注册的custom-metrics.metrics.k8s.io/v1alpha1查询指标数据从而将Prometheus 采集的业务指标 → 聚合 API → APIService → HPA整条链路打通。小结APIService是 Kubernetes API 聚合机制的注册入口通过metadata.name声明GroupVersion通过spec.service声明后端服务通过groupPriorityMinimum与versionPriority控制 API 的发现与访问优先级并通过status.conditions反馈注册后的可用状态。它让第三方 API server 可以无缝接入集群被kubectl、RBAC 和 HPA 等组件统一管理——这正是 Kubernetes 从巨石 API server 走向可插拔扩展生态的关键一环。赞分享教程云原生容器编排【免费下载链接】kubernetes-handbookKubernetes 架构与生态从云原生到 AI 原生基础设施的构建指南项目地址https://gitcode.com/gh_mirrors/ku/kubernetes-handbook点击查看免费下载相关推荐Kubernetes 聚合 API Serverkube-aggregator深度解析从 APIService 注册到自定义指标实战Kubernetes 聚合 API Serverkube aggregator深度解析从 APIService 注册到自定义指标实战 聚合 API Ser教程云原生容器编排kube-aggregator 深度解析Kubernetes API 聚合层APIService的架构与实现原理kube aggregator 深度解析Kubernetes API 聚合层APIService的架构与实现原理 导读 kube aggregator云原生容器编排集群管理微服务5分钟快速上手Intel RealSense MATLAB开发者包安装与使用完整指南5分钟快速上手Intel RealSense MATLAB开发者包安装与使用完整指南 想要在MATLAB中轻松使用Intel RealSense深度相机进行三智能硬件音视频计算机视觉创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
