

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

 **Description** 

 `AWSSupport-TroubleshootEKSALBControllerIssues` 自動化 Runbook 可協助診斷常見問題，這些常見問題會阻止 AWS Load Balancer控制器針對 Kubernetes 輸入和服務正確佈建和管理 Application Load Balancer (ALB) 和 Network Load Balancer (NLB)。

 此 Runbook 會執行基本元件的end-to-end驗證，包括 OIDC 身分提供者設定、IRSA 組態、聯網先決條件、輸入/服務組態和資源配額。它也會擷取控制器日誌和相關的 Kubernetes 資源組態，以協助識別組態錯誤或操作問題。

**重要**  
此自動化 Runbook 專為使用 Amazon Elastic Compute Cloud (Amazon EC2) 節點群組的 Amazon EKS 叢集而設計，目前不支援在其中執行的叢集 AWS Fargate。

 **如何運作？** 

 Runbook 會`AWSSupport-TroubleshootEKSALBControllerIssues`執行下列高階步驟：
+ 驗證 Amazon EKS 叢集狀態、存取項目組態和 OIDC 供應商設定。
+ 為 Kubernetes API 通訊建立臨時 Lambda 代理。
+ Checks AWS Load Balancer 控制器部署和服務帳戶組態。
+ 驗證 Pod 身分 Webhook 和 IAM 角色注入。
+ 驗證 Application Load Balancer 和 Network Load Balancer 佈建的子網路組態和標記。
+ 根據目前的用量檢查 Application Load Balancer 和 Network Load Balancer 帳戶配額。
+ 驗證輸入和服務資源註釋。
+ 檢查工作者節點安全群組標記負載平衡器整合。
+ 收集控制器 Pod 日誌以進行診斷。
+ 清除臨時身分驗證資源。
+ 使用問題清單和修復步驟產生診斷報告。

**注意**  
Amazon EKS 叢集必須為執行此自動化的 IAM 實體設定存取項目。叢集的身分驗證模式必須設定為 `API`或 `API_AND_CONFIG_MAP`。如果沒有適當的存取項目組態，自動化會在初始驗證期間終止。
`LambdaRoleArn` 參數是必要的，且必須`AWSLambdaBasicExecutionRole``AWSLambdaVPCAccessExecutionRole`連接 AWS 受管政策，以允許代理函數與 Kubernetes API 通訊。
 AWS Load Balancer控制器必須是版本 `v2.1.1`或更新版本。
自動化包含清除步驟，可移除臨時身分驗證基礎設施資源。即使先前的步驟失敗，此清除步驟仍會執行，確保 AWS 您的帳戶中沒有保留孤立的資源。

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

**文件類型**

 自動化

**擁有者**

Amazon

**平台**

/

**必要的 IAM 許可**

`AutomationAssumeRole` 參數需要下列動作才能成功使用 Runbook。
+ `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 執行 Runbook，另一個用於 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`。
選擇 **Add Policy (新增政策)**。
驗證詳細資訊，然後選擇**建立**。
為 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. 在 AWS Systems Manager 主控台中導覽至 [AWSSupport-TroubleshootEKSALBControllerIssues](https://console.aws.amazon.com/systems-manager/documents/AWSSupport-TroubleshootEKSALBControllerIssues/description)。

1. 選擇 **Execute automation (執行自動化)**。

1. 針對輸入參數，輸入下列項目：
   + **AutomationAssumeRole （選用）：**

     類型：AWS::IAM::Role：：Arn

     描述：（選用） 允許 Systems Manager Automation 代表您執行動作的 AWS Identity and Access Management (IAM) 角色的 Amazon Resource Name (ARN)。如果未指定角色，Systems Manager Automation 會使用啟動此 Runbook 之使用者的許可。

     允許模式：^arn：(？：aws\$1aws-cn\$1aws-us-gov)：iam：：\$1d\$112\$1：role/？【a-zA-Z\$10-9\$1=，.@\$1-\$1/】\$1\$1
   + **EksClusterName （必要）：**

     類型：字串

     描述：（必要） Amazon Elastic Kubernetes Service (Amazon EKS) 叢集的名稱。

     允許模式：^【0-9A-Za-z】【A-Za-z0-9-\$1】\$10，99\$1\$1
   + **ALBControllerDeploymentName （選用）：**

     類型：字串

     描述：（選用） Amazon EKS 叢集中的 AWS Load Balancer控制器部署名稱。這通常是 'aws-load-balancer-controller'，除非您已在安裝期間加以自訂。

     允許模式：^【a-z0-9】(【-.a-z0-9】\$10，251\$1【a-z0-9】)？\$1

     預設：aws-load-balancer-controller
   + **ALBControllerNamespace （選用）：**

     類型：字串

     描述：（選用） 部署 AWS Load Balancer控制器的 Kubernetes 命名空間。根據預設，這是「kube-system」，但如果您已在自訂命名空間中安裝控制器，則可能會有所差異。

     允許模式：^【a-z0-9】(【-a-z0-9】\$10，61\$1【a-z0-9】)？\$1

     預設：kube-system
   + **ServiceAccountName （選用）：**

     類型：字串

     描述：（選用） 與 AWS Load Balancer控制器相關聯的 Kubernetes 服務帳戶名稱。除非在安裝期間自訂，否則這通常是 'aws-load-balancer-controller'。

     允許模式：^【a-z0-9】(【-.a-z0-9】\$10，251\$1【a-z0-9】)？\$1

     預設：aws-load-balancer-controller
   + **ServiceAccountNamespace （選用）：**

     類型：字串

     描述：（選用） AWS Load Balancer控制器的服務帳戶所在的 Kubernetes 命名空間。這通常是「kube-system」，但如果您已使用自訂命名空間，則可能會有所不同。

     允許模式：^【a-z0-9】(【-a-z0-9】\$10，61\$1【a-z0-9】)？\$1

     預設：kube-system
   + **IngressName （選用）：**

     類型：字串

     描述：（選用） 要驗證的傳入資源名稱 (Application Load Balancer)。如果未指定，則會略過傳入驗證。

     允許模式：^\$1\$1^【a-z0-9】【a-z0-9.-】\$10，251\$1【a-z0-9】\$1

     預設："" （空字串）
   + **IngressNamespace （選用）：**

     類型：字串

     描述：（選用） 傳入資源的命名空間。如果指定 `IngressName` ，則為必要項目。

     允許模式：^\$1\$1^【a-z0-9】【a-z0-9-】\$10，61\$1【a-z0-9】\$1

     預設："" （空字串）
   + **ServiceName （選用）：**

     類型：字串

     描述：（選用） 驗證 Network Load Balancer (Network Load Balancer) 註釋的特定服務資源名稱。如果未指定，則會略過服務資源驗證。

     允許模式：^\$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：：\$1d\$112\$1：role/？【a-zA-Z\$10-9\$1=，.@\$1-\$1/】\$1\$1

1. 選擇 **Execute (執行)**。

1. 自動化會啟動。

1. 文件會執行下列步驟：

   1. **ValidateAccessEntryAndOIDCProvider：**

      透過檢查存取項目許可和 OIDC 提供者組態來驗證 Amazon EKS 叢集 IAM 設定。

   1. **SetupK8sAuthenticationClient：**

      執行 SAW 文件 AWSSupport-SetupK8sApiProxyForEKS，以設定 lambda 函數在叢集上執行 Amazon EKS API 呼叫。

   1. **VerifyALBControllerAndIRSASetup：**

      檢查指定的服務帳戶和 Application Load Balancer 控制器是否存在於各自的命名空間中。同時檢查 Application Load Balancer 控制器的服務帳戶角色註釋和信任政策。

   1. **VerifyPodIdentityWebhookAndEnv：**

      檢查 pod-identity-webhook 是否正在執行。同時檢查 IRSA 是否注入 Pod 的 ENV 變數。

   1. **ValidateSubnetRequirements：**

      檢查具有 8 個可用 IP 的兩個 AZ 中至少兩個子網路，公有/私有負載平衡器存在適當的子網路標記。

   1. **CheckLoadBalancerLimitsAndUsage：**

      比較帳戶限制與 Application Load Balancer 和 Network Load Balancer 的數量。

   1. **CheckIngressOrServiceAnnotations：**

      檢查輸入和服務資源中的註釋和規格是否正確，以確保它們已針對 Application Load Balancer 和 Network Load Balancer 使用正確設定。

   1. **CheckWorkerNodeSecurityGroupTags：**

      確認連接到工作者節點的安全群組只有一個必要的叢集標籤。

   1. **CaptureALBControllerLogs：**

      從 Amazon EKS 叢集中執行的 AWS Load Balancer控制器 Pod 擷取最新的診斷日誌。

   1. **CleanupK8sAuthenticationClient：**

      使用 'Cleanup' 操作執行 SAW 文件 'AWSSupport-SetupK8sApiProxyForEKS'，以清除在自動化過程中建立的資源。

   1. **GenerateReport：**

      產生自動化報告。

1. 執行完成後，請檢閱輸出區段以取得執行的詳細結果：

   1. **報告：**

      提供所有已執行檢查的完整摘要，包括 Amazon EKS 叢集的狀態、Application Load Balancer 控制器設定、IRSA 組態、子網路需求、負載平衡器限制、輸入/服務註釋、工作者節點安全群組標籤，以及 Application Load Balancer 控制器日誌。它還包括任何已識別的問題和建議的修復步驟。

**參考**

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)
+ [支援自動化工作流程](https://aws.amazon.com/premiumsupport/technology/saw/)

 AWS Load 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)