K8S NetworkPolicy网络策略介绍与实战
网络策略介绍
默认情况下,Kubernetes 集群网络没任何网络限制,Pod 可以与任何其他 Pod 通信,在某些场景下就需要进行网络控制,减少网络攻击面,提高安全性,这就会用到网络策略。
网络策略(Network Policy):是一个K8s资源,用于限制Pod出入流量,提供Pod级别和Namespace级别网络访问控制。
前置条件
网络策略通过网络插件 来实现。要使用网络策略,你必须使用支持 NetworkPolicy 的网络解决方案。 创建一个 NetworkPolicy 资源对象而没有控制器来使它生效的话,是没有任何作用的。
使用K8S网络策略有个前提:你的网络组件(CNI)必须支持网络策略,比如flannel是不支持网络策略,calico是支持网络策略的。
上面是在default命名空间下创建网络策略,网络策略分为这几块:
podSelector是目标pod,也就是基于default命名空间哪组pod去应用网络策略,policyType是进出流量,之后ingress是对进流量的限制,egress是出流量的限制。其实也就是针对标签为role=db这组pod对其进出流量都做限制,进流量172.17.0.0/16这个网端是可以访问的,但是除了172.17.1.0/24不能访问。同时还定义了网络命名空间和哪些标签的pod可以访问我,访问的端口为6379。
同时定义了出流量,针对role=db的pod只能访问10.0.0.0/24的5978这个端口。
所有策略都是交集的,没有优先级之分。
案例1:拒绝命名空间下所有Pod出入站流量
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all
namespace: test
spec:
podSelector: {} # 匹配本命名空间所有pod
policyTypes:
- Ingress
- Egress
# ingress和egress没有指定规则,则不允许任何
流量进出pod
网络命名空间在哪个namespace下面创建就限制哪个命名空间下的pod
kubectl run busybox --image=busybox -n test -- sleep 12h
kubectl exec busybox -n test -- ping baidu.com
kubectl run web --image=nginx -n test
kubectl run busybox --image=busybox -- sleep 12h
kubectl exec busybox -- ping 10.244.169.135
kubectl exec busybox -n test -- ping 10.244.169.135
案例2:拒绝其他命名空间Pod访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-all-namespaces
namespace: test
spec:
podSelector: {}
policyTypes:
- Ingress
ingress:
- from:
- podSelector: {} # 匹配本命名空间所有pod
[root@master networkpolicy]# kubectl get networkpolicy -n ms
NAME POD-SELECTOR AGE
deny-all-namespaces <none> 14s
This rule allows pods in the namespace 'ms' to receive traffic from all pods in the same namespace on all ports
案例3:允许其他命名空间Pod访问指定应用
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-all-namespaces
namespace: default
spec:
podSelector:
matchLabels:
app: web
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector: {} # 匹配所有命名空间的pod
案例4:同一个命名空间下应用之间限制访问
同一个命名空间下不同项目pod之间访问
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: app-to-app
namespace: test
spec:
podSelector:
matchLabels:
run: web
policyTypes:
- Ingress
ingress:
- from:
- podSelector:
matchLabels:
run: client1
ports:
- protocol: TCP
port: 80
需求:只允许指定命名空间中的应用访问和其他所有命名空间指定标签pod访问(注意这里有两个目标)
命名空间的匹配也是基于标签的 ,所有的匹配都是基于标签的包括命名空间。
[root@master ~]# kubectl get ns --show-labels
NAME STATUS AGE LABELS
default Active 35d kubesphere.io/namespace=default,kubesphere.io/workspace=system-workspace
ingress-nginx Active 22d app.kubernetes.io/name=ingress-nginx,app.kubernetes.io/part-of=ingress-nginx,kubesphere.io/namespace=ingress-nginx
kube-node-lease Active 35d kubesphere.io/namespace=kube-node-lease,kubesphere.io/workspace=system-workspace
kube-public Active 35d kubesphere.io/namespace=kube-public,kubesphere.io/workspace=system-workspace
kube-system Active 35d kubesphere.io/namespace=kube-system,kubesphere.io/workspace=system-workspace
kubesphere-alerting-system Active 35d kubesphere.io/namespace=kubesphere-alerting-system,kubesphere.io/workspace=system-workspace
kubesphere-controls-system Active 35d kubesphere.io/namespace=kubesphere-controls-system,kubesphere.io/workspace=system-workspace
kubesphere-monitoring-system Active 35d kubesphere.io/namespace=kubesphere-monitoring-system,kubesphere.io/workspace=system-workspace
kubesphere-system Active 35d kubesphere.io/namespace=kubesphere-system,kubesphere.io/workspace=system-workspace
ms Active 16d kubesphere.io/namespace=ms
openpitrix-system Active 35d kubesphere.io/namespace=openpitrix-system,kubesphere.io/workspace=system-workspace
具体实现如下
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: dev-web
namespace: dev
spec:
podSelector:
matchLabels:
env: dev
policyTypes:
- Ingress
ingress:
# 满足允许prod命名空间中的pod访问
- from:
- namespaceSelector:
matchLabels:
env: prod
# 允许pod标签为app=client1的pod访问,所有命名空间
- from:
- namespaceSelector: {}
podSelector:
matchLabels:
app: client1
限制某个命名空间下的某个pod访问
ingress:
- from:
- namespaceSelector:
matchLabels:
project: myproject
podSelector:
matchLabels:
role: frontend
ports:
- protocol: TCP
port: 6379
相关文章
- 从零开始入门 K8s | Kubernetes 网络模型进阶
- Centos7二进制部署k8s-v1.20.2 ipvs版本(controller-manager、kube-scheduler、kubelet)
- Centos7 k8s v1.5.2二进制部署安装-网络插件Flannel的安装
- 【课件】K8S NetworkPolicy网络策略详解
- 浅谈 K8S 网络模型CNI协议
- k8s节点标签:给worker打标签、给master打标签(默认就有)
- Spark on K8S 的几种模式
- k8s安装之服务器基础环境配置
- k8s架构和组件
- 【云原生 | Kubernetes 系列】1个POD2个container实现Wordpress K8s部署
- 【K8s】第1篇 一篇文章带你部署安装k8s集群(linux-arm64)
- k8s极简史:K8s多集群技术发展的历史、现状与未来
- k8s的service
- k8s的网络学习
- (2022版)一套教程搞定k8s安装到实战 | InitContainer
- 【云原生之kubernetes实战】使用helm在k8s集群下部署DataEase可视化分析平台
- k8s部署dashboard.及反向代理services(十一)
- k8s实现tomcat+mysql容器之间相互访问(九)
- k8s常用资源之pod资源(三)
- k8s-网络概念和etcd优化
- K8S中使用显卡GPU(N卡) —— 筑梦之路
- 【云原生 • Kubernetes】认识 k8s 网络、外部网络访问 k8s 内部服务
- Kubernetes(k8s)CNI(flannel)网络模型原理
- K8s 应用的网络可观测性: Cilium VS DeepFlow
- 【K8S系列】深入解析 k8s:入门指南(一)
- 【K8S系列】深入解析 k8s:入门指南(二)
- 【K8S系列】第十四讲:初识K8s架构之服务器的变迁
- 【K8S系列】第四讲:kubadm部署k8s时service-cidr网络和pod-network-cidr的地址如何定义
- k8s学习之路 | k8s 工作负载 Job
- k8s学习之路 | Day16 k8s 中的容器初探
- K8S集群Calico网络组件报错BIRD is not ready: BGP not established with