|
本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。 |
同步托管集群
同步允许Rancher更新集群值,以便与托管在AKS、EKS或GKE中的相应集群对象保持最新。这使得除了Rancher之外的其他来源可以拥有托管集群的状态。
|
如果您同时处理来自另一个来源的更新,您可能会不小心覆盖一个来源的状态。如果您在完成来自另一个来源的更新后5分钟内处理来自一个来源的更新,也可能会发生这种情况。 |
工作原理
要理解同步如何工作,必须了解Rancher集群对象上的两个字段:
-
集群的配置对象,位于集群的Spec上:
-
对于AKS,该字段称为AKSConfig
-
对于EKS,该字段称为EKSConfig
-
对于GKE,该字段称为GKEConfig
-
-
UpstreamSpec对象
-
对于AKS,它位于集群状态的AKSStatus字段上。
-
对于EKS,它位于集群状态的EKSStatus字段上。
-
对于GKE,它位于集群状态的GKEStatus字段上。
-
定义这些对象的结构类型可在其对应的 operator 项目中找到:
所有字段都是可为空的,除了以下字段:集群名称、位置(区域或可用区)、导入和云凭证引用。
AKSConfig、EKSConfig或GKEConfig表示期望状态。空值会被忽略。配置对象中非空的字段可以视为受管理的。当在Rancher中创建集群时,所有字段都是非空的,因此是受管理的。当在Rancher中注册一个已有的集群时,所有可为空的字段被设置为nil,并且不受管理。一旦这些字段的值被Rancher更改,它们就会变为受管理的。
UpstreamSpec表示集群在托管的Kubernetes提供者中的状态。它每5分钟刷新一次。在UpstreamSpec刷新后,Rancher会检查集群是否正在进行更新。如果当前更新中,则不再执行其他操作。如果当前没有更新,AKSConfig、EKSConfig或GKEConfig上的任何受管理字段将被最近更新的UpstreamSpec中的相应值覆盖。
|
当您从云提供商导入集群到Rancher时,UpstreamSpec表示集群状态,而Config为空。如果您通过Rancher UI更新导入的集群,则UpstreamSpec和Config都变为非空。对集群的任何进一步更新应通过Rancher应用。这是因为没有安全的方法来确定来自UpstreamSpec的更改是否代表期望状态,或者只是与Config的不匹配。如果您在通过 Rancher UI 应用任何更新后,通过云提供商控制台更新导入的集群,控制器将部署回滚,并且 Config 的内容将被视为期望状态。 |
有效的期望状态可以视为UpstreamSpec,加上AKSConfig、EKSConfig或GKEConfig中的所有非空字段。这就是在UI中显示的内容。
如果 Rancher 和另一个来源同时尝试更新集群,或者在更新完成后的 5 分钟内,任何受管理的字段可能会陷入竞争条件。以 EKS 为例,集群可能将 PrivateAccess 作为一个受管理的字段。如果 PrivateAccess 为假,并在 11:01 在 EKS 控制台中启用,并且在 11:05 之前从 Rancher 更新了标签,那么该值可能会被覆盖。如果在集群仍在处理更新时对标签进行更新,也可能会发生这种情况。如果集群已注册且 PrivateAccess 字段为 nil,则此示例中描述的问题不应发生。