混合版本代理
Kubernetes v1.28 [alpha]
(默认启用:false)Kubernetes 1.34 包含一个 Alpha 功能,它允许 API 服务器 将资源请求代理到其他_对等_ API 服务器。当单个集群中运行多个不同版本 Kubernetes 的 API 服务器时(例如,在新版本 Kubernetes 的长期滚动升级期间),此功能非常有用。
这使得集群管理员能够通过在升级期间将资源请求定向到正确的 kube-apiserver,从而配置更安全地升级的高可用集群。这种代理可以防止用户看到因升级过程引起的意外的 404 Not Found 错误。
此机制称为_混合版本代理_。
启用混合版本代理
确保在启动 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 重用现有的 API 服务器客户端身份验证标志
--proxy-client-cert-file
和--proxy-client-key-file
来提供其身份,该身份将由其对等方(目标 kube-apiserver)验证。目标 API 服务器根据您使用--requestheader-client-ca-file
命令行参数指定的配置来验证对等连接。为了验证目标服务器的服务证书,您必须通过向**源** API 服务器指定
--peer-ca-file
命令行参数来配置证书颁发机构包。
对等 API 服务器连接配置
要设置对等方将用于代理请求的 kube-apiserver 的网络位置,请使用 --peer-advertise-ip
和 --peer-advertise-port
命令行参数来 kube-apiserver 或在 API 服务器配置文件中指定这些字段。如果未指定这些标志,对等方将使用 --advertise-address
或 --bind-address
命令行参数的值。如果这些也未设置,则使用主机的默认接口。
混合版本代理
当您启用混合版本代理时,聚合层 会加载一个特殊过滤器,该过滤器执行以下操作:
- 当资源请求到达一个无法提供该 API 的 API 服务器时(可能是因为该 API 服务器的版本早于该 API 的引入,或者该 API 在该 API 服务器上已关闭),该 API 服务器会尝试将请求发送到可以提供所请求 API 的对等 API 服务器。它通过识别本地服务器无法识别的 API 组/版本/资源来做到这一点,并尝试将这些请求代理到能够处理该请求的对等 API 服务器。
- 如果对等 API 服务器未能响应,则_源_ API 服务器将响应 503 (“Service Unavailable”) 错误。
它如何工作
当 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 ("Not Found") 响应。
如果处理 API 服务器已识别并选择了对等 API 服务器,但该对等服务器未能响应(由于网络连接问题,或请求被接收与控制器将对等服务器信息注册到控制平面之间的数据竞争等原因),则处理 API 服务器将响应 503 ("Service Unavailable") 错误。