本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
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 叢集的身分驗證模式必須設定為 API或 API_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>會使用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
文件步驟
-
AssertIfTargetClusterExists- 驗證在 中指定的 Amazon EKS 叢集EksClusterName是否存在且處於ACTIVE狀態。如果找不到叢集或未處於作用中狀態,則 Runbook 會跳至GenerateReport。 -
UpdateEksClusterExists- 將內部eksClusterExists變數設定為true,以用於產生報告。 -
GetVpcDnsSettings- 擷取與 Amazon EKS 叢集相關聯的 Amazon Virtual Private Cloud 的enableDnsSupport和enableDnsHostnames設定。 -
BranchOnVpcDnsSettings- 檢查是否啟用兩個 VPC DNS 設定。如果其中一個已停用,則 Runbook 會跳至GenerateReport。否則,請繼續執行DeployK8sAuthApisResources。 -
DeployK8sAuthApisResources- 執行AWSSupport-SetupK8sApiProxyForEKS以部署 Lambda 函數做為代理,對 Amazon EKS 叢集進行已驗證的 Kubernetes API 呼叫。 -
RetrieveCoreDNSDeployment- 擷取 CoreDNS 部署的相關資訊,包括 Pod 準備程度、容器狀態,以及託管 CoreDNS Pod 的節點準備程度。也會擷取 CoreDNS 叢集 IP。 -
RetrieveAndInspectCoreDNSConfigMap- 從 Amazon EKS 叢集擷取 CoreDNS ConfigMap,並檢查組態問題,包括 中指定網域的 stub 網域設定DnsName。 -
ValidateHpaConfiguration- 檢查是否已為指定命名空間中的 CoreDNS 部署設定 Horizontal Pod Autoscaler (HPA)。 -
CheckS3BucketPublicStatus- 驗證 中指定的 Amazon S3 儲存貯體S3BucketName不允許公有或匿名讀取或寫入存取。 -
CollectLogToS3- 收集 CoreDNS Pod 日誌並將其上傳至指定的 Amazon S3 儲存貯體。 -
BranchOnProblematicNodeInstanceId- 檢查是否提供ProblematicNodeInstanceId和 CoreDNS 主機節點是否存在。如果兩個條件都符合,則 會繼續進行VerifyThatProblematicNodeInstanceBelongsToCluster。否則, 會分支到BranchOnCoreDnsDeployment。 -
VerifyThatProblematicNodeInstanceBelongsToCluster- 確認 中指定的執行個體ProblematicNodeInstanceId是 Amazon EKS 叢集中的工作者節點。 -
UpdateProblematicNodeInstanceStanding- 將內部problematicNodeInstanceStanding變數設定為true。 -
GetProblematicInstanceDetails- 擷取有問題的工作者節點的 AMI ID、執行個體類型、子網路 ID 和安全群組 IDs,以便在建立探查 Amazon EC2 執行個體時使用。 -
CreateProbingInfrastructure- 在與有問題的工作者節點相同的子網路中,透過 an AWS CloudFormation 堆疊建立執行個體描述檔並探查 Amazon EC2 執行個體。堆疊名為AWSSupport-TroubleshootEKSDNSFailure-<ExecutionId>。 -
GetProbingInstanceId- 從 CloudFormation 堆疊輸出擷取探查的 Amazon EC2 執行個體 ID。 -
WaitForProbingInstanceSSMAgentStateToBeOnline- 等待探查 Amazon EC2 執行個體上的 Amazon EC2 Systems Manager 代理程式報告Online狀態,然後再繼續。 Amazon EC2 -
RetrieveCoreDNSPodsIPFromProblematicNode- 從有問題的工作者節點擷取 CoreDNS Pod IP 地址。 -
PerformDNSResolutionOnProbingEC2Instance- 使用叢集 IP 和 CoreDNS Pod IP 在探查的 Amazon EC2 執行個體上執行 DNS 解析檢查。 -
DeleteCloudFormationStack- 刪除建立探查 Amazon EC2 執行個體和執行個體描述檔的 CloudFormation 堆疊。 -
UpdateCfnStackDeleted- 將內部cfnStackDeleted變數設定為true。 -
BranchOnCoreDnsDeployment- 檢查ProblematicNodeInstanceId是否未提供 和 CoreDNS 主機節點是否存在。如果兩個條件都符合,則 會繼續進行PerformDNSResolutionOnCoreDnsWorkerNodes。否則,請繼續執行CleanupK8sAuthenticationInfrastructure。 -
BranchOnCoreDnsNodesExistForRunCommandSteps- 在執行aws:runCommand步驟之前檢查 CoreDNS 主機節點是否存在。如果節點不存在 (例如,當 CoreDNS 有零個複本時), 會跳到CleanupK8sAuthenticationInfrastructure。 -
PerformDNSResolutionOnCoreDnsWorkerNodes- 使用叢集 IP 和 CoreDNS Pod IP,直接在 CoreDNS 工作者節點上執行 DNS 解析檢查。 -
VerifyNameserverMatchAndKubeProxyLogsAndIPTableEntries- 驗證名稱伺服器 IP 是否符合叢集 IP、檢查 kube-proxy Pod 對 API 伺服器的存取,以及驗證 CoreDNS 工作者節點上的 kube-dns iptables 項目。 -
VerifyPPSThrottlingOnENIs- 檢查 CoreDNS 工作者節點上每個彈性網路界面 (ENI) 的 DNS packets-per-second數 (PPS) 限制,以識別潛在的限流。 CoreDNS -
UpdateChecksOnNodes- 將內部checksOnNodes變數設定為true,表示已執行節點層級檢查。 -
CleanupK8sAuthenticationInfrastructure-AWSSupport-SetupK8sApiProxyForEKS執行Cleanup操作,以移除 Lambda 代理函數和自動化期間建立的相關聯資源。 -
UpdateK8sInfrastructreDeleted- 將內部K8sInfrastructreDeleted變數設定為true。 -
CleanUpAllResources- 執行任何剩餘資源的全面清理,包括 CloudFormation 堆疊和 Lambda 代理函數,以防先前的清理步驟無法成功完成。 -
CollectOutputFromAllRunCommandSteps- 從自動化期間執行的所有aws:runCommand步驟收集並合併輸出。 -
GenerateReport- 將先前所有步驟的結果編譯為涵蓋 VPC DNS 設定、CoreDNS 部署運作狀態、ConfigMap 組態、HPA 組態、日誌收集狀態和 DNS 解析檢查結果的完整評估報告。
輸出
GenerateReport.EvalReport - 執行的所有 DNS 故障診斷檢查的完整報告,包括調查結果和建議的修復步驟。