问题描述
我需要阻止 Pod 之间的通信,但我没有做到。
我在我的 Minikube (v1.21.0) 上安装了 weave plug-in,并在同一个命名空间中启动了两个 Pod:
kubectl run Nginx1 --image=Nginx -n ns1
kubectl run Nginx2 --image=Nginx -n ns2
Pod 的 IP:Nginx1
与 IP:172.17.0.3
Nginx2
与 IP:172.17.0.4
我可以从 Nginx1
ping Nginx2
,反之亦然。
我想尝试拒绝它,所以我首先尝试用这个网络策略拒绝所有网络:
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
Metadata:
name: netpol1
namespace: earth
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress: []
egress: []
EOF
我仍然有 ping,所以我也尝试了这个:
kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
Metadata:
name: netpol1
namespace: earth
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 172.17.0.0/16
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 172.17.0.0/16
EOF
我仍然可以从同一命名空间中的其他 pod 中 ping 每个 pod。
我确认已安装 weave
:
NAME READY STATUS RESTARTS AGE
coredns-74ff55c5b-2r5z8 1/1 Running 0 2d3h
etcd-ip-172-31-37-46 1/1 Running 0 2d3h
kube-apiserver-ip-172-31-37-46 1/1 Running 0 2d3h
kube-controller-manager-ip-172-31-37-46 1/1 Running 0 2d3h
kube-proxy-787pj 1/1 Running 0 2d3h
kube-scheduler-ip-172-31-37-46 1/1 Running 0 2d3h
storage-provisioner 1/1 Running 0 2d3h
weave-net-wd52r 2/2 Running 1 23m
我也尝试重新启动 kubelet,但我仍然可以从每个 pod 访问另一个。
可能是什么原因?
解决方法
指定 Egress 和 Ingress 资源时,不指定网络协议。在 kubernetes docs 中,您可以看到也可以指定协议。如果您没有指定协议,您的 kubernetes 集群会将您的 Egress 和 Ingress 资源默认为一种协议。
如果您阻止所有 TCP 或 UDP 网络,您会发现 ping 仍然可以正常工作。这是因为 ping 使用 ICMP 网络协议,而不是 TCP 或 UDP。
您需要的实际配置取决于您的网络插件。我不知道如何配置 Weave 来阻止 ICMP。
如果您使用的是 Calico,他们的 docs 说明了如何处理 ICMP 协议。