通过服务 clusterIP 从 pod 到 pod 的连接被拒绝

Connection refused from pod to pod via service clusterIP

我基于 k3sup 的树莓派 4 集群出现问题。

一切都按预期进行,直到昨天我不得不重新安装主节点操作系统。例如,我在主节点上安装了一个 redis,然后在工作节点上安装了一些 pods。我的 pods 无法通过 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.conf 替换为 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

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

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

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

通过在服务定义中添加 AfterBefore 来订购您的系统单位就足够了。我有如下所示的 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之后运行。