서로 통신하기 위해 두 개의 네트워크 네임스페이스를 설정하려고 합니다. 저는 ns0
각각 veth 쌍이 있는 두 개의 네임스페이스를 설정했습니다 ns1
. 여기서 veth의 네임스페이스가 아닌 쪽은 브리지에 연결됩니다.
이것이 내가 설정한 방법입니다:
ip link add veth0 type veth peer name brveth0
ip link set brveth0 up
ip link add veth1 type veth peer name brveth1
ip link set brveth1 up
ip link add br10 type bridge
ip link set br10 up
ip addr add 192.168.1.11/24 brd + dev br10
ip netns add ns0
ip netns add ns1
ip link set veth0 netns ns0
ip link set veth1 netns ns1
ip netns exec ns0 ip addr add 192.168.1.20/24 dev veth0
ip netns exec ns0 ip link set veth0 up
ip netns exec ns0 ip link set lo up
ip netns exec ns1 ip addr add 192.168.1.21/24 dev veth1
ip netns exec ns1 ip link set veth1 up
ip netns exec ns1 ip link set lo up
ip link set brveth0 master br10
ip link set brveth1 master br10
ns0
예상대로 인터페이스에 ping을 보낼 수 있습니다 ns1
.
$ sudo ip netns exec ns1 ping -c 3 192.168.1.20
PING 192.168.1.20 (192.168.1.20) 56(84) bytes of data.
64 bytes from 192.168.1.20: icmp_seq=1 ttl=64 time=0.099 ms
64 bytes from 192.168.1.20: icmp_seq=2 ttl=64 time=0.189 ms
그러나 TCP를 통해 둘을 연결할 수는 없습니다.
예를 들어 다음에서 서버를 실행합니다 ns0
.
$ sudo ip netns exec ns0 python3 -m http.server 8080
Serving HTTP on 0.0.0.0 port 8080 (http://0.0.0.0:8080/) ...
컬에서 컬링할 수 있기를 원 ns1
하지만 이로 인해 오류가 발생합니다.
$ sudo ip netns exec ns1 curl 192.168.1.20:8080
curl: (7) Failed to connect to 192.168.1.20 port 8080: No route to host
왜 이런 일이 발생합니까?
답변1
비슷한 상황이 발생했습니다. 플란넬을 사용하는 k8s 호스트에서 podA는 동일한 호스트에서 podB를 핑할 수 있었지만 cni0의 ICMP 재설정으로 tcp 연결이 재설정되었습니다.
iptables-save
k8s에 대한 규칙을 보여줍니다. 모두 좋아 보입니다.
nft list ruleset
Firewalld가 만든 규칙을 표시합니다.
table inet firewalld {
chain filter_FORWARD {
type filter hook forward priority filter + 10; policy accept;
ct state { established, related } accept
ct status dnat accept
iifname "lo" accept
ip6 daddr { ::/96, ::ffff:0.0.0.0/96, 2002::/24, 2002:a00::/24, 2002:7f00::/24, 2002:a9fe::/32, 2002:ac10::/28, 2002:c0a8::/32, 2002:e000::/19 } reject with icmpv6 addr-unreachable
jump filter_FORWARD_ZONES
ct state invalid drop
reject with icmpx admin-prohibited
}
방화벽 서비스를 중지한 후 모든 것이 잘 작동했습니다.
systemctl stop firewalld
따라서 다른 서비스나 커널 모듈도 netfiler를 사용하고 있는지 확인해보세요.