Pods 在 EKS 中:无法解析 DNS(但可以 ping IP)
Pods in EKS: can't resolve DNS (but can ping IP)
我有 2 个 EKS 集群,在 2 个不同的 AWS 账户中,并且我可能假设有不同的防火墙(我无权访问)。第一个 (Dev) 没问题,但是,使用相同的配置,UAT 集群 pods 正在努力解析 DNS。节点可以解决,似乎没问题。
1) ping 8.8.8.8 有效
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
2) 我可以 ping google(和其他)的 IP,但不能 ping 实际的 dns 名称。
我们的配置:
- 配置了 Terraform。
- 工作节点和控制平面 SG 与开发节点相同。我相信这些都很好。
- 在入站 + 出站 NACl 上添加了 53 个 TCP 和 53 个 UDP(只是为了确保 53 确实打开...)。添加了从工作节点出站的 53 个 TCP 和 53 个 UDP。
- 我们正在使用
ami-059c6874350e63ca9
1.14 kubernetes 版本。
我不确定问题是某个地方的防火墙、coredns、我的配置需要更新还是 "stupid mistake"。任何帮助将不胜感激。
经过几天的调试,问题出在这里:
我已经允许节点之间的所有流量,但是 all traffic
是 TCP,而不是 UDP。
它基本上是 AWS 中的一行:
在工作节点 SG 中,添加入站规则 from/to 工作节点端口 53 协议 DNS (UDP)。
如果你使用 terraform,它应该是这样的:
resource "aws_security_group_rule" "eks-node-ingress-cluster-dns" {
description = "Allow pods DNS"
from_port = 53
protocol = 17
security_group_id = "${aws_security_group.SG-eks-WorkerNodes.id}"
source_security_group_id = "${aws_security_group.SG-eks-WorkerNodes.id}"
to_port = 53
type = "ingress"
}
请注意,此问题可能以多种形式出现(例如,DNS 未解析只是一种可能的情况)。 terraform-awk-eks
模块公开了一个 terraform 输入以创建必要的安全组规则,允许这些 worker-group/node-group 间通信:worker_create_cluster_primary_security_group_rules
。此 terraform-awk-eks
期的更多信息 https://github.com/terraform-aws-modules/terraform-aws-eks/issues/1089
启用输入后,terraform 会创建以下安全组规则:
# module.eks.module.eks.aws_security_group_rule.cluster_primary_ingress_workers[0] will be created
+ resource "aws_security_group_rule" "cluster_primary_ingress_workers" {
+ description = "Allow pods running on workers to send communication to cluster primary security group (e.g. Fargate pods)."
+ from_port = 0
+ id = (known after apply)
+ protocol = "-1"
+ security_group_id = "sg-03bb33d3318e4aa03"
+ self = false
+ source_security_group_id = "sg-0fffc4d49a499a1d8"
+ to_port = 65535
+ type = "ingress"
}
# module.eks.module.eks.aws_security_group_rule.workers_ingress_cluster_primary[0] will be created
+ resource "aws_security_group_rule" "workers_ingress_cluster_primary" {
+ description = "Allow pods running on workers to receive communication from cluster primary security group (e.g. Fargate pods)."
+ from_port = 0
+ id = (known after apply)
+ protocol = "-1"
+ security_group_id = "sg-0fffc4d49a499a1d8"
+ self = false
+ source_security_group_id = "sg-03bb33d3318e4aa03"
+ to_port = 65535
+ type = "ingress"
}
我有 2 个 EKS 集群,在 2 个不同的 AWS 账户中,并且我可能假设有不同的防火墙(我无权访问)。第一个 (Dev) 没问题,但是,使用相同的配置,UAT 集群 pods 正在努力解析 DNS。节点可以解决,似乎没问题。
1) ping 8.8.8.8 有效
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
2) 我可以 ping google(和其他)的 IP,但不能 ping 实际的 dns 名称。
我们的配置:
- 配置了 Terraform。
- 工作节点和控制平面 SG 与开发节点相同。我相信这些都很好。
- 在入站 + 出站 NACl 上添加了 53 个 TCP 和 53 个 UDP(只是为了确保 53 确实打开...)。添加了从工作节点出站的 53 个 TCP 和 53 个 UDP。
- 我们正在使用
ami-059c6874350e63ca9
1.14 kubernetes 版本。
我不确定问题是某个地方的防火墙、coredns、我的配置需要更新还是 "stupid mistake"。任何帮助将不胜感激。
经过几天的调试,问题出在这里:
我已经允许节点之间的所有流量,但是 all traffic
是 TCP,而不是 UDP。
它基本上是 AWS 中的一行: 在工作节点 SG 中,添加入站规则 from/to 工作节点端口 53 协议 DNS (UDP)。
如果你使用 terraform,它应该是这样的:
resource "aws_security_group_rule" "eks-node-ingress-cluster-dns" {
description = "Allow pods DNS"
from_port = 53
protocol = 17
security_group_id = "${aws_security_group.SG-eks-WorkerNodes.id}"
source_security_group_id = "${aws_security_group.SG-eks-WorkerNodes.id}"
to_port = 53
type = "ingress"
}
请注意,此问题可能以多种形式出现(例如,DNS 未解析只是一种可能的情况)。 terraform-awk-eks
模块公开了一个 terraform 输入以创建必要的安全组规则,允许这些 worker-group/node-group 间通信:worker_create_cluster_primary_security_group_rules
。此 terraform-awk-eks
期的更多信息 https://github.com/terraform-aws-modules/terraform-aws-eks/issues/1089
启用输入后,terraform 会创建以下安全组规则:
# module.eks.module.eks.aws_security_group_rule.cluster_primary_ingress_workers[0] will be created
+ resource "aws_security_group_rule" "cluster_primary_ingress_workers" {
+ description = "Allow pods running on workers to send communication to cluster primary security group (e.g. Fargate pods)."
+ from_port = 0
+ id = (known after apply)
+ protocol = "-1"
+ security_group_id = "sg-03bb33d3318e4aa03"
+ self = false
+ source_security_group_id = "sg-0fffc4d49a499a1d8"
+ to_port = 65535
+ type = "ingress"
}
# module.eks.module.eks.aws_security_group_rule.workers_ingress_cluster_primary[0] will be created
+ resource "aws_security_group_rule" "workers_ingress_cluster_primary" {
+ description = "Allow pods running on workers to receive communication from cluster primary security group (e.g. Fargate pods)."
+ from_port = 0
+ id = (known after apply)
+ protocol = "-1"
+ security_group_id = "sg-0fffc4d49a499a1d8"
+ self = false
+ source_security_group_id = "sg-03bb33d3318e4aa03"
+ to_port = 65535
+ type = "ingress"
}