Kubernetes DNS 在工作节点上无法使用 - 连接超时,无法到达任何服务器。

12

我已经构建了一个新的Kubernetes集群v1.20.1,它有单个主节点和单个工作节点,并使用Calico CNI。

我在默认命名空间中部署了busybox pod。

# kubectl get pods busybox -o wide
NAME      READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
busybox   1/1     Running   0          12m   10.203.0.129   node02   <none>           <none>

 

nslookup无法工作

kubectl exec -ti busybox -- nslookup kubernetes.default
Server:    10.96.0.10
Address 1: 10.96.0.10

nslookup: can't resolve 'kubernetes.default'

集群正在运行最新更新的RHEL 8操作系统。

按照以下步骤:https://kubernetes.io/docs/tasks/administer-cluster/dns-debugging-resolution/

nslookup命令无法连接到域名解析服务器。

# kubectl exec -i -t dnsutils -- nslookup kubernetes.default
;; connection timed out; no servers could be reached

command terminated with exit code 1

resolve.conf 文件

# kubectl exec -ti dnsutils -- cat /etc/resolv.conf
search default.svc.cluster.local svc.cluster.local cluster.local 
nameserver 10.96.0.10
options ndots:5

DNS pod正在运行。
# kubectl get pods --namespace=kube-system -l k8s-app=kube-dns
NAME                      READY   STATUS    RESTARTS   AGE
coredns-74ff55c5b-472vx   1/1     Running   1          85m
coredns-74ff55c5b-c75bq   1/1     Running   1          85m

DNS Pod 日志

 kubectl logs --namespace=kube-system -l k8s-app=kube-dns
.:53
[INFO] plugin/reload: Running configuration MD5 = db32ca3650231d74073ff4cf814959a7
CoreDNS-1.7.0
linux/amd64, go1.14.4, f59c03d
.:53
[INFO] plugin/reload: Running configuration MD5 = db32ca3650231d74073ff4cf814959a7
CoreDNS-1.7.0
linux/amd64, go1.14.4, f59c03d

Service的定义

# kubectl get svc --namespace=kube-system
NAME       TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)                  AGE
kube-dns   ClusterIP   10.96.0.10   <none>        53/UDP,53/TCP,9153/TCP   86m

**I can see the endpoints of DNS pod**

# kubectl get endpoints kube-dns --namespace=kube-system
NAME       ENDPOINTS                                               AGE
kube-dns   10.203.0.5:53,10.203.0.6:53,10.203.0.5:53 + 3 more...   86m

已启用日志记录,但未看到流量传输到 DNS pod

# kubectl logs --namespace=kube-system -l k8s-app=kube-dns
.:53
[INFO] plugin/reload: Running configuration MD5 = db32ca3650231d74073ff4cf814959a7
CoreDNS-1.7.0
linux/amd64, go1.14.4, f59c03d
.:53
[INFO] plugin/reload: Running configuration MD5 = db32ca3650231d74073ff4cf814959a7
CoreDNS-1.7.0
linux/amd64, go1.14.4, f59c03d

我可以ping通DNS POD

# kubectl exec -i -t dnsutils -- ping 10.203.0.5
PING 10.203.0.5 (10.203.0.5): 56 data bytes
64 bytes from 10.203.0.5: seq=0 ttl=62 time=6.024 ms
64 bytes from 10.203.0.5: seq=1 ttl=62 time=6.052 ms
64 bytes from 10.203.0.5: seq=2 ttl=62 time=6.175 ms
64 bytes from 10.203.0.5: seq=3 ttl=62 time=6.000 ms
^C
--- 10.203.0.5 ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 6.000/6.062/6.175 ms

nmap显示端口过滤

# ke netshoot-6f677d4fdf-5t5cb -- nmap 10.203.0.5
Starting Nmap 7.80 ( https://nmap.org ) at 2021-01-15 22:29 UTC
Nmap scan report for 10.203.0.5
Host is up (0.0060s latency).
Not shown: 997 closed ports
PORT     STATE    SERVICE
53/tcp   filtered domain
8080/tcp filtered http-proxy
8181/tcp filtered intermapper

Nmap done: 1 IP address (1 host up) scanned in 14.33 seconds

如果我在主节点上安排POD,nslookup工作并且nmap显示端口打开吗?

# ke netshoot -- bash
bash-5.0# nslookup kubernetes.default
Server:         10.96.0.10
Address:        10.96.0.10#53

Name:   kubernetes.default.svc.cluster.local
Address: 10.96.0.1

 nmap -p 53 10.96.0.10
Starting Nmap 7.80 ( https://nmap.org ) at 2021-01-15 22:46 UTC
Nmap scan report for kube-dns.kube-system.svc.cluster.local (10.96.0.10)
Host is up (0.000098s latency).

PORT   STATE SERVICE
53/tcp open  domain

Nmap done: 1 IP address (1 host up) scanned in 0.14 seconds

为什么在工作节点上运行的 POD 上执行 nslookup 无法正常工作?如何排除这个问题?

我已经重新构建了服务器两次,但问题依旧存在。

谢谢

SR

更新,添加 kubeadm 配置文件

# cat kubeadm-config.yaml
---
apiVersion: kubeadm.k8s.io/v1beta2
bootstrapTokens:
- groups:
  - system:bootstrappers:kubeadm:default-node-token
  token: abcdef.0123456789abcdef
  ttl: 24h0m0s
  usages:
  - signing
  - authentication
kind: InitConfiguration
nodeRegistration:
  criSocket: unix:///run/containerd/containerd.sock
  taints:
  - effect: NoSchedule
    key: node-role.kubernetes.io/master
  kubeletExtraArgs:
    cgroup-driver: "systemd"
---
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: stable
controlPlaneEndpoint: "master01:6443"
networking:
  dnsDomain: cluster.local
  podSubnet: 10.0.0.0/14
  serviceSubnet: 10.96.0.0/12
---
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs

"


1
不是专家,但想知道是否有任何“netpol”混乱? - P....
尝试使用 busybox:1.28,但仍然出现相同的错误 nslookup: can't resolve 'kubernetes.default'。如果我在主节点上运行 busybox,则 nslookup 可以正常工作,但从工作节点上无法正常工作。 - sfgroups
你是如何部署Calico的? 你能检查你的Calico Pods的状态和日志吗(特别是来自你的工作节点的那个)? - matt_j
2
您是否允许TCP和UDP端口53用于DNS访问? 您是否禁用了SELinux? 您是否使用默认设置+自定义pod-network cidr通过kubeadm引导了k8s? 您能否分享您的确切pod-network-cidrservice-cidr? 您是否有任何其他集群配置,例如k8s网络策略、calico网络策略? 您是否符合这些要求? 您是否遵循了关于在rhel 8上安装和配置k8s的官方文档? - matt_j
你觉得可能是版本的问题吗?我也在使用v1.20,但看到了这篇帖子 https://dev59.com/Krzpa4cB1Zd3GeqPVv9p,我正在考虑降级到v1.19。你觉得怎么样? - Denn
显示剩余9条评论
3个回答

7
首先,根据文档,请注意Calicokubeadm仅支持Centos/RHEL 7+
Calicokubeadm文档中,我们可以看到它们仅支持RHEL7+
默认情况下,RHEL8使用nftables而不是iptables(我们仍然可以使用iptables,但是在RHEL8上,“iptables”实际上是在后台使用内核的nft框架 - 参见"Running Iptables on RHEL 8")。

9.2.1. nftables 作为默认的网络数据包过滤框架替代 iptables

我认为 nftables 可能会导致网络问题,因为我们可以在 采用页面 上找到以下信息:

Kubernetes 尚不支持 nftables。

注意: 目前我强烈建议您使用 RHEL7 而不是 RHEL8


考虑到这一点,我将提供一些与RHEL8相关的信息,可能会对您有所帮助。
我重现了您的问题,并找到了适合我的解决方案。
  • 首先,我打开了Calico所需的端口 - 这些端口可以在“网络要求”下找到here
    作为解决方法:
  • 接下来,我在所有集群节点上恢复了旧的iptables后端,您可以通过在/etc/firewalld/firewalld.conf中设置FirewallBackendiptables来轻松地执行此操作,如此处所述here
  • 最后,我重新启动了firewalld以使新规则生效。

我尝试从运行在工作节点(kworker)上的中进行nslookup,并且似乎正常工作。

root@kmaster:~# kubectl get pod,svc -o wide
NAME      READY   STATUS    RESTARTS   AGE    IP           NODE      NOMINATED NODE   READINESS GATES
pod/web   1/1     Running   0          112s   10.99.32.1   kworker   <none>           <none>

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE     SELECTOR
service/kubernetes   ClusterIP   10.99.0.1    <none>        443/TCP   5m51s   <none>
root@kmaster:~# kubectl exec -it web -- bash
root@web:/# nslookup kubernetes.default
Server:         10.99.0.10
Address:        10.99.0.10#53

Name:   kubernetes.default.svc.cluster.local
Address: 10.99.0.1

root@web:/#

谢谢提供信息。让我试一下并更新状态。 - sfgroups
我已经更换到了 RHEL 7。 - sfgroups
另一篇关于NFT解决方法的文章:https://mihail-milev.medium.com/no-pod-to-pod-communication-on-centos-8-kubernetes-with-calico-56d694d2a6f4 - sfgroups
根据此文档,它支持RHEL 8。https://github.com/kubernetes/kops/blob/master/docs/operations/images.md - sfgroups
如何在Ubuntu20上解决此问题? - divine

1

我在设置RHEL8上的vanilla kubeadm 1.25集群时遇到了同样的问题,@matt_j的答案引导我找到了另一个解决方案,通过在kube-proxy中使用ipvs模式来避免nftables。

只需修改kube-system命名空间中的kube-proxy ConfigMap,使config.conf文件具有以下值即可;

...
data:
  config.conf:
    ...
    mode: "ipvs"
...

并确保 kube-proxy 或您的节点已重新启动。


0
在我的情况下,我们正在使用K3S集群。新代理无法进行默认(ClusterFirst)DNS查询。经过大量研究,我发现需要更改kube-proxy cluster-cidr参数才能使DNS成功工作。
希望这些信息对其他人有用。

1
你能详细说明一下使用这些参数使DNS工作的含义吗? - ThirteenthWolf
我猜需要指定Cluster CIDR,让kube-proxy知道正确的IP范围,特别是当实例中有多个网络卡时。 - Ela Dute

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接