混合版本代理

功能状态: Kubernetes v1.28 [alpha]

Kubernetes 1.30 包含一个 alpha 功能,允许 API 服务器 将资源请求代理到其他对等 API 服务器。当集群中运行着不同 Kubernetes 版本的多个 API 服务器时(例如,在将 Kubernetes 更新到新版本时),这很有用。

这使集群管理员能够配置高可用性集群,这些集群可以更安全地升级,方法是将资源请求(在升级期间发出)定向到正确的 kube-apiserver。该代理可以防止用户看到升级过程中出现的意外 404 未找到错误。

此机制称为混合版本代理

启用混合版本代理

启动 API 服务器 时,确保已启用 UnknownVersionInteroperabilityProxy 功能门控

kube-apiserver \
--feature-gates=UnknownVersionInteroperabilityProxy=true \
# required command line arguments for this feature
--peer-ca-file=<path to kube-apiserver CA cert>
--proxy-client-cert-file=<path to aggregator proxy cert>,
--proxy-client-key-file=<path to aggregator proxy key>,
--requestheader-client-ca-file=<path to aggregator CA cert>,
# requestheader-allowed-names can be set to blank to allow any Common Name
--requestheader-allowed-names=<valid Common Names to verify proxy client cert against>,

# optional flags for this feature
--peer-advertise-ip=`IP of this kube-apiserver that should be used by peers to proxy requests`
--peer-advertise-port=`port of this kube-apiserver that should be used by peers to proxy requests`

# …and other flags as usual

API 服务器之间的代理传输和身份验证

  • 源 kube-apiserver 重用 现有的 APIserver 客户端身份验证标志 --proxy-client-cert-file--proxy-client-key-file 来呈现其身份,该身份将由其对等方(目标 kube-apiserver)进行验证。目标 API 服务器根据您使用 --requestheader-client-ca-file 命令行参数指定的配置来验证对等连接。

  • 要对目标服务器的服务证书进行身份验证,您必须通过将 --peer-ca-file 命令行参数指定给 API 服务器来配置证书颁发机构捆绑包。

对等 API 服务器连接的配置

要设置对等方将用于代理请求的 kube-apiserver 的网络位置,请使用 --peer-advertise-ip--peer-advertise-port 命令行参数到 kube-apiserver,或在 API 服务器配置文件中指定这些字段。如果未指定这些标志,对等方将使用 --advertise-address--bind-address 命令行参数到 kube-apiserver 的值。如果这些也未设置,则使用主机的默认接口。

混合版本代理

启用混合版本代理后,聚合层 将加载一个特殊的过滤器,执行以下操作

  • 当资源请求到达无法提供该 API 的 API 服务器时(可能是因为该服务器的版本早于 API 引入之前,或者 API 在该 API 服务器上已关闭),API 服务器会尝试将请求发送到可以提供请求的 API 的对等 API 服务器。它通过识别本地服务器不识别的 API 组/版本/资源来实现,并尝试将这些请求代理到能够处理请求的对等 API 服务器。
  • 如果对等 API 服务器无法响应,则 API 服务器将返回 503(“服务不可用”)错误。

幕后工作原理

当 API 服务器收到资源请求时,它首先检查哪些 API 服务器可以提供请求的资源。此检查使用内部 StorageVersion API 进行。

  • 如果接收请求的 API 服务器知道该资源(例如,GET /api/v1/pods/some-pod),则该请求将在本地处理。

  • 如果未找到请求资源的内部 StorageVersion 对象(例如,GET /my-api/v1/my-resource),并且配置的 APIService 指定代理到扩展 API 服务器,则该代理将按照扩展 API 的常规 流程 进行。

  • 如果为请求的资源找到了有效的内部 StorageVersion 对象(例如,GET /batch/v1/jobs),并且尝试处理请求的 API 服务器(处理 API 服务器)已禁用 batch API,则处理 API 服务器 将使用从获取的 StorageVersion 对象中获取的信息来获取提供相关 API 组/版本/资源(在本例中为 api/v1/batch)的对等 API 服务器。然后,处理 API 服务器 将请求代理到能够处理请求的匹配对等 kube-apiserver 之一。

    • 如果该 API 组/版本/资源没有已知对等方,则处理 API 服务器将请求传递到其自己的处理程序链,该链最终应返回 404(“未找到”)响应。

    • 如果处理 API 服务器已识别并选择了一个对等 API 服务器,但该对等服务器无法响应(由于网络连接问题或请求接收与控制器将对等信息注册到控制平面之间的数据竞争),则处理 API 服务器将返回 503(“服务不可用”)错误。

上次修改时间:2024 年 2 月 6 日凌晨 12:29 PST:使用新的 feature_gate_name 选项 (a3f297bc80)