理论准备
Kubernetes 在 1.3 引入了 Network Policy,Network Policy 提供了基于策略的网络控制,用于隔离应用并减少攻击面。它使用标签选择器模拟传统的分段网络,并通过策略控制它们之间的流量以及来自外部的流量。
目标
准备
确定已安装支持 NewworkPolicy 的网络组件
请确保集群已经安装了以下网络插件的一款 Calico Cilium Kube-router Romana Weave ,因为这些才支持网络策略 NetworkPolicy,具体参看官方文档。
比如 cilium:
创建被访问的测试对象
- 新创建一个命名空间
secondary
kubectl create namespace secondary
- 利用 nginx 镜像创建 pod,并开放成一个 service
kubectl run web --namespace secondary --image=nginx \
--labels=app=web --expose --port 80
验证 pod 默认都是开放的
不同命名空间的 pod 访问
进入指定命名空间 default 的临时 pod,执行命令测试是否可访问
kubectl run test-$RANDOM --namespace=default --rm -it --image=alpine -- sh
# 在创建好 pod,进入 pod 中执行
wget -qO- --timeout=2 http://web.secondary
结论:可以访问
同一命名空间的 pod 访问
进入指定命名空间 secondary 的临时 pod,执行命令测试是否可访问
kubectl run test-$RANDOM --namespace=secondary --rm -it --image=alpine -- sh
wget -qO- --timeout=2 http://web.secondary
结论:可以互相访问
创建 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
重新验证
相同命名空间的 pod 访问
kubectl run test-$RANDOM --namespace=secondary --rm -it --image=alpine -- sh
wget -qO- --timeout=2 http://web.secondary
不同命名空间的 pod 访问
kubectl run test-$RANDOM --namespace=default --rm -it --image=alpine -- sh
wget -qO- --timeout=2 http://web.secondary
结论:不可访问
收尾
清理现场
kubectl delete -f deny-from-other-namespaces.yaml
kubectl delete ns secondary
总结
这里关键有两点:
- 安装好支持网络策略的插件
- podSelector: 空的 podSelector 选择命名空间下的所有 Pod