

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# `AWSSupport-TroubleshootEKSALBControllerIssues`
<a name="automation-awssupport-troubleshoot-eks-alb-controller-issues"></a>

 **描述** 

 `AWSSupport-TroubleshootEKSALBControllerIssues`自动化运行手册可帮助诊断导致 AWS 负载均衡器控制器无法正确配置和管理适用于 Kubernetes 入口和服务的应用程序负载均衡器 (ALB) 和网络负载均衡器 (NLB) 的常见问题。

 本运行手册对基本组件进行 end-to-end验证，包括 OIDC 身份提供商设置、IRSA 配置、网络先决条件、 ingress/service 配置和资源配额。它还会捕获控制器日志和相关的 Kubernetes 资源配置，以帮助识别错误配置或操作问题。

**重要**  
本自动化运行手册专为使用亚马逊弹性计算云 (Amazon EC2) 节点组的亚马逊 EKS 集群而设计，目前不支持在上面运行的集群。 AWS Fargate

 **如何工作？** 

 运行手册`AWSSupport-TroubleshootEKSALBControllerIssues`执行以下高级步骤：
+ 验证 Amazon EKS 集群状态、访问条目配置和 OIDC 提供商设置。
+ 为 Kubernetes API 通信创建临时的 Lambda 代理。
+ 检查 AWS Load Balancer Controller 部署和服务帐户配置。
+ 验证 pod 身份 webhook 和 IAM 角色注入。
+ 验证 Application Load Balancer 和 Network Load Balancer 配置的子网配置和标记。
+ 根据当前使用情况检查应用程序负载均衡器和网络负载均衡器账户配额。
+ 验证入口和服务资源注释。
+ 检查工作节点安全组标记以实现负载均衡器集成。
+ 收集控制器 pod 日志以进行诊断。
+ 清理临时身份验证资源。
+ 生成包含发现结果和补救步骤的诊断报告。

**注意**  
Amazon EKS 集群必须为运行此自动化的 IAM 实体配置访问入口。集群的身份验证模式必须设置为`API`或`API_AND_CONFIG_MAP`。如果没有正确的访问权限条目配置，自动化将在初始验证期间终止。
该`LambdaRoleArn`参数是必需的，必须具有 AWS 托管策略`AWSLambdaBasicExecutionRole`并`AWSLambdaVPCAccessExecutionRole`附上该参数，以允许代理函数与 Kubernetes API 通信。
Loa AWS d Balancer 控制器必须是版本`v2.1.1`或更高版本。
自动化包括一个清理步骤，用于删除临时身份验证基础架构资源。即使之前的步骤失败，此清理步骤也会运行，从而确保您的 AWS 账户中没有孤立的资源。

 [运行此自动化（控制台）](https://console.aws.amazon.com/systems-manager/automation/execute/AWSSupport-TroubleshootEKSALBControllerIssues) 

**文档类型**

自动化

**所有者**

Amazon

**平台**

/

**所需的 IAM 权限**

`AutomationAssumeRole` 参数需要执行以下操作才能成功使用运行手册。
+ `cloudformation:CreateStack`
+ `cloudformation:DeleteStack`
+ `cloudformation:DescribeStacks`
+ `cloudformation:UpdateStack`
+ `ec2:CreateNetworkInterface`
+ `ec2:DeleteNetworkInterface`
+ `ec2:DescribeInstances`
+ `ec2:DescribeNetworkInterfaces`
+ `ec2:DescribeRouteTables`
+ `ec2:DescribeSecurityGroups`
+ `ec2:DescribeSubnets`
+ `ec2:DescribeVpcs`
+ `eks:DescribeCluster`
+ `eks:ListAssociatedAccessPolicies`
+ `elasticloadbalancing:DescribeAccountLimits`
+ `elasticloadbalancing:DescribeLoadBalancers`
+ `iam:GetRole`
+ `iam:ListOpenIDConnectProviders`
+ `iam:PassRole`
+ `lambda:CreateFunction`
+ `lambda:DeleteFunction`
+ `lambda:GetFunction`
+ `lambda:InvokeFunction`
+ `lambda:ListTags`
+ `lambda:TagResource`
+ `lambda:UntagResource`
+ `lambda:UpdateFunctionCode`
+ `logs:CreateLogGroup`
+ `logs:CreateLogStream`
+ `logs:DescribeLogGroups`
+ `logs:DescribeLogStreams`
+ `logs:ListTagsForResource`
+ `logs:PutLogEvents`
+ `logs:PutRetentionPolicy`
+ `logs:TagResource`
+ `logs:UntagResource`
+ `ssm:DescribeAutomationExecutions`
+ `ssm:GetAutomationExecution`
+ `ssm:StartAutomationExecution`
+ `tag:GetResources`
+ `tag:TagResources`

 **说明** 

按照以下步骤配置和运行自动化：

**注意**  
在运行自动化之前，请按照以下步骤配置所需的 IAM 角色：一个角色让 Systems Manager Automation 执行运行手册，另一个角色让 Lambda 与 Kubernetes API 通信：  
在您的账户`TroubleshootEKSALBController-SSM-Role`中创建 SSM 自动化角色。验证信任关系是否包含以下策略。  

   ```
   {
               "Version": "2012-10-17",		 	 	 
               "Statement": [
                   {
                       "Sid": "",
                       "Effect": "Allow",
                       "Principal": {
                           "Service": "ssm.amazonaws.com"
                       },
                       "Action": "sts:AssumeRole"
                   }
               ]
           }
   ```
附上以下 IAM 策略以授予所需权限：  

   ```
   {
               "Version": "2012-10-17",		 	 	 
               "Statement": [{
                   "Sid": "TroubleshootEKSALBControllerIssuesActions",
                   "Effect": "Allow",
                   "Action": [
                       "eks:DescribeCluster",
                       "eks:ListAssociatedAccessPolicies",
                       "iam:GetRole",
                       "iam:ListOpenIDConnectProviders",
                       "ssm:StartAutomationExecution",
                       "ssm:GetAutomationExecution",
                       "ssm:DescribeAutomationExecutions",
                       "ec2:DescribeSubnets",
                       "ec2:DescribeRouteTables",
                       "elasticloadbalancing:DescribeLoadBalancers",
                       "elasticloadbalancing:DescribeAccountLimits",
                       "ec2:DescribeInstances",
                       "ec2:DescribeNetworkInterfaces",
                       "ec2:DescribeSecurityGroups"
                   ],
                   "Resource": "*"
               },
               {
                   "Sid": "SetupK8sApiProxyForEKSActions",
                   "Effect": "Allow",
                   "Action": [
                       "cloudformation:CreateStack",
                       "cloudformation:DeleteStack",
                       "cloudformation:DescribeStacks",
                       "cloudformation:UpdateStack",
                       "ec2:CreateNetworkInterface",
                       "ec2:DeleteNetworkInterface",
                       "ec2:DescribeNetworkInterfaces",
                       "ec2:DescribeRouteTables",
                       "ec2:DescribeSecurityGroups",
                       "ec2:DescribeSubnets",
                       "ec2:DescribeVpcs",
                       "eks:DescribeCluster",
                       "iam:GetRole",
                       "lambda:CreateFunction",
                       "lambda:DeleteFunction",
                       "lambda:GetFunction",
                       "lambda:InvokeFunction",
                       "lambda:ListTags",
                       "lambda:TagResource",
                       "lambda:UntagResource",
                       "lambda:UpdateFunctionCode",
                       "logs:CreateLogGroup",
                       "logs:CreateLogStream",
                       "logs:DescribeLogGroups",
                       "logs:DescribeLogStreams",
                       "logs:ListTagsForResource",
                       "logs:PutLogEvents",
                       "logs:PutRetentionPolicy",
                       "logs:TagResource",
                       "logs:UntagResource",
                       "ssm:DescribeAutomationExecutions",
                       "tag:GetResources",
                       "tag:TagResources"
                   ],
                   "Resource": "*"
               },
               {
                   "Sid": "PassRoleToAutomation",
                   "Effect": "Allow",
                   "Action": "iam:PassRole",
                   "Resource": "*",
                   "Condition": {
                       "StringLikeIfExists": {
                           "iam:PassedToService": [
                               "lambda.amazonaws.com",
                               "ssm.amazonaws.com"
                           ]
                       }
                   }
               }]
           }
   ```
为您的 Amazon EKS 集群配置访问入口。这是自动化的强制性要求。有关为访问条目配置身份验证模式的步骤，请参阅[设置访问条目](https://docs.aws.amazon.com//eks/latest/userguide/setting-up-access-entries.html)。  
在 Amazon EKS 控制台中，导航到您的集群并按照以下步骤操作：  
在 “**访问权限**” 部分下，验证您的身份验证配置是否设置为`API`或`API_AND_CONFIG_MAP`。
选择**创建访问条目**并配置：  
对于 *IAM 委托人 ARN*，请选择您创建的 IAM 角色 () `TroubleshootEKSALBController-SSM-Role`。
对于*类型*，选择 `Standard`。
添加访问策略：  
在 “*策略名称*” 中，选择`AmazonEKSAdminViewPolicy`。
在 “*访问范围*” 中，选择`Cluster`。
选择**添加策略**。
验证详细信息并选择 “**创建**”。
为 Lambda 函数创建一个 IAM 角色（在输入参数`LambdaRoleArn`中引用）：  
使用以下信任策略创建新的 IAM 角色：  

     ```
     {
                 "Version": "2012-10-17",		 	 	 
                 "Statement": [
                     {
                         "Effect": "Allow",
                         "Principal": {
                             "Service": "lambda.amazonaws.com"
                         },
                         "Action": "sts:AssumeRole"
                     }
                 ]
             }
     ```
将以下 AWS 托管策略附加到此角色：  
`AWSLambdaBasicExecutionRole`
`AWSLambdaVPCAccessExecutionRole`
请记下此角色的 ARN，因为`LambdaRoleArn`输入参数需要使用它。

1. [AWSSupport-TroubleshootEKSALBControllerIssues](https://console.aws.amazon.com/systems-manager/documents/AWSSupport-TroubleshootEKSALBControllerIssues/description)在 S AWS ystems Manager 控制台中导航至。

1. 选择**执行自动化**。

1. 要输入参数，请输入以下内容：
   + **AutomationAssumeRole （可选）：**

     类型:: AWS::IAM::Role: Arn

     描述：（可选）允许 Systems Manager Automation 代表您执行操作的 AWS Identity and Access Management (IAM) 角色的亚马逊资源名称 (ARN)。如果未指定角色，Systems Manager Automation 将使用启动此运行手册的用户的权限。

     允许的模式：^arn :(？ :aws\$1aws-cn\$1aws-us-gov): iam::\$1 d \$112\$1: role/？ [a-za-z\$10-9\$1=，.@\$1-\$1/] \$1\$1
   + **EksClusterName （必填）：**

     类型：字符串

     描述：（必填）亚马逊 Elastic Kubernetes Service（亚马逊 EKS）集群的名称。

     允许的模式：^ [0-9a-za-z] [a-za-z0-9-\$1] \$10,99\$1 \$1
   + **ALBControllerDeploymentName （可选）：**

     类型：字符串

     描述：（可选）您的 Amazon EKS 集群中部署的 Loa AWS d Balancer 控制器的名称。除非您在安装过程中对其进行了自定义，否则通常aws-load-balancer-controller为 “”。

     允许的模式：^ [a-z0-9] ([-.a-z0-9] \$10,251\$1 [a-z0-9])？ \$1

     默认： aws-load-balancer-controller
   + **ALBController命名空间（可选）：**

     类型：字符串

     描述：（可选）部署 AWS 负载均衡器控制器的 Kubernetes 命名空间。默认情况下，这是 “kube-system”，但是如果您将控制器安装在自定义命名空间中，则可能会有所不同。

     允许的模式：^ [a-z0-9] ([-a-z0-9] \$10,61\$1 [a-z0-9])？ \$1

     默认：kube-system
   + **ServiceAccountName （可选）：**

     类型：字符串

     描述：（可选）与 AWS 负载均衡器控制器关联的 Kubernetes 服务账户的名称。除非在安装过程中进行了自定义，否则通常aws-load-balancer-controller为 “”。

     允许的模式：^ [a-z0-9] ([-.a-z0-9] \$10,251\$1 [a-z0-9])？ \$1

     默认： aws-load-balancer-controller
   + **ServiceAccountNamespace （可选）：**

     类型：字符串

     描述：（可选） AWS 负载均衡器控制器的服务帐户所在的 Kubernetes 命名空间。这通常是 “kube-system”，但如果您使用了自定义命名空间，则可能会有所不同。

     允许的模式：^ [a-z0-9] ([-a-z0-9] \$10,61\$1 [a-z0-9])？ \$1

     默认：kube-system
   + **IngressName （可选）：**

     类型：字符串

     描述：（可选）要验证的入口资源的名称（Application Load Balancer）。如果未指定，则将跳过 Ingress 验证。

     允许的模式：^\$1\$1^ [a-z0-9] [a-z0-9 .-] \$10,251\$1 [a-z0-9] \$1

     默认：“”（空字符串）
   + **IngressNamespace （可选）：**

     类型：字符串

     描述：（可选）Ingress 资源的命名空间。在指定 `IngressName` 时是必需的。

     允许的模式：^\$1\$1^ [a-z0-9] [a-z0-9-] \$10,61\$1 [a-z0-9] \$1

     默认：“”（空字符串）
   + **ServiceName （可选）：**

     类型：字符串

     描述：（可选）用于验证网络负载均衡器（网络负载均衡器）注释的特定服务资源的名称。如果未指定，则将跳过服务资源验证。

     允许的模式：^\$1\$1^ [a-z0-9] [a-z0-9 .-] \$10,251\$1 [a-z0-9] \$1

     默认：“”（空字符串）
   + **ServiceNamespace （可选）：**

     类型：字符串

     描述：（可选）服务资源的命名空间。在指定 `ServiceName` 时是必需的。

     允许的模式：^\$1\$1^ [a-z0-9] [a-z0-9-] \$10,61\$1 [a-z0-9] \$1

     默认：“”（空字符串）
   + **LambdaRoleArn （必填）：**

     类型:: AWS::IAM::Role: Arn

     描述：（必填）允许 ( AWS Lambda Lambda) 函数访问所需 AWS 服务和资源的 IAM 角色的 ARN。将 AWS 托管策略：`AWSLambdaBasicExecutionRole`和`AWSLambdaVPCAccessExecutionRole`与您的 lambda 函数执行 IAM 角色相关联。

     允许的模式：^arn :(？ :aws\$1aws-cn\$1aws-us-gov): iam::\$1 d \$112\$1: role/？ [a-za-z\$10-9\$1=，.@\$1-\$1/] \$1\$1

1. 选择**执行**。

1. 自动化启动。

1. 文档将执行以下步骤：

   1. **ValidateAccessEntryAndOIDCProvider:**

      通过检查访问权限和 OIDC 提供商配置来验证 Amazon EKS 集群 IAM 设置。

   1. **setupk8sAuthenticationClient：**

      执行 SAW Document AWSSupport-SetupK 8 sApiProxy forek 来设置 lambda 函数以在集群上运行 Amazon EKS API 调用。

   1. **验证ALBController并且IRSASetup：**

      检查给定的服务帐户和 Application Load Balancer 控制器是否存在于其各自的命名空间中。还要检查 Application Load Balancer 控制器的服务账户角色注释和信任策略。

   1. **VerifyPodIdentityWebhookAndEnv:**

      检查是否 pod-identity-webhook正在运行。还会检查 IRSA 是否被注入到 pod 的 ENV 变量中。

   1. **ValidateSubnetRequirements:**

      检查两个可用区中至少有两个子网，有 8 个可用 IP， public/private 负载均衡器有正确的子网标记。

   1. **CheckLoadBalancerLimitsAndUsage:**

      将账户限制与 Application Load Balancer 和 Network Load Balancer 的数量进行比较。

   1. **CheckIngressOrServiceAnnotations:**

      检查 Ingress 和 Service 资源中的注释和规格是否正确，以确保它们针对应用程序负载均衡器和网络负载均衡器的使用进行了正确配置。

   1. **CheckWorkerNodeSecurityGroupTags:**

      验证连接到工作节点的安全组是否具有所需的集群标签。

   1. **捕获ALBController日志：**

      从 Amazon EKS 集群中运行的 Load Balancer Controller 容器中检索最新的诊断日志。 AWS 

   1. **CleanupK8sAuthenticationClient：**

      使用 “清理” 操作执行 SAW 文档 “AWSSupport-SetupK8 sApiProxy Foreks”，以清理作为自动化一部分创建的资源。

   1. **GenerateReport:**

      生成自动化报告。

1. 执行完成后，请查看 “输出” 部分，了解执行的详细结果：

   1. **报告：**

      提供所有已执行检查的全面摘要，包括 Amazon EKS 集群的状态、Application Load Balancer 控制器设置、IRSA 配置、子网要求、负载均衡器限制、 ingress/service 注释、工作节点安全组标签和应用程序负载均衡器控制器日志。它还包括所有已发现的问题和建议的补救步骤。

**参考**

Systems Manager Automation
+ [运行此自动化（控制台）](https://console.aws.amazon.com/systems-manager/documents/AWSSupport-TroubleshootEKSALBControllerIssues/description)
+ [运行自动化](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-working-executing.html)
+ [设置自动化](https://docs.aws.amazon.com//systems-manager/latest/userguide/automation-setup.html)
+ [Support 自动化工作流程](https://aws.amazon.com/premiumsupport/technology/saw/)

与 Loa AWS d Balancer 控制器相关的文档
+ [AWS Load Balancer 控制器](https://docs.aws.amazon.com//eks/latest/userguide/aws-load-balancer-controller.html)
+ [设置访问条目](https://docs.aws.amazon.com//eks/latest/userguide/setting-up-access-entries.html)