View a markdown version of this page

AWSSupport-TroubleshootEKSDNSFailure - AWS Systems Manager Automation Runbook 參考

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

AWSSupport-TroubleshootEKSDNSFailure

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 叢集的身分驗證模式必須設定為 APIAPI_AND_CONFIG_MAP。此 Runbook 會將 AWS Lambda (Lambda) 函數部署為代理,以進行已驗證的 Kubernetes API 呼叫,並在執行結束時清除所有建立的資源。

執行此自動化 (主控台)

文件類型

 自動化

擁有者

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>會使用 AWSLambdaBasicExecutionRoleAWSLambdaVPCAccessExecutionRole受管政策建立名為 的角色。建議您提供自己的角色。

必要的 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

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

  3. GetVpcDnsSettings - 擷取與 Amazon EKS 叢集相關聯的 Amazon Virtual Private Cloud 的 enableDnsSupportenableDnsHostnames設定。

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

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

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

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

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

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

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

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

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

  13. UpdateProblematicNodeInstanceStanding - 將內部problematicNodeInstanceStanding變數設定為 true

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

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

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

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

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

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

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

  21. UpdateCfnStackDeleted - 將內部cfnStackDeleted變數設定為 true

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

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

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

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

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

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

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

  29. UpdateK8sInfrastructreDeleted - 將內部K8sInfrastructreDeleted變數設定為 true

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

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

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

輸出

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