

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

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

 **描述** 

该`AWSSupport-TroubleshootEKSDNSFailure`运行手册可帮助解决应用程序或容器遇到 DNS 解析失败时，Amazon Elastic Kubernetes Service (Amazon EKS) 中的 CoreDNS 容器和配置问题。该运行手册验证 VPC DNS 设置，检查 CoreDNS 部署，检查水平容器自动扩缩器 (HPA) 配置 ConfigMap，收集 CoreDNS 日志，并在工作节点上执行 DNS 解析检查。或者，可以在问题工作节点所在的子网中创建探测型 Amazon Elastic Compute Cloud 实例，无需直接访问该节点即可执行 DNS 解析检查。

**重要**  
Amazon EKS 集群的身份验证模式必须设置为`API`或`API_AND_CONFIG_MAP`。本运行手册部署了一个 ( 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 代表您执行操作 AWS Identity and Access Management (IAM) 角色的 Amazon 资源名称（ARN）。如果未指定角色，Systems Manager Automation 将使用启动此运行手册的用户的权限。
+ EksClusterName

  类型：字符串

  描述：（必填）目标 Amazon EKS 集群的名称。
+ DnsName

  类型：字符串

  默认：亚马逊

  描述：（可选）应用程序或 Pod 无法解析的域名的存根域后缀。
+ ProblematicNodeInstanceId

  类型:: AWS::EC2::Instance: ID

  描述：（可选）运行遇到 DNS 解析错误的应用程序的工作节点的实例 ID。如果提供，运行手册将在同一子网中创建一个探测型 Amazon EC2 实例，以执行 DNS 解析检查。如果工作节点不在公有子网中，或者不允许在工作节点`bind-utils`上安装，则使用此参数。
+ CoreDnsNamespace

  类型：字符串

  默认：kube-system

  描述：（可选）CoreDNS 容器的 Kubernetes 命名空间。
+ S3 BucketName

  类型:: AWS::S3::Bucket: 姓名

  描述：（可选）上传 CoreDNS 疑难解答日志的亚马逊简单存储服务存储桶的名称。
+ LambdaRoleArn

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

  描述：（可选）Lambda 代理函数的 IAM 角色的 ARN。如果未提供，则运行手册将创建一个名为`AWSLambdaBasicExecutionRole`和`AWSLambdaVPCAccessExecutionRole`托管策略`Automation-K8sProxy-Role-<ExecutionId>`的角色。建议您提供自己的角色。

**所需的 IAM 权限**

`AutomationAssumeRole` 参数需要执行以下操作才能成功使用运行手册。
+ `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`状态。如果未找到集群或集群未处于活动状态，则运行手册将跳至。`GenerateReport`

1. `UpdateEksClusterExists`-将内部`eksClusterExists`变量设置为`true`用于报告生成。

1. `GetVpcDnsSettings`-检索与亚马逊 EKS 集群关联的 Amazon Virtual Private Cloud 的`enableDnsSupport`和`enableDnsHostnames`设置。

1. `BranchOnVpcDnsSettings`-检查两个 VPC DNS 设置是否都已启用。如果其中一个被禁用，则运行手册将跳至。`GenerateReport`否则，请继续`DeployK8sAuthApisResources`。

1. `DeployK8sAuthApisResources`-执行`AWSSupport-SetupK8sApiProxyForEKS`以部署 Lambda 函数作为代理，用于对 Amazon EKS 集群进行经过身份验证的 Kubernetes API 调用。

1. `RetrieveCoreDNSDeployment`-检索有关 CoreDNS 部署的信息，包括容器就绪情况、容器状态以及托管 CoreDNS 容器的节点的准备情况。还会检索 CoreDNS 集群 IP。

1. `RetrieveAndInspectCoreDNSConfigMap`-从 Amazon EKS 集群检索 ConfigMap CoreDNS 并检查配置问题，包括中指定域的存根域设置。`DnsName`

1. `ValidateHpaConfiguration`-检查是否为指定命名空间中的 CoreDNS 部署配置了水平容器自动扩缩器 (HPA)。

1. `CheckS3BucketPublicStatus`-验证中指定的 Amazon S3 存储桶`S3BucketName`是否不允许公开或匿名读取或写入权限。

1. `CollectLogToS3`-收集 CoreDNS 容器日志并将其上传到指定的 Amazon S3 存储桶。

1. `BranchOnProblematicNodeInstanceId`-检查`ProblematicNodeInstanceId`是否已提供以及 CoreDNS 主机节点是否存在。如果两个条件都满足，则继续执行`VerifyThatProblematicNodeInstanceBelongsToCluster`。否则，分支到`BranchOnCoreDnsDeployment`。

1. `VerifyThatProblematicNodeInstanceBelongsToCluster`-确认中指定的实例`ProblematicNodeInstanceId`是 Amazon EKS 集群中的工作节点。

1. `UpdateProblematicNodeInstanceStanding`-将内部`problematicNodeInstanceStanding`变量设置为`true`。

1. `GetProblematicInstanceDetails`-检索有问题的工作节点的 AMI ID、实例类型、子网 ID 和安全组 ID，以便在创建探测型 Amazon EC2 实例时使用。

1. `CreateProbingInfrastructure`-创建实例配置文件并通过与有问题的工作节点位于同一子网中的 AWS CloudFormation 堆栈探测 Amazon EC2 实例。堆栈已命名`AWSSupport-TroubleshootEKSDNSFailure-<ExecutionId>`。

1. `GetProbingInstanceId`-从 CloudFormation 堆栈输出中检索正在探测的 Amazon EC2 实例 ID。

1. `WaitForProbingInstanceSSMAgentStateToBeOnline`-等待正在探测的亚马逊 EC2 实例上的 Amazon EC2 Systems Manager 代理报告`Online`状态，然后再继续。

1. `RetrieveCoreDNSPodsIPFromProblematicNode`-检索 CoreDNS 容器的 IP 地址，如有问题的工作节点所示。

1. `PerformDNSResolutionOnProbing``EC2Instance`-使用集群 IP 和 CoreDNS 容器 IP 对正在探测的 Amazon EC2 实例运行 DNS 解析检查。

1. `DeleteCloudFormationStack`-删除创建探测 Amazon EC2 实例和实例配置文件的 CloudFormation 堆栈。

1. `UpdateCfnStackDeleted`-将内部`cfnStackDeleted`变量设置为`true`。

1. `BranchOnCoreDnsDeployment`-检查是否`ProblematicNodeInstanceId`未提供以及 CoreDNS 主机节点是否存在。如果两个条件都满足，则继续执行`PerformDNSResolutionOnCoreDnsWorkerNodes`。否则，请继续`CleanupK8sAuthenticationInfrastructure`。

1. `BranchOnCoreDnsNodesExistForRunCommandSteps`-在运行步骤之前检查 CoreDNS 主机节点是否存在。`aws:runCommand`如果不存在任何节点（例如，当 CoreDNS 的副本为零时），则跳到。`CleanupK8sAuthenticationInfrastructure`

1. `PerformDNSResolutionOnCoreDnsWorkerNodes`-使用集群 IP 和 CoreDNS 容器 IP 直接在 CoreDNS 工作节点上运行 DNS 解析检查。

1. `VerifyNameserverMatchAndKubeProxyLogsAndIPTableEntries`-验证域名服务器 IP 是否与集群 IP 匹配，检查 kube-proxy pod 对 API 服务器的访问权限，并验证 CoreDNS 工作节点上的 kube-dns iptables 条目。

1. `VerifyPPSThrottlingOnENIs`-检查 CoreDNS packets-per-second 工作节点上每个弹性网络接口 (ENI) 的 DNS (PPS) 限制，以确定潜在的限制。

1. `UpdateChecksOnNodes`-将内部`checksOnNodes`变量设置`true`为以表示已执行节点级检查。

1. `CleanupK8sAuthenticationInfrastructure`-执行删除`AWSSupport-SetupK8sApiProxyForEKS`自动化期间创建的 Lambda 代理函数和关联资源的`Cleanup`操作。

1. `UpdateK8sInfrastructreDeleted`-将内部`K8sInfrastructreDeleted`变量设置为`true`。

1. `CleanUpAllResources`-如果之前的清理步骤未成功完成，则对所有剩余资源执行全面清理，包括 CloudFormation 堆栈和 Lambda 代理函数。

1. `CollectOutputFromAllRunCommandSteps`-收集并合并自动化期间执行的所有`aws:runCommand`步骤的输出。

1. `GenerateReport`-将前面所有步骤的结果汇编成一份全面的评估报告，涵盖VPC DNS设置、CoreDNS部署运行状况 ConfigMap 、配置、HPA配置、日志收集状态和DNS解析检查结果。

 **输出** 

`GenerateReport.EvalReport`-关于所执行的所有 DNS 故障排除检查的全面报告，包括发现的结果和建议的补救措施。