public 子网上的 AWS EKS CoreDNS 问题

AWS EKS CoreDNS issue on public subnet

我使用他们的设置步骤完成了 AWS EKS。

AWS EKS 版本 1.11,coredns

使用 VPC,我根据此处的文档创建了两个 public 和两个私有子网:https://docs.aws.amazon.com/eks/latest/userguide/create-public-private-vpc.html

部署到私有子网的节点标记为私有,部署到 public 子网的节点标记为 public。

当我将 busybox pod 部署到每个 nodeSelector (public/private) 时,public 容器无法解析 dns,而私有容器可以。

nslookup: can't resolve 'kubernetes.default'

如果我通过 ssh 连接到 public 子网节点本身,我就能够成功地 ping 主机名(即 google.com)。

有什么想法吗?

# kubectl exec -it busybox-private -- nslookup kubernetes.default

Server:    172.20.0.10
Address 1: 172.20.0.10 ip-172-20-0-10.ec2.internal

Name:      kubernetes.default
Address 1: 172.20.0.1 ip-172-20-0-1.ec2.internal
# kubectl exec -it busybox-public -- nslookup kubernetes.default
Server:    172.20.0.10
Address 1: 172.20.0.10

nslookup: can't resolve 'kubernetes.default'
command terminated with exit code 1
# kubectl -n=kube-system get all
NAME                           READY     STATUS    RESTARTS   AGE
pod/aws-node-46626             1/1       Running   0          3h
pod/aws-node-52rqw             1/1       Running   1          3h
pod/aws-node-j7n8l             1/1       Running   0          3h
pod/aws-node-k7kbr             1/1       Running   0          3h
pod/aws-node-tr8x7             1/1       Running   0          3h
pod/coredns-7bcbfc4774-5ssnx   1/1       Running   0          20h
pod/coredns-7bcbfc4774-vxrgs   1/1       Running   0          20h
pod/kube-proxy-2c7gj           1/1       Running   0          3h
pod/kube-proxy-5qr9h           1/1       Running   0          3h
pod/kube-proxy-6r96f           1/1       Running   0          3h
pod/kube-proxy-9tqxt           1/1       Running   0          3h
pod/kube-proxy-bhkzx           1/1       Running   0          3h

NAME               TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)         AGE
service/kube-dns   ClusterIP   172.20.0.10   <none>        53/UDP,53/TCP   20h

NAME                        DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR   AGE
daemonset.apps/aws-node     5         5         5         5            5           <none>          20h
daemonset.apps/kube-proxy   5         5         5         5            5           <none>          20h

NAME                      DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/coredns   2         2         2            2           20h

NAME                                 DESIRED   CURRENT   READY     AGE
replicaset.apps/coredns-7bcbfc4774   2         2         2         20h

正在经历 "Debugging DNS Resolution" https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/

奇怪的是 AWS 有他们的 coredns pods 仍然标记为 kube-dns

# kubectl get pods --namespace=kube-system -l k8s-app=kubedns
No resources found.

# kubectl get pods --namespace=kube-system -l k8s-app=kube-dns
NAME                       READY     STATUS    RESTARTS   AGE
coredns-7bcbfc4774-5ssnx   1/1       Running   0          20h
coredns-7bcbfc4774-vxrgs   1/1       Running   0          20h

# for p in $(kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o name); do kubectl logs --namespace=kube-system $p; done
2019/01/31 15:23:36 [INFO] CoreDNS-1.1.3
2019/01/31 15:23:36 [INFO] linux/amd64, go1.10.5, d47c9319
.:53
CoreDNS-1.1.3
linux/amd64, go1.10.5, d47c9319
2019/01/31 15:23:36 [INFO] CoreDNS-1.1.3
2019/01/31 15:23:36 [INFO] linux/amd64, go1.10.5, d47c9319
.:53
CoreDNS-1.1.3
linux/amd64, go1.10.5, d47c9319

我认为我在查看工作节点安全组时发现了问题。

A​​WS EKS kube-dns 端点和 pods 在私有子网上。

我有两个 CloudFormation 堆栈:一个用于私有子网中的自动缩放节点,一个用于 public 子网中的自动缩放节点。

他们没有共同的安全组,因此 public 节点中的 pods 运行 无法访问 kube-dns pods 运行 在私有节点上。

更新工作节点安全组以允许交叉通信后,DNS 开始工作。

如果有人看到任何意外后果,请post。