首页 > 解决方案 > 通过服务 clusterIP 从 pod 到 pod 的连接被拒绝

问题描述

我的基于 k3sup 的 RPi 4 集群出了点问题。

直到昨天我不得不重新安装主节点操作系统时,一切都按预期工作。例如,我在主节点上安装了一个 redis,然后在工作节点上安装了一些 pod。我的 pod 无法通过 DNS 连接到 redis:(redis-master.database.svc.cluster.local但它们在前一天就可以了)。

当我使用busybox进行测试时,它会引发无法解析域的错误,例如:

kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- nslookup redis-master.database.svc.cluster.local

当我想用 IP ping 我的服务时(也在busybox上):

kubectl run -it --rm --restart=Never busybox --image=busybox:1.28 -- ping 10.43.115.159

它显示 100% 的数据包丢失。

我可以通过简单地替换 coredns 配置(用forward . /etc/resolv.confto替换行forward . 192.168.1.101)来解决 DNS 问题,但我认为这不是一个好的解决方案,因为之前我不必这样做。

此外,它解决了将域映射到 IP 的问题,但仍然无法通过 IP 连接。

我的节点:

NAME     STATUS   ROLES    AGE   VERSION         INTERNAL-IP     EXTERNAL-IP   OS-IMAGE                       KERNEL-VERSION   CONTAINER-RUNTIME
node-4   Ready    <none>   10h   v1.19.15+k3s2   192.168.1.105   <none>        Debian GNU/Linux 10 (buster)   5.10.60-v8+      containerd://1.4.11-k3s1
node-3   Ready    <none>   10h   v1.19.15+k3s2   192.168.1.104   <none>        Debian GNU/Linux 10 (buster)   5.10.60-v8+      containerd://1.4.11-k3s1
node-1   Ready    <none>   10h   v1.19.15+k3s2   192.168.1.102   <none>        Debian GNU/Linux 10 (buster)   5.10.60-v8+      containerd://1.4.11-k3s1
node-0   Ready    master   10h   v1.19.15+k3s2   192.168.1.101   <none>        Debian GNU/Linux 10 (buster)   5.10.63-v8+      containerd://1.4.11-k3s1
node-2   Ready    <none>   10h   v1.19.15+k3s2   192.168.1.103   <none>        Debian GNU/Linux 10 (buster)   5.10.60-v8+      containerd://1.4.11-k3s1

主节点有一个污点:role=master:NoSchedule.

有任何想法吗?

更新 1

我能够连接到redis pod。/etc/resolv.conf 来自redis-master-0

search database.svc.cluster.local svc.cluster.local cluster.local
nameserver 10.43.0.10
options ndots:5

Kubernetes 上的所有服务:

NAMESPACE       NAME                    TYPE           CLUSTER-IP      EXTERNAL-IP                                               PORT(S)                      AGE
default         kubernetes              ClusterIP      10.43.0.1       <none>                                                    443/TCP                      6d9h
kube-system     traefik-prometheus      ClusterIP      10.43.94.137    <none>                                                    9100/TCP                     6d8h
registry        proxy-docker-registry   ClusterIP      10.43.16.139    <none>                                                    5000/TCP                     6d8h
kube-system     kube-dns                ClusterIP      10.43.0.10      <none>                                                    53/UDP,53/TCP,9153/TCP       6d9h
kube-system     metrics-server          ClusterIP      10.43.101.30    <none>                                                    443/TCP                      6d9h
database        redis-headless          ClusterIP      None            <none>                                                    6379/TCP                     5d19h
database        redis-master            ClusterIP      10.43.115.159   <none>                                                    6379/TCP                     5d19h
kube-system     traefik                 LoadBalancer   10.43.221.89    192.168.1.102,192.168.1.103,192.168.1.104,192.168.1.105   80:30446/TCP,443:32443/TCP   6d8h

标签: kubernetesnetworkingk3scorednsk3sup

解决方案


还有一件事没有提到。我在主节点上使用 OpenVPN 和 NordVPN 服务器列表,并为工作节点使用 privoxy。

在运行 kubernetes master 之前安装并运行 OpenVPN 时,OpenVPN 会添加阻止 kubernetes 网络的规则。因此,coredns 不起作用,您也无法通过 IP 访问任何 pod。

我正在使用 RPi 4 集群,所以对我来说,只需重新安装主节点,首先安装 kubernetes,然后配置 openvpn 就足够了。现在一切都按预期工作。

After通过添加或Before在服务定义中订购您的系统单元就足够了。我有如下所示的 VPN systemd 服务:

[Unit]
Description=Enable VPN for System
After=network.target
After=k3s.service

[Service]
Type=simple
ExecStart=/etc/openvpn/start-nordvpn-server.sh

[Install]
WantedBy=multi-user.target

它保证VPN将在kubernetes之后运行。


推荐阅读