混合版本代理
特性状态: Kubernetes v1.36 起 Beta(默认启用)
官方文档参考
| 项目 | 链接 |
|---|---|
| 混合版本代理(官方中文文档) | https://kubernetes.io/zh-cn/docs/concepts/architecture/mixed-version-proxy/ |
解决什么问题?
Kubernetes 允许 kube-apiserver 之间在滚动升级期间存在版本偏差(skew):HA 集群中的多台 API 服务器被逐台升级时,集群会短暂处于"新旧版本并存"的混合状态。这时会出现一个典型问题:
- 新版本引入(或移除)的 API 组/版本/资源,只在部分 API 服务器上可用;
- 客户端的请求经过负载均衡随机落到某一台 API 服务器,落到"不认识该 API"的旧服务器上时,会得到意外的 404 Not Found 错误;
- 这类错误发生在升级窗口期内,对用户表现为"时好时坏",极难排查。
Kubernetes 1.37 包含了一个特性,可以让 API 服务器 代理指向其他对等(peer)API 服务器的资源请求,并允许客户端通过发现功能全面了解整个集群提供的资源。当一个集群中运行着多个 API 服务器、且各服务器的 Kubernetes 版本不同时(例如上线 Kubernetes 新版本的时间跨度较长时),这一特性非常有用。
这使得集群管理员能够配置高可用性集群,并能更安全地进行升级,具体方式是:将升级期间发起的资源请求导向正确的 kube-apiserver。这种代理防止用户看到由升级过程导致的意外的 404 未找到错误。此机制被称为混合版本代理(Mixed Version Proxy,MVP)。
工作原理总览
启用混合版本代理时,聚合层会加载一个特殊的过滤器,完成以下操作:当资源请求到达一个无法提供该 API 的 API 服务器时(可能的原因是服务器版本早于该 API 的正式引入日期,或该 API 在此服务器上被关闭),API 服务器会尝试将请求发送到能够提供所请求 API 的对等 API 服务器。API 服务器通过发现本地服务器无法识别的 API 组/版本/资源来实现这一点,并尝试将这些请求代理 到能够处理这些请求的对等 API 服务器。
一张图看懂请求的转发路径:

内部工作原理
当 API 服务器收到一个资源请求时,它首先利用非对等聚合发现文档检查哪些 API 服务器可以提供所请求的资源,然后按下面的决策链处理:
| 序号 | 场景 | 处理方式 | 最终响应 |
|---|---|---|---|
| 1 | 请求的资源出现在本机检索到的非对等聚合发现文档中(例如 GET /api/v1/pods/some-pod) | 本地处理 | 正常响应 |
| 2 | 请求的资源未在本机发现文档中找到(例如 GET /apis/resource.k8s.io/v1beta1/resourceclaims,而该 API 在较新版本才引入) | 本地服务器检查所有对等 API 服务器的非对等聚合发现文档,找到能提供该 API 组/版本/资源的对等方,将请求代理过去 | 由匹配的对等 kube-apiserver 响应 |
| 3 | 没有任何对等方认识所请求的 API 组/版本/资源 | 处理请求的 API 服务器将请求传递给自己的处理程序链 | 404 Not Found |
| 4 | 已选中某个对等 API 服务器,但该对等方无法响应(如网络连接问题,或请求与向控制平面注册对等信息的控制器之间存在数据竞争) | 源 API 服务器直接返回错误 | 503 Service Unavailable |
对等聚合发现(peer-aggregated discovery)会把集群中所有 API 服务器提供的资源合并成一份总发现文档;而"非对等"版本只反映本机能提供的资源。MVP 正是靠对比"非对等发现文档"来判断某个 API 是否该转发给对等方的。
对等聚合发现
当你启用该特性时,默认情况下,发现请求会自动提供一个全面的发现文档——列出集群中任何 API 服务器提供的所有资源。客户端只需访问任意一台 API 服务器,即可看到全集群能力视图,不再受"连到哪台就看到哪个版本"的困扰。
如果你想要请求一个非对等聚合的发现文档,可以在发现请求中添加以下 Accept 标头:
application/json;g=apidiscovery.k8s.io;v=v2;as=APIGroupDiscoveryList;profile=nopeer
对等聚合发现仅支持向 /apis 端点发出的聚合发现请求,而不支持未聚合(旧版)发现请求。
如何启用
背景知识:该特性对应 kube-apiserver 的 UnknownVersionInteroperabilityProxy 特性门控(KEP-5920,Mixed Version Proxy / 混合版本集群互操作)。以下为官方给出的启动配置。
当你启动 API 服务器时,确保启用了 UnknownVersionInteroperabilityProxy 特性门控,并配置对等互连所需的证书与地址参数:
kube-apiserver \
--feature-gates=UnknownVersionInteroperabilityProxy=true \
# 需要为此特性添加的命令行参数
--peer-ca-file=<指向 kube-apiserver CA 证书的路径> \
--proxy-client-cert-file=<指向聚合器代理证书的路径> \
--proxy-client-key-file=<指向聚合器代理密钥的路径> \
--requestheader-client-ca-file=<指向聚合器 CA 证书的路径> \
# requestheader-allowed-names 可设置为空以允许所有 Common Name
--requestheader-allowed-names=<验证代理客户端证书的合法 Common Name> \
# 此特性的可选标志
--peer-advertise-ip=<应由对等方用于代理请求的 kube-apiserver IP> \
--peer-advertise-port=<应由对等方用于代理请求的 kube-apiserver 端口> \
# ... 和其他常规标志
参数速查表:
| 参数 | 作用 | 是否必需 |
|---|---|---|
--feature-gates=UnknownVersionInteroperabilityProxy=true | 启用混合版本代理特性 | 启用特性时必需 |
--peer-ca-file | 为源 API 服务器配置证书机构包,用于验证目标(对等)服务器的证书 | 是 |
--proxy-client-cert-file / --proxy-client-key-file | 源 kube-apiserver 重用现有的 API 服务器客户端身份验证标志,向对等方表明身份 | 是(复用聚合层既有证书) |
--requestheader-client-ca-file | 目标 API 服务器据此验证对等连接 | 是(复用聚合层既有证书) |
--requestheader-allowed-names | 验证代理客户端证书的合法 Common Name,可置空以允许所有 CN | 可选 |
--peer-advertise-ip / --peer-advertise-port | 告知对等方本机的网络位置,用于反向代理请求 | 可选(见下) |
对等 API 服务器连接的配置
- 代理传输与身份验证:源 kube-apiserver 重用现有的 API 服务器客户端身份验证标志
--proxy-client-cert-file和--proxy-client-key-file来表明其身份,供对等(目标 kube-apiserver)验证。目标 API 服务器根据--requestheader-client-ca-file指定的配置来验证对等连接。要对目标服务器所用的证书进行身份验证,必须通过--peer-ca-file为源 API 服务器配置一个证书机构包。 - 对等网络位置:使用
--peer-advertise-ip和--peer-advertise-port命令行参数(或在 API 服务器配置文件中指定这些字段)来设置 kube-apiserver 的网络位置,供对等方来代理请求。如果未指定这些参数,对等方将使用--advertise-address或--bind-address参数的值;如果这些也未设置,则使用主机的默认接口。
我的总结与避坑清单
- MVP 只解决升级窗口期的 404:它的价值场景是"多台 API 服务器版本不同"的滚动升级期,平时单版本集群用不到转发逻辑;不要把它当成常驻的版本路由器。
- 默认 Beta、v1.36 起默认启用,但依赖 kube-apiserver 侧配置对等证书(
--peer-ca-file等)才能完整工作,升级 HA 集群前先检查控制面参数。 - 决策链记四步:本机能识别 → 本地处理;本机不认识但有对等方认识 → 代理转发;谁都不认识 → 404;对等方选定了但连不上 → 503。
- 503 不等于服务挂了:升级期间偶发 503 可能是 MVP 转发失败(网络问题或对等注册控制器的数据竞争),看到 503 先查对端 API 服务器状态和
--peer-advertise-ip/port配置。 - 发现文档有两套:默认的对等聚合发现是"全集群视图",加
profile=nopeer的 Accept 标头才能拿到本机视图;客户端做 API 能力探测时要清楚自己读到的是哪一份。 - 只支持聚合发现:对等聚合发现仅覆盖
/apis端点的聚合发现请求,仍依赖旧版非聚合发现的老客户端无法享受该能力。 - 复用聚合层证书但新增 peer CA:
--proxy-client-cert-file、--requestheader-client-ca-file等与聚合层(aggregation layer)共用,新增的是--peer-ca-file;证书配置错误会表现为对等代理链路全部失败。 --peer-advertise-ip/port有兜底顺序:未设置时依次回退到--advertise-address、--bind-address、主机默认接口;负载均衡器后面的 API 服务器建议显式指定,避免对等方代理到错误的地址。- 升级策略配合:即使启用了 MVP,滚动升级仍应遵循官方版本偏差规则(kubelet 等组件与 API 服务器的版本差上限),MVP 只是抹平 API 请求层的偏差,不放宽其他组件的兼容性约束。
- 排障入口:升级期间出现"API 时有时无"时,优先确认各 API 服务器版本的
kubectl get --raw /apis输出差异,再检查 MVP 的门控与证书参数,最后查对等连接的网络可达性。

