NetworkPolicy 不会阻止所有 Pod 通信

问题描述

我需要阻止 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 协议。