View a markdown version of this page

AWSSupport-TroubleshootEKSALBControllerIssues - AWS Systems Manager 自动化运行手册参考

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

AWSSupport-TroubleshootEKSALBControllerIssues

描述

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

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

重要

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

如何工作?

该运行手册AWSSupport-TroubleshootEKSALBControllerIssues执行以下高级步骤:

  • 验证 Amazon EKS 集群状态、访问条目配置和 OIDC 提供商设置。

  • 为 Kubernetes API 通信创建临时 Lambda 代理。

  • 检查 AWS 负载均衡器控制器部署和服务账户配置。

  • 验证 pod 身份 webhook 和 IAM 角色注入。

  • 验证应用程序负载均衡器和网络负载均衡器配置的子网配置和标记。

  • 根据当前使用情况检查应用程序负载均衡器和网络负载均衡器账户配额。

  • 验证入口和服务资源注释。

  • 检查工作节点安全组标签中是否存在负载均衡器集成。

  • 收集控制器 pod 日志以进行诊断。

  • 清理临时身份验证资源。

  • 生成包含调查结果和补救步骤的诊断报告。

注意
  • Amazon EKS 集群必须为运行此自动化的 IAM 实体配置访问条目。集群的身份验证模式必须设置为API或API_AND_CONFIG_MAP。如果没有正确的访问条目配置,自动化将在初始验证期间终止。

  • 该LambdaRoleArn参数是必填的,必须具有 AWS 托管策略AWSLambdaBasicExecutionRole并AWSLambdaVPCAccessExecutionRole附加该策略,以允许代理功能与 Kubernetes API 通信。

  • AWS 负载均衡器控制器必须为版本v2.1.1或更高版本。

  • 自动化包括一个清理步骤,该清理步骤可删除临时身份验证基础架构资源。即使前面的步骤失败,此清理步骤也会运行,从而确保您的 AWS 账户中没有孤立资源。

运行此自动化(控制台)

文档类型

自动化

所有者

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 通信:

  1. TroubleshootEKSALBController-SSM-Role在您的账户中创建 SSM 自动化角色。验证信任关系是否包含以下策略。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ssm.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. 请附加以下 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" ] } } }] }
  3. 为您的亚马逊 EKS 集群配置访问入口。这是自动化的强制性要求。有关为访问条目配置身份验证模式的步骤,请参阅设置访问条目。

    在 Amazon EKS 控制台中,导航到您的集群并按照以下步骤操作:

    • 在 “访问” 部分下,验证您的身份验证配置是否设置为API或API_AND_CONFIG_MAP。

    • 选择创建访问条目并配置:

      • 对于 IAM 委托人 ARN,选择您创建的 IAM 角色 (TroubleshootEKSALBController-SSM-Role)。

      • 对于类型,选择 Standard。

    • 添加访问策略:

      • 对于 “策略名称”,选择AmazonEKSAdminViewPolicy。

      • 对于访问范围,选择Cluster。

    • 选择添加策略。

    • 验证详细信息并选择创建。

  4. 为 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在 AWS 系统管理器控制台中导航至。

  2. 选择执行自动化。

  3. 要输入参数,请输入以下内容:

    • AutomationAssumeRole (可选):

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

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

      允许的模式:^arn :(?:aws|aws-cn|aws-us-gov): iam::\ d {12}: role/?[a-z A-Z _0-9+=,.@\-_/] +$

    • EksClusterName (必填):

      类型:字符串

      描述:(必填)亚马逊弹性 Kubernetes 服务(亚马逊 EKS)集群的名称。

      允许的模式:^ [0-9A-Za-z] [A-Za-z0-9-_] {0,99} $

    • ALBControllerDeploymentName (可选):

      类型:字符串

      描述:(可选)您的 Amazon EKS 集群中部署的 AWS 负载均衡器控制器的名称。除非您在安装期间对其进行了自定义,否则这通常是 “aws-负载均衡器-控制器”。

      允许的模式:^ [a-z0-9] ([-.a-z0-9] {0,251} [a-z0-9])?$

      默认:aws-负载均衡器控制器

    • ALBControllerNamespace (可选):

      类型:字符串

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

      允许的模式:^ [a-z0-9] ([-a-z0-9] {0,61} [a-z0-9])?$

      默认:kube-syste

    • ServiceAccountName (可选):

      类型:字符串

      描述:(可选)与 AWS 负载均衡器控制器关联的 Kubernetes 服务账户的名称。除非在安装期间进行了自定义,否则这通常是 “aws-负载均衡器-控制器”。

      允许的模式:^ [a-z0-9] ([-.a-z0-9] {0,251} [a-z0-9])?$

      默认:aws-负载均衡器控制器

    • ServiceAccountNamespace (可选):

      类型:字符串

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

      允许的模式:^ [a-z0-9] ([-a-z0-9] {0,61} [a-z0-9])?$

      默认:kube-syste

    • IngressName (可选):

      类型:字符串

      描述:(可选)要验证的 Ingress 资源的名称(应用程序负载均衡器)。如果未指定,则将跳过入口验证。

      允许的图案:^$|^ [a-z0-9] [a-z0-9.-] {0,251} [a-z0-9] $

      默认:“”(空字符串)

    • IngressNamespace (可选):

      类型:字符串

      描述:(可选)入口资源的命名空间。在指定 IngressName 时是必需的。

      允许的图案:^$|^ [a-z0-9] [a-z0-9-] {0,61} [a-z0-9] $

      默认:“”(空字符串)

    • ServiceName (可选):

      类型:字符串

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

      允许的图案:^$|^ [a-z0-9] [a-z0-9.-] {0,251} [a-z0-9] $

      默认:“”(空字符串)

    • ServiceNamespace (可选):

      类型:字符串

      描述:(可选)服务资源的命名空间。在指定 ServiceName 时是必需的。

      允许的图案:^$|^ [a-z0-9] [a-z0-9-] {0,61} [a-z0-9] $

      默认:“”(空字符串)

    • LambdaRoleArn (必填):

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

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

      允许的模式:^arn :(?:aws|aws-cn|aws-us-gov): iam::\ d {12}: role/?[a-z A-Z _0-9+=,.@\-_/] +$

  4. 选择执行。

  5. 自动化启动。

  6. 文档将执行以下步骤:

    1. ValidateAccessEntryAndOIDCProvider:

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

    2. SetupK8sAuthenticationClient:

      执行 SAW 文档 AWSSupport-SetupK8sApiProxyForEKS ,设置 lambda 函数以在集群上运行 Amazon EKS API 调用。

    3. VerifyALBControllerAndIRSASetup:

      检查给定的服务账户和应用程序负载均衡器控制器是否存在于各自的命名空间中。还要检查应用程序负载均衡器控制器的服务账户角色注释和信任政策。

    4. VerifyPodIdentityWebhookAndEnv:

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

    5. ValidateSubnetRequirements:

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

    6. CheckLoadBalancerLimitsAndUsage:

      将账户限制与应用程序负载均衡器和网络负载均衡器的数量进行比较。

    7. CheckIngressOrServiceAnnotations:

      检查 Ingress 和服务资源中的注释和规格是否正确,以确保为应用程序负载均衡器和网络负载均衡器的使用进行了正确配置。

    8. CheckWorkerNodeSecurityGroupTags:

      验证连接到工作节点的恰好一个安全组具有所需的集群标签。

    9. CaptureALBControllerLogs:

      从 Amazon EKS 集群中运行的 AWS 负载均衡器控制器容器中检索最新的诊断日志。

    10. CleanupK8sAuthenticationClient:

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

    11. GenerateReport:

      生成自动化报告。

  7. 执行完成后,请查看 “输出” 部分,了解执行的详细结果:

    1. 报告:

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

参考

Systems Manager Automation

与 AWS 负载均衡器控制器相关的文档