Kubernetes 网络策略拒绝所有策略不阻止基本通信
Kubernetes network policy deny-all policy not blocking basic communication
我是运行 GKE集群版本1.17.13-gke.1400。
我在我的集群中应用了以下网络策略 -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
这应该会阻止在默认命名空间上进出 pods 的所有通信。
然而,事实并非如此。从这个测试中可以明显看出 -
$ kubectl run p1 -it --image google/cloud-sdk
root@p1:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=1.14 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=114 time=1.21 ms
^C
root@p1:/# curl www.google.com
<!doctype html><html itemscope=" ...
从 docs 看来,这个应用程序应该非常简单。
任何有助于理解我做错了什么的帮助,或进一步故障排除的提示,我们将不胜感激。
谢谢,
宁录,
要使网络策略生效,您的集群需要 运行 一个网络插件来执行它们。 Project Calico or Cilium 是这样做的插件。这不是创建集群时的默认设置!
所以首先,您应该检查您的集群是否按照 Google Cloud Network Policies docs 中的描述进行了相应设置。这是在 --enable-network-policy
标志后面以某种方式抽象出来的。
如果启用,您应该会在 kube-system
命名空间中看到一些 calico pods。
kubectl get pods --namespace=kube-system
如果有执行网络策略的插件,您需要确保在所需的命名空间中部署了网络策略 - 并检查您使用 kubectl run
的测试是否在该命名空间中执行,也。您可能在您的 kube 上下文中配置了一些其他命名空间,并且没有使用您的命令点击默认命名空间。
使用清单安装 Calico
将 Calico 清单应用到您的集群。这些清单在 kube-system 命名空间中创建了一个 DaemonSet。
kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-operator.yaml
kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-crs.yaml
查看 kube-system 命名空间中的资源。
kubectl get daemonset calico-node --namespace kube-system
输出
DESIRED 和 READY 列中的值应该匹配。为您返回的值与以下输出中的值不同。
NAME DESIRED CURRENT READY UP-TO-DATE 可用节点选择器年龄
calico-node 1 1 1 1 1 kubernetes.io/os=linux 26m
我是运行 GKE集群版本1.17.13-gke.1400。
我在我的集群中应用了以下网络策略 -
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny
namespace: default
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress
这应该会阻止在默认命名空间上进出 pods 的所有通信。 然而,事实并非如此。从这个测试中可以明显看出 -
$ kubectl run p1 -it --image google/cloud-sdk
root@p1:/# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=114 time=1.14 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=114 time=1.21 ms
^C
root@p1:/# curl www.google.com
<!doctype html><html itemscope=" ...
从 docs 看来,这个应用程序应该非常简单。 任何有助于理解我做错了什么的帮助,或进一步故障排除的提示,我们将不胜感激。
谢谢, 宁录,
要使网络策略生效,您的集群需要 运行 一个网络插件来执行它们。 Project Calico or Cilium 是这样做的插件。这不是创建集群时的默认设置!
所以首先,您应该检查您的集群是否按照 Google Cloud Network Policies docs 中的描述进行了相应设置。这是在 --enable-network-policy
标志后面以某种方式抽象出来的。
如果启用,您应该会在 kube-system
命名空间中看到一些 calico pods。
kubectl get pods --namespace=kube-system
如果有执行网络策略的插件,您需要确保在所需的命名空间中部署了网络策略 - 并检查您使用 kubectl run
的测试是否在该命名空间中执行,也。您可能在您的 kube 上下文中配置了一些其他命名空间,并且没有使用您的命令点击默认命名空间。
使用清单安装 Calico
将 Calico 清单应用到您的集群。这些清单在 kube-system 命名空间中创建了一个 DaemonSet。
kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-operator.yaml
kubectl apply -f https://raw.githubusercontent.com/aws/amazon-vpc-cni-k8s/master/config/master/calico-crs.yaml
查看 kube-system 命名空间中的资源。
kubectl get daemonset calico-node --namespace kube-system 输出
DESIRED 和 READY 列中的值应该匹配。为您返回的值与以下输出中的值不同。
NAME DESIRED CURRENT READY UP-TO-DATE 可用节点选择器年龄 calico-node 1 1 1 1 1 kubernetes.io/os=linux 26m