私有子网中 运行 时 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 的评论,您需要:
- UDP 端口 53 的入口规则
- 临时端口(例如 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。
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"]
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 流量暂时解决了这个问题。
我在 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 的评论,您需要:
- UDP 端口 53 的入口规则
- 临时端口(例如 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。
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"]
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 流量暂时解决了这个问题。