Kubernetes NetworkPolicy 只允许外部流量进入互联网



我试图在我的 kubernetes 集群中实施网络策略,以将我的 Pod 隔离在命名空间中,但仍允许它们访问互联网,因为我使用 Azure MFA 进行身份验证。

这是我尝试过的,但似乎无法让它工作。入口按预期工作,但这些策略会阻止所有出口。


apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress 
kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: grafana-policy
namespace: default
spec:
podSelector:
matchLabels: 
app: grafana
ingress:
- from:
- podSelector:
matchLabels: 
app: nginx-ingress

任何人都可以告诉我如何使上述配置工作,所以我也将允许互联网流量但阻止其他 POD 的流量?

尝试在命名空间上添加默认的拒绝所有网络策略:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress
- Egress

然后在以下位置添加允许互联网策略:

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
name: allow-internet-only
spec:
podSelector: {}
policyTypes:
- Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0
except:
- 10.0.0.0/8
- 192.168.0.0/16
- 172.16.0.0/20

这将阻止除互联网出站之外的所有流量。 在allow-internet-only策略中,所有专用 IP 都有一个例外,这将阻止 Pod 到 Pod 的通信。

如果需要 DNS 查找,还必须允许从kube-system出口到核心 DNS,因为default-deny-all策略将阻止 DNS 查询。

类似于@user100..应该做的事情,但您还需要允许DNS查找,如下所示。


egress:
# Allow communication to Kubernetes DNS service
- to:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: kube-system
- podSelector:
matchLabels:
k8s-app: kube-dns
ports:
- protocol: UDP
port: 53
# Allow internet access
- to:
- ipBlock: 
cidr: 0.0.0.0/0
# Exclude traffic to Kubernetes service IPs and pods
except:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16

除非有网络策略,否则 Kubernetes 将允许所有流量。 如果设置了网络策略,它将仅允许网络策略设置的流量,并拒绝其他所有流量。

默认情况下,Pod 是非隔离的;它们接受来自任何来源的流量。

Pod 通过具有选择它们的网络策略而被隔离。一旦命名空间中有任何网络策略选择了特定的 pod,该 Pod 将拒绝任何 NetworkPolicy 不允许的任何连接。(命名空间中未被任何网络策略选择的其他 Pod 将继续接受所有流量。

https://kubernetes.io/docs/concepts/services-networking/network-policies/#isolated-and-non-isolated-pods

因此,您还需要指定出口规则,以便它按照您想要的方式工作:)

你能这样试试吗?

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
spec:
podSelector: {}
policyTypes:
- Ingress,Egress
egress:
- to:
- ipBlock:
cidr: 0.0.0.0/0

它应该允许出口到所有目标。但是,如果目标是 pod,则应由同一 NetworkPolicy 的缺少入口规则阻止。

最新更新