如何阻止在 Amazon EKS 中的负载均衡器上恢复安全组规则、侦听器或其他更改?

2 分钟阅读
0

当我尝试对 Amazon Elastic Kubernetes Service(Amazon EKS)的负载均衡器进行更改时,更改会自动恢复。

简短描述

当您使用 AWS 负载均衡器控制器创建负载均衡服务或入口资源时,控制器会设置许多默认参数。这包括您在清单文件中未指定的任何参数,例如运行状况检查路径、默认超时或安全组规则。

然而,您可以使用 AWS API 调用直接更改默认配置。您可以从 Amazon Elastic Compute Cloud(Amazon EC2)控制台、AWS命令行界面(AWS CLI)或其他第三方工具中进行此 API 调用。在这种情况下,控制器会在下一次集群协调期间将这些更改恢复为其原始值。有关详细信息,请参阅 Kubernetes 集群 API 网站上的控制器和协调

以下问题通常是由于 Amazon EKS 中恢复的负载均衡器更改而发生的:

  • 负载均衡器的自定义安全组规则自动恢复为 0.0.0.0/0,否则它们会消失。
  • 负载均衡器会自动删除或添加侦听器规则。
  • 自定义空闲超时值会自动恢复为默认值。
  • 证书会自动恢复为先前的版本。
  • 您无法更新运行状况检查路径,因为 Amazon EKS 已恢复其值。
  • Amazon EKS 通过负载均衡器的属性修改角色。

要解决这些问题,请先确定导致您的负载均衡器进行这些更改的原因。具体而言,就是找到已更改资源的相关 API 调用和进行调用的工具。然后,在清单文件中实施您的更改。

**注意:**在以下解决方法中,“负载均衡器”是指网络负载均衡器或经典负载均衡器等负载均衡服务。或者,负载均衡器可以作为一个入口资源,例如应用程序负载均衡器。

解决方法

要定义负载均衡器的预期状态,您需要在清单文件的注释中指定更改内容。否则,注释会强制将更改恢复为未更改的默认值。

如果您尝试使用 AWS API 调用直接更改这些值,那么控制器会将这视为带外更改。在下一次协调期间,控制器会将更改恢复为其原始值,以与您的 Kubernetes 服务清单配置保持同步。根据控制器恢复的属性,这可能导致您的服务在较长时间内停止。

AWS 负载均衡器控制器使用多条逻辑路径进行协调。以下情况可能导致 aws-load-balancer-controller 容器组重启:

  • 控制面板、Worker 节点或平台的升级
  • 由硬件故障或运行状况问题等潜在问题导致的实例刷新
  • 任何引起控制器容器组更新、删除或修补 API 调用的行为
  • 自动、周期性协调
    **注意:**默认情况下,控制器的协调周期为 1 小时。但是,此功能不适用于 Amazon EKS 2.4.7 及更早版本。

在这些情况下,AWS 负载均衡器控制器会启动协调,而您的负载均衡器会引用最新的清单文件配置。如果您之前通过 API 调用对负载均衡器进行了任何更改,那么这些更改将恢复。

确定更改来源

找到与更新的资源相关的 API 调用。在 AWS CloudTrail 中搜索更改发生的时间范围。有关所有 AWS 负载均衡器 API 调用,请参阅弹性负载均衡(ELB)API 参考。有关 Amazon EC2 API 调用,请参阅 Amazon EC2 API 参考

例如,如果控制器恢复了 SecurityGroup 规则,则您会看到 API RevokeSecurityGroupIngress 被调用了。然后,您可以使用相应的 CloudTrail 事件来识别 API 用户。如果控制器使用 WorkerNode 角色,则您会看到发出 API 调用的节点角色:

....
"type": "AssumedRole",
"arn": "arn:aws:sts::***********:assumed-role/eksctl-mycluster-NodeInstanceRole/i-***********",
"sessionContext": {
    "sessionIssuer": {
        "type": "Role",
        "arn": "arn:aws:iam::***********:role/eksctl-mycluster-nodegr-NodeInstanceRole",
        "userName": "eksctl-mycluster-nodegr-NodeInstanceRole"
    },
    ...
    eventName ": "
    RevokeSecurityGroupIngress ",
    "userAgent": "elbv2.k8s.aws/v2.4.5 aws-sdk-go/1.42.27 (go1.19.3; linux; amd64)",
    "requestParameters": {
        "groupId": "sg-****",
        "ipPermissions": {
            "items": [{
                        "ipProtocol": "tcp",
                        "fromPort": 443,
                        "toPort": 443,
                        "groups": {},
                        "ipRanges": {
                            "items": [{
                                "cidrIp": "0.0.0.0/0"
                            }]
                        }]

如果您为 AWS 负载均衡器控制器使用了专用角色,则可以看到服务账户的 AWS Identity and Access Management(IAM)角色。

避免不必要的更改

不要对负载均衡器的任何参数进行带外更改。这包括来自 Amazon EC2 控制台、AWS CLI 或直接调用 AWS API 的任何工具的更改。

例如,您想要更新安全组规则。使用 .spec.loadBalancerSourceRangesservice.beta.kubernetes.io/load-balancer-source-ranges 注释。您可以使用这些注释来限制负载均衡器的 CIDR IP 地址。有关这些注释的详细信息,请参阅 AWS 负载均衡器控制器 GitHub 网站上的访问控制

仅在清单文件中使用正确的注释来更新超时值、运行状况检查路径、证书 ARN 和其他属性。有关所有支持的服务和入口注释,请参阅 AWS 负载均衡器控制器 GitHub 网站上的服务注释入口注释

AWS 官方
AWS 官方已更新 1 年前