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

微信扫一扫,分享到朋友圈

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

理论准备

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

目标

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

准备

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

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

比如 cilium

创建被访问的测试对象

  1. 新创建一个命名空间 secondary
kubectl create namespace secondary
复制代码
  1. 利用 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
复制代码

总结

这里关键有两点:

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

参考

微信扫一扫,分享到朋友圈

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

关于数据库,程序员应该了解的那些事

上一篇

越努力越慌乱,心态崩盘步步错,如何避免考场焦虑?

下一篇

你也可能喜欢

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

长按储存图像,分享给朋友