我有3个Kubernetes部署和每个部署的服务(namespace = firstspace)。每个部署按顺序标记为app1、app2、app3。
以执行如下命令为例。我将得到第一个pod作为结果。
kubectl get pods -l app=app1 --namespace firstspace
我的目标是使用以下网络策略限制第三个pod (app=app3)的入口访问,只允许来自第二个pod (app=app2)和来自另一个命名空间& secondspace&;的任何pod的流量。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: ingress-app3
namespace: firstspace
spec:
podSelector:
matchLabels:
app: app3
ingress:
- from:
- namespaceSelector:
matchLabels:
name: secondspace
- podSelector:
matchExpressions:
- {key: app, operator: In, values: [app2]}
policyTypes:
- Ingress
然而,当我将网络策略部署到"firstspace"命名空间,我仍然可以使用第一个pod (app=app1) curl(并获得样例JSON响应)第三个pod (app=app3)的服务。
下面是一个示例命令。这里,10.100.150.0是为第三个pod创建的服务的ClusterIP。
kubectl exec app1-849b94c6df-rzdls --namespace firstspace-- curl -sL 10.100.150.0:8080/testendpoint
有人能帮我理解我在这里做错了什么吗?
经过一些尝试和错误之后,我观察到以下情况。根据Kubernetes网络策略文档,部署的网络策略只有在Kubernetes集群中安装了网络插件时才有效。
由于我的本地minikube集群没有网络插件,我在问题描述中提到的网络策略无效。
在我的minikube集群中安装Cillium Network Plugin后,网络策略正常工作。
指出:
- Cillium Network Plugin在minikube上使用
docker
作为驱动程序时安装不成功。但是当选择hyperv
作为驱动程序时,它可以工作。 - 我必须为带有app=app2标签的pod创建一个出口策略,以允许来自带有app=app3标签的pod的出口流量(参见下面的示例)。
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: egress-app2
namespace: firstspace
spec:
podSelector:
matchLabels:
app: app2
egress:
- to:
- podSelector:
matchLabels:
app: app3
policyTypes:
- Egress