私有子网中 运行 时 AWS EKS 上的 DNS 问题

DNS problem on AWS EKS when running in private subnets

我在 VPC 中设置了 EKS 集群。工作节点在私有子网中启动。我可以成功部署 pods 和服务。

但是,我无法从 pods 中执行 DNS 解析。 (它在容器外的工作节点上运行良好。)

使用 https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/ 进行故障排除会导致 nslookup 出现以下结果(大约一分钟后超时):

服务器:172.20.0.10 地址1:172.20.0.10

nslookup: 无法解析 'kubernetes.default'

当我在全 public VPC 中启动集群时,我没有遇到这个问题。我是否缺少从私有子网内进行 DNS 解析的任何必要步骤?

非常感谢, 丹尼尔

我觉得我必须给出一个正确的答案,因为遇到这个问题是我连续 10 个小时调试的答案。正如@Daniel 在他的评论中所说,我发现的问题是我的 ACL 阻止了 UDP 端口 53 上的出站流量,这显然是 kubernetes 用来解析 DNS 记录的。

这个过程让我特别困惑,因为我的一个 pods 实际上一直在工作,因为(我想?)它恰好与 kubernetes DNS 解析器位于同一区域。

所以我想我已经挣扎了几个小时,忘记了时间,还有这个问题。

由于我使用的是默认 VPC,但工作节点位于私有子网内,因此无法正常工作。

我查看了 amazon-vpc-cni-k8s 并找到了解决方案。

我们必须 sff aws-node daemonset 的环境变量 AWS_VPC_K8S_CNI_EXTERNALSNAT=true

您可以获取新的 yaml 并应用,也可以通过仪表板修复它。但是,要使其正常工作,您必须重新启动工作节点实例,以便刷新 ip 路由表。

问题 link 是 here

谢谢

要详细说明@Daniel 的评论,您需要:

  1. UDP 端口 53 的入口规则
  2. 临时端口(例如 1025–65535)上的 UDP 入口规则

我没有添加 (2) 并且看到 CoreDNS 正在接收请求并尝试响应,但响应没有返回给请求者。

给其他人处理这类问题的一些技巧,通过将 log 配置添加到配置映射来打开 CoreDNS 日志记录,我可以使用 kubectl edit configmap -n kube-system coredns 做到这一点。请参阅关于此的 CoreDNS 文档 https://github.com/coredns/coredns/blob/master/README.md#examples 这可以帮助您确定问题是 CoreDNS 接收查询还是发回响应。

回复:AWS EKS Kube 集群和 Route53 internal/private 来自 pods

的 Route53 查询

只是想 post 说明我们需要做什么来解决我们的问题。注意到YMMV和大家有不同的环境和分辨率等等

免责声明: 我们将社区 terraform eks 模块用于 deploy/manage vpc 和 eks 集群。我们不需要修改任何安全组。我们正在处理多个集群、区域和 VPC。

参考: Terraform EKS module

CoreDNS 更改: 我们有一个私有内部的 DNS 中继,所以我们需要修改 coredns configmap 并添加 dns-relay IP 地址 ...

ec2.internal:53 {
    errors
    cache 30
    forward . 10.1.1.245
}
foo.dev.com:53 {
    errors
    cache 30
    forward . 10.1.1.245
}
foo.stage.com:53 {
    errors
    cache 30
    forward . 10.1.1.245
}

...

VPC DHCP 选项集: 如果适用,请使用上述中继服务器的 IP 进行更新——需要重新设置选项集,因为它们无法修改。

我们的 DHCP 选项集如下所示:

["AmazonProvidedDNS", "10.1.1.245", "169.254.169.253"]

参考:AWS DHCP Option Sets

Route-53 更新: 将每个 route53 区域与您需要与之关联的 VPC-ID 相关联(我们的 kube 集群所在的位置,pods 将从中进行查询)。

还有一个 terraform 模块: https://www.terraform.io/docs/providers/aws/r/route53_zone_association.html

我们 运行 遇到了类似的问题,其中 DNS 解析在某些 pods 上超时,但重新创建 pod 几次解决了问题。此外,并不是给定节点上的每个 pod 都显示问题,只有一些 pods。

结果证明是由于 Amazon VPC CNI 1.5.4 版本中的一个错误,更多细节在这里 -- https://github.com/aws/amazon-vpc-cni-k8s/issues/641

快速解决方案是恢复到推荐版本 1.5.3 - https://docs.aws.amazon.com/eks/latest/userguide/update-cluster.html

我运行也喜欢这个。我有多个节点组,每个节点组都是从 CloudFormation 模板创建的。 CloudFormation 模板为每个节点组创建了一个安全组,允许该组中的节点相互通信。

DNS 错误是由于 Pods 运行 在与 CoreDNS Pods 不同的节点组中造成的,因此 Pods 无法访问 CoreDNS(网络通信仅允许使用节点组)。我将为节点安全组创建一个新的 CloudFormation 模板,以便我集群中的所有节点组可以共享同一个安全组。

我通过允许每个节点组安全组在端口 53 上的入站 UDP 流量暂时解决了这个问题。