如何检查网络策略是否已应用于 pod?

How to check if network policy have been applied to pod?

我试图限制我的 openvpn 以允许访问内部基础设施并仅通过 'develop' 命名空间来限制它,所以我从拒绝所有出口流量的简单策略开始,看不到任何效果或来自它被应用的集群,我已经阅读了所有官方文档和非官方文档,但没有找到解决方案,这是我的政策:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: policy-openvpn
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: openvpn
  policyTypes:
  - Egress
  egress: []

我已经使用 kubectl apply -f policy.yaml 命令应用了上面的网络策略,但我没有看到这个策略的任何效果,我仍然能够从我的 openvpn pod 连接到任何东西,如何调试它看看我的保单有什么问题?

对我来说这似乎是一个黑盒子,只能做尝试错误的方法,这似乎不是它应该如何工作的。

我如何验证它找到 pods 并将策略应用于它们?

我正在使用 GKE 提供的最新 kubernetes 集群

我注意到我没有在 google 云设置中检查 'use networkpolicy',检查后我的 vpn 就停止工作了,但我不知道如何检查,也不知道为什么 vpn只允许我连接并阻止所有网络请求,很奇怪,有没有办法调试而不是随机更改东西?

GKE 使用 calico 来实施网络策略。在应用网络策略之前,您需要为主节点和节点启用网络网络策略。您可以通过在 kube-system 命名空间中查找 calico pods 来验证是否启用了 calico。

kubectl get pods --namespace=kube-system

要验证网络策略,您可以查看以下命令。

kubectl get networkpolicy
kubectl describe networkpolicy <networkpolicy-name>

当您运行时,您可以检查用于 POD 选择器的标签:

k describe netpol <networkpolicy-name>
Name:         <networkpolicy-name>
Namespace:    default
Created on:   2020-06-08 15:19:12 -0500 CDT
Labels:       <none>
Annotations:  Spec:
  PodSelector:     app=nginx

Pod 选择器将显示此 netpol 也应用了哪些标签。 然后你可以通过以下方式显示所有带有此标签的 pods:

k get pods -l app=nginx
NAME                              READY   STATUS    RESTARTS   AGE
nginx-deployment-f7b9c7bb-5lt8j   1/1     Running   0          19h
nginx-deployment-f7b9c7bb-cf69l   1/1     Running   0          19h
nginx-deployment-f7b9c7bb-cxghn   1/1     Running   0          19h
nginx-deployment-f7b9c7bb-ppw4t   1/1     Running   0          19h
nginx-deployment-f7b9c7bb-v76vr   1/1     Running   0          19h

使用 netcat 调试(nc):

$ kubectl exec <openvpnpod> -- nc -zv -w 5 <domain> <port>

P.S:要拒绝所有出口流量,不需要将 spec.egress 键声明为空数组,但它影响相同:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  name: policy-openvpn
  namespace: default
spec:
  podSelector:
    matchLabels:
      app: openvpn
  policyTypes:
  - Egress

参考:https://kubernetes.io/docs/reference/kubernetes-api/policy-resources/network-policy-v1/

  • egress ([]NetworkPolicyEgressRule) ... If this field is empty then this NetworkPolicy limits all outgoing traffic (and serves solely to ensure that the pods it selects are isolated by default). ...