为什么我无法使用格式 http://<ip_with_dashes>.<namespace>.pod.cluster.local 访问另一个名称空间中的 pod?

Why can't I reach a pod in another namespace using the format http://<ip_with_dashes>.<namespace>.pod.cluster.local?

我在其中创建了一个命名空间和一个 pod,如下所示:

# Create the namespace
kubectl create namespace one

# Create the pod (NOTE - Without a service)
kubectl run rest -n one --image nginx --labels app=rest --expose --port 80

然后我创建了第二个命名空间和 pod(我将使用它来访问第一个)。

# Create the namespace
kubectl create namespace two

# Create the pod (NOTE - Without a service)
kubectl run call-rest -n two --image alpine -- sleep 3600

然后我抓取第一个pod的ip地址:

kubectl get pod rest -n one -o wide

# This gives me
# NAME   READY   STATUS    RESTARTS   AGE   IP              NODE               NOMINATED NODE   READINESS GATES
# rest   1/1     Running   0          10m   192.168.0.142   k3d-dev-server-0   <none>           <none>

我使用该 ip 地址从另一个 pod 调用它。

# This uses the format that K8s creates for DNS
kubectl exec -it call-rest -n two -- wget -qO- --timeout=2 http://192-168-0-142.one.pod.cluster.local

以上只是超时

wget: download timed out
command terminated with exit code 1

为了验证,我检查了集群的域,我的域是正确的:

# Run this inside the pod
kubectl exec -it call-rest -n two -- cat /etc/resolv.conf

# And it prints out:
#
# search two.svc.cluster.local svc.cluster.local cluster.local
# nameserver 10.43.0.10
# options ndots:5

如果 pods 在同一个命名空间中,它们可以相互访问(但这样我就不需要使用 ip 地址了)。

知道如何让它们相互联系吗?

我正在使用:

原来这是因为我使用的是 Calico。使用 k3d 中使用的默认 Flannel,上述 确实 有效。但是,在 Calico 中,它会为 pods 创建集群范围的 IP 地址,而不是每个命名空间内的 IP。所以以下工作:

kubectl exec -it call-rest -n two -- wget -qO- --timeout=2 http://192.168.0.142