

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

# `AWSSupport-TroubleshootEKSDNSFailure`
<a name="automation-awssupport-troubleshooteksdnsfailure"></a>

 **Description** 

當應用程式或 Pod 遇到 DNS 解析失敗時， `AWSSupport-TroubleshootEKSDNSFailure` Runbook 可協助疑難排解 Amazon Elastic Kubernetes Service (Amazon EKS) 中 CoreDNS Pod 和組態的問題。Runbook 驗證 VPC DNS 設定、檢查 CoreDNS 部署和 ConfigMap、檢查 Horizontal Pod Autoscaler (HPA) 組態、收集 CoreDNS 日誌，以及在工作者節點上執行 DNS 解析檢查。或者，可以在與有問題的工作者節點相同的子網路中建立探測 Amazon Elastic Compute Cloud 執行個體，以執行 DNS 解析檢查，而無需直接存取節點。

**重要**  
Amazon EKS 叢集的身分驗證模式必須設定為 `API`或 `API_AND_CONFIG_MAP`。此 Runbook 會將 AWS Lambda (Lambda) 函數部署為代理，以進行已驗證的 Kubernetes API 呼叫，並在執行結束時清除所有建立的資源。

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

**文件類型**

 自動化

**擁有者**

Amazon

**平台**

Linux、macOS、 Windows

**參數**
+ AutomationAssumeRole

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

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

  類型：字串

  描述：（必要） 目標 Amazon EKS 叢集的名稱。
+ DnsName

  類型：字串

  預設：https：//amazon.com

  描述：（選用） 應用程式或 Pod 無法解析之網域名稱的 stub 網域尾碼。
+ ProblematicNodeInstanceId

  類型：AWS::EC2::Instance：：Id

  描述：（選用） 執行發生 DNS 解析錯誤之應用程式的工作者節點執行個體 ID。提供時， Runbook 會在相同的子網路中建立探查 Amazon EC2 執行個體，以執行 DNS 解析檢查。如果工作者節點不在公有子網路中，或不允許在工作者節點`bind-utils`上安裝 ，請使用此參數。
+ CoreDnsNamespace

  類型：字串

  預設：kube-system

  描述：（選用） CoreDNS Pod 的 Kubernetes 命名空間。
+ S3BucketName

  類型：AWS::S3::Bucket：：Name

  描述：（選用） 上傳 CoreDNS 故障診斷日誌的 Amazon Simple Storage Service 儲存貯體名稱。
+ LambdaRoleArn

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

  描述：（選用） Lambda 代理函數的 IAM 角色 ARN。如果未提供，則 Runbook `Automation-K8sProxy-Role-<ExecutionId>`會使用 `AWSLambdaBasicExecutionRole`和 `AWSLambdaVPCAccessExecutionRole`受管政策建立名為 的角色。建議您提供自己的角色。

**必要的 IAM 許可**

`AutomationAssumeRole` 參數需要下列動作才能成功使用 Runbook。
+ `eks:DescribeCluster`
+ `ec2:DescribeVpcs`
+ `ec2:DescribeInstances`
+ `ec2:DescribeSubnets`
+ `ec2:DescribeSecurityGroups`
+ `cloudformation:CreateStack`
+ `cloudformation:DescribeStacks`
+ `cloudformation:DeleteStack`
+ `lambda:InvokeFunction`
+ `s3:GetBucketPublicAccessBlock`
+ `s3:GetBucketAcl`
+ `s3:PutObject`
+ `ssm:DescribeInstanceInformation`
+ `ssm:SendCommand`
+ `ssm:GetCommandInvocation`
+ `ssm:StartAutomationExecution`
+ `ssm:GetAutomationExecution`

 **文件步驟** 

1. `AssertIfTargetClusterExists` - 驗證在 中指定的 Amazon EKS 叢集`EksClusterName`是否存在且處於 `ACTIVE` 狀態。如果找不到叢集或未處於作用中狀態，則 Runbook 會跳至 `GenerateReport`。

1. `UpdateEksClusterExists` - 將內部`eksClusterExists`變數設定為 `true`，以用於產生報告。

1. `GetVpcDnsSettings` - 擷取與 Amazon EKS 叢集相關聯的 Amazon Virtual Private Cloud 的 `enableDnsSupport`和 `enableDnsHostnames`設定。

1. `BranchOnVpcDnsSettings` - 檢查是否啟用兩個 VPC DNS 設定。如果其中一個已停用，則 Runbook 會跳至 `GenerateReport`。否則，請繼續執行 `DeployK8sAuthApisResources`。

1. `DeployK8sAuthApisResources` - 執行 `AWSSupport-SetupK8sApiProxyForEKS`以部署 Lambda 函數做為代理，對 Amazon EKS 叢集進行已驗證的 Kubernetes API 呼叫。

1. `RetrieveCoreDNSDeployment` - 擷取 CoreDNS 部署的相關資訊，包括 Pod 準備程度、容器狀態，以及託管 CoreDNS Pod 的節點準備程度。也會擷取 CoreDNS 叢集 IP。

1. `RetrieveAndInspectCoreDNSConfigMap` - 從 Amazon EKS 叢集擷取 CoreDNS ConfigMap，並檢查組態問題，包括 中指定網域的 stub 網域設定`DnsName`。

1. `ValidateHpaConfiguration` - 檢查是否已為指定命名空間中的 CoreDNS 部署設定 Horizontal Pod Autoscaler (HPA)。

1. `CheckS3BucketPublicStatus` - 驗證 中指定的 Amazon S3 儲存貯體`S3BucketName`不允許公有或匿名讀取或寫入存取。

1. `CollectLogToS3` - 收集 CoreDNS Pod 日誌並將其上傳至指定的 Amazon S3 儲存貯體。

1. `BranchOnProblematicNodeInstanceId` - 檢查是否提供 `ProblematicNodeInstanceId` 和 CoreDNS 主機節點是否存在。如果兩個條件都符合，則 會繼續進行`VerifyThatProblematicNodeInstanceBelongsToCluster`。否則， 會分支到 `BranchOnCoreDnsDeployment`。

1. `VerifyThatProblematicNodeInstanceBelongsToCluster` - 確認 中指定的執行個體`ProblematicNodeInstanceId`是 Amazon EKS 叢集中的工作者節點。

1. `UpdateProblematicNodeInstanceStanding` - 將內部`problematicNodeInstanceStanding`變數設定為 `true`。

1. `GetProblematicInstanceDetails` - 擷取有問題的工作者節點的 AMI ID、執行個體類型、子網路 ID 和安全群組 IDs，以便在建立探查 Amazon EC2 執行個體時使用。

1. `CreateProbingInfrastructure` - 在與有問題的工作者節點相同的子網路中，透過 an AWS CloudFormation 堆疊建立執行個體描述檔並探查 Amazon EC2 執行個體。堆疊名為 `AWSSupport-TroubleshootEKSDNSFailure-<ExecutionId>`。

1. `GetProbingInstanceId` - 從 CloudFormation 堆疊輸出擷取探查的 Amazon EC2 執行個體 ID。

1. `WaitForProbingInstanceSSMAgentStateToBeOnline` - 等待探查 Amazon EC2 執行個體上的 Amazon EC2 Systems Manager 代理程式報告`Online`狀態，然後再繼續。 Amazon EC2 

1. `RetrieveCoreDNSPodsIPFromProblematicNode` - 從有問題的工作者節點擷取 CoreDNS Pod IP 地址。

1. `PerformDNSResolutionOnProbing``EC2Instance` - 使用叢集 IP 和 CoreDNS Pod IP 在探查的 Amazon EC2 執行個體上執行 DNS 解析檢查。

1. `DeleteCloudFormationStack` - 刪除建立探查 Amazon EC2 執行個體和執行個體描述檔的 CloudFormation 堆疊。

1. `UpdateCfnStackDeleted` - 將內部`cfnStackDeleted`變數設定為 `true`。

1. `BranchOnCoreDnsDeployment` - 檢查`ProblematicNodeInstanceId`是否未提供 和 CoreDNS 主機節點是否存在。如果兩個條件都符合，則 會繼續進行`PerformDNSResolutionOnCoreDnsWorkerNodes`。否則，請繼續執行 `CleanupK8sAuthenticationInfrastructure`。

1. `BranchOnCoreDnsNodesExistForRunCommandSteps` - 在執行`aws:runCommand`步驟之前檢查 CoreDNS 主機節點是否存在。如果節點不存在 （例如，當 CoreDNS 有零個複本時）， 會跳到 `CleanupK8sAuthenticationInfrastructure`。

1. `PerformDNSResolutionOnCoreDnsWorkerNodes` - 使用叢集 IP 和 CoreDNS Pod IP，直接在 CoreDNS 工作者節點上執行 DNS 解析檢查。

1. `VerifyNameserverMatchAndKubeProxyLogsAndIPTableEntries` - 驗證名稱伺服器 IP 是否符合叢集 IP、檢查 kube-proxy Pod 對 API 伺服器的存取，以及驗證 CoreDNS 工作者節點上的 kube-dns iptables 項目。

1. `VerifyPPSThrottlingOnENIs` - 檢查 CoreDNS 工作者節點上每個彈性網路界面 (ENI) 的 DNS packets-per-second數 (PPS) 限制，以識別潛在的限流。 CoreDNS 

1. `UpdateChecksOnNodes` - 將內部`checksOnNodes`變數設定為 `true`，表示已執行節點層級檢查。

1. `CleanupK8sAuthenticationInfrastructure` - `AWSSupport-SetupK8sApiProxyForEKS`執行 `Cleanup`操作，以移除 Lambda 代理函數和自動化期間建立的相關聯資源。

1. `UpdateK8sInfrastructreDeleted` - 將內部`K8sInfrastructreDeleted`變數設定為 `true`。

1. `CleanUpAllResources` - 執行任何剩餘資源的全面清理，包括 CloudFormation 堆疊和 Lambda 代理函數，以防先前的清理步驟無法成功完成。

1. `CollectOutputFromAllRunCommandSteps` - 從自動化期間執行的所有`aws:runCommand`步驟收集並合併輸出。

1. `GenerateReport` - 將先前所有步驟的結果編譯為涵蓋 VPC DNS 設定、CoreDNS 部署運作狀態、ConfigMap 組態、HPA 組態、日誌收集狀態和 DNS 解析檢查結果的完整評估報告。

 **輸出** 

`GenerateReport.EvalReport` - 執行的所有 DNS 故障診斷檢查的完整報告，包括調查結果和建議的修復步驟。