[k8s实践]设置NetworkPolicy只允许同命名空间内的pod访问

3,405 阅读1分钟

理论准备

Kubernetes 在 1.3 引入了 Network Policy,Network Policy 提供了基于策略的网络控制,用于隔离应用并减少攻击面。它使用标签选择器模拟传统的分段网络,并通过策略控制它们之间的流量以及来自外部的流量。

目标

效果如图,但等下创建的资源会不同
4.gif

准备

确定已安装支持 NewworkPolicy 的网络组件

请确保集群已经安装了以下网络插件的一款 Calico Cilium Kube-router Romana Weave ,因为这些才支持网络策略 NetworkPolicy,具体参看官方文档
比如 cilium
image.png

创建被访问的测试对象

  1. 新创建一个命名空间 secondary
kubectl create namespace secondary
  1. 利用 nginx 镜像创建 pod,并开放成一个 service
kubectl run web --namespace secondary --image=nginx \
    --labels=app=web --expose --port 80

image.png

验证 pod 默认都是开放的

不同命名空间的 pod 访问

进入指定命名空间 default 的临时 pod,执行命令测试是否可访问

kubectl run test-$RANDOM --namespace=default --rm -it --image=alpine -- sh
# 在创建好 pod,进入 pod 中执行
wget -qO- --timeout=2 http://web.secondary

image.png

结论:可以访问

同一命名空间的 pod 访问

进入指定命名空间 secondary 的临时 pod,执行命令测试是否可访问

kubectl run test-$RANDOM --namespace=secondary --rm -it --image=alpine -- sh
wget -qO- --timeout=2 http://web.secondary

image.png

结论:可以互相访问

创建 NetworkPolicy,拒绝其他命名空间流量

kind: NetworkPolicy
apiVersion: networking.k8s.io/v1
metadata:
  namespace: secondary
  name: deny-from-other-namespaces
spec:
  podSelector:
    matchLabels:
  ingress:
  - from:
    - podSelector: {}

应用这个策略

kubectl apply -f deny-from-other-namespaces.yaml

image.png

重新验证

相同命名空间的 pod 访问

kubectl run test-$RANDOM --namespace=secondary --rm -it --image=alpine -- sh
wget -qO- --timeout=2 http://web.secondary

image.png
结论:可访问

不同命名空间的 pod 访问

kubectl run test-$RANDOM --namespace=default --rm -it --image=alpine -- sh
wget -qO- --timeout=2 http://web.secondary

image.png
结论:不可访问

收尾

清理现场

kubectl delete -f deny-from-other-namespaces.yaml
kubectl delete ns secondary

总结

这里关键有两点:

  1. 安装好支持网络策略的插件
  2. podSelector: 空的 podSelector 选择命名空间下的所有 Pod

参考