网络策略NetworkPolicy
网络策略
在 Kubernetes 里,网络隔离能力的定义,是依靠一种专门的 API 对象来描述的,即: NetworkPolicy。
Kubernetes 里的 Pod 默认都是“允许所有”(Accept All)的,即:Pod 可以接收来自任何发送方的请求;或者,向任何接收方发送请求。而如果要对这个情况作出限制,就必须通过 NetworkPolicy 对象来指定。
一个完整的NetworkPolicy对象示例如下所示:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector:
matchLabels:
role: db
policyTypes:
- Ingress
- Egress
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
- ports:
- protocol: TCP
port: 80
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
与所有其他的 Kubernetes 资源对象一样,NetworkPolicy 需要 apiVersion、kind 和 metadata 字段,我们通过 spec.podSelector 字段定义这个 NetworkPolicy 的限制范围,因为 NetworkPolicy 目前只支持定义 ingress 规则,所以这里的 podSelector 本质上是为该策略定义 “目标pod”, 比如我们这里 matchLabels:role=db 表示的就是当前 Namespace 里携带了 role=db 标签的 Pod。而如果把 podSelector 字段留空:
spec:
podSelector: {}
那么这个 NetworkPolicy 就会作用于当前 Namespace 下的所有 Pod。
每个 NetworkPolicy 包含一个 policyTypes 列表,可以是 Ingress、Egress 或者两者都包含,该字段表示给当前策略是否应用于所匹配的 Pod 的入口流量、出口流量或者二者都包含,如果没有指定 policyTypes,则默认情况下表示 Ingress 入口流量,如果配置了任何出口流量规则,则将指定为 Egress。
一旦 Pod 被 NetworkPolicy 选中,那么这个 Pod 就会进入“拒绝所有”(Deny All)的状态,即:这个 Pod 既不允许被外界访问,也不允许对外界发起访问。
比如上面示例表示的是该隔离规则只对 default 命名空间下的,携带了 role=db 标签的 Pod 有效。限制的请求类型包括 ingress(流入)和 egress(流出)。
ingress: 每个 NetworkPolicy 包含一个 ingress 规则的白名单列表。其中的规则允许同时匹配 from 和 ports 部分的流量。比如上面示例中我们配置的入口流量规则如下所示:
ingress:
- from:
- ipBlock:
cidr: 172.17.0.0/16
except:
- 172.17.1.0/24
- namespaceSelector:
matchLabels:
project: myproject
- podSelector:
matchLabels:
role: frontend
- ports:
- protocol: TCP
port: 80
这里的 ingress 规则中我们定义了 from 和 ports,表示允许流入的白名单和端口,Kubernetes 会拒绝任何访问被隔离 Pod 的请求,除非这个请求来自于以下“白名单”里的对象,并且访问的是被隔离 Pod 的端口。而这个允许流入的白名单中指定了三种并列的情况,分别是:ipBlock、namespaceSelector 和 podSelector:
- default 命名空间下面带有
role=frontend标签的 Pod - 带有
project=myproject标签的 Namespace 下的任何 Pod - 任何源地址属于
172.17.0.0/16网段,且不属于172.17.1.0/24网段的请求。
egress: 每个 NetworkPolicy 包含一个 egress 规则的白名单列表。每个规则都允许匹配 to 和 port 部分的流量。比如我们这里示例规则的配置:
egress:
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978
表示 Kubernetes 会拒绝被隔离 Pod 对外发起任何请求,除非请求的目的地址属于 10.0.0.0/24 网段,并且访问的是该网段地址的 5978 端口。
安装Calico
要让网络策略生效,就需要特定的网络插件支持,目前已经实现了 NetworkPolicy 的网络插件包括 Calico、Weave 和 kube-router 等项目,但是并不包括 Flannel 项目。
所以说,如果想要在使用 Flannel 的同时还使用 NetworkPolicy 的话,就需要再额外安装一个网络插件,比如 Calico 项目,来负责执行 NetworkPolicy。由于我们这里使用的是 Flannel 网络插件,所以首先需要安装 Calico 来负责网络策略。
详细可以参考官方文档:https://projectcalico.docs.tigera.io/getting-started/kubernetes/flannel/flannel
首先确定 kube-controller-manager 配置了如下的两个参数:
......
spec:
containers:
- command:
- kube-controller-manager
- --allocate-node-cidrs=true
- --cluster-cidr=10.244.0.0/16
......
下载需要使用的资源清单文件:
$ curl https://docs.projectcalico.org/manifests/canal.yaml -O
如果之前配置的 pod CIDR 就是 10.244.0.0/16 网段,则可以跳过下面的配置,如果不同则可以使用如下方式进行替换:
$ POD_CIDR="<your-pod-cidr>" \
$ sed -i -e "s?10.244.0.0/16?$POD_CIDR?g" canal.yaml
最后直接安装:
$ kubectl apply -f canal.yaml
测试
首先我们准备两个待测试的Pod:
apiVersion: v1
kind: Pod
metadata:
name: test-np
spec:
containers:
- name: test-np
image: nginx:1.17.1
---
apiVersion: v1
kind: Pod
metadata:
name: busybox
spec:
containers:
- name: busybox
image: busybox:1.30
command: ["/bin/sh","-c","sleep 86400"]
直接创建这两个pod:
$ kubectl apply -f test-np.yaml
pod/test-np unchanged
pod/busybox configured
$ kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED ...
busybox 1/1 Running 0 3m38s 10.244.2.3 node1 <none> ...
test-np 1/1 Running 0 3m38s 10.244.1.6 node2 <none> ...
我们使用busybox来访问test-np,在没有加任何网路策略的情况下,测试是否能正常请求:
$ kubectl exec -it busybox ping 10.244.1.6
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
PING 10.244.1.6 (10.244.1.6): 56 data bytes
64 bytes from 10.244.1.6: seq=0 ttl=62 time=0.642 ms
64 bytes from 10.244.1.6: seq=1 ttl=62 time=0.536 ms
64 bytes from 10.244.1.6: seq=2 ttl=62 time=0.981 ms
......
这时候我们添加上面的网络策略,同时给test-np打上role=db的标签:
$ kubectl label pod test-np role=db --overwrite
pod/test-np labeled
$ kubectl get networkpolicy
kubectl get networkpolicy
NAME POD-SELECTOR AGE
test-network-policy role=db 10s
这时候test-np这个Pod就匹配了网络策略,由于匹配了网络策略的就会拒绝所有的网络请求,需要通过白名单来进行开启请求,但是busybox这个Pod 明显没有在白名单之中,所以应该会拒绝网络请求:
kubectl exec -it busybox ping 10.244.1.6
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
PING 10.244.1.6 (10.244.1.6): 56 data bytes
^C
--- 10.244.1.6 ping statistics ---
8 packets transmitted, 0 packets received, 100% packet loss
command terminated with exit code 1
那么现在我想让busybox能正常请求test-np这个pod,我们来看test-np绑定的网路策略中的白名单,第一条我们明显不符合要求,第二条将busybox转移标签 project=myproject 的 Namespace 下面,这个实现也不是特别容器,接着我们来看第三条,带有role=frontend这个标签的Pod就可以访问,那么我们就可以直接给我busybox打上这个标签:
$ kubectl label pod busybox role=frontend --overwrite
pod/busybox labeled
接着我们继续请求test-np,这次应该可以成功:
kubectl exec -it busybox ping 10.244.1.6
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl kubectl exec [POD] -- [COMMAND] instead.
PING 10.244.1.6 (10.244.1.6): 56 data bytes
64 bytes from 10.244.1.6: seq=0 ttl=62 time=0.519 ms
64 bytes from 10.244.1.6: seq=1 ttl=62 time=0.761 ms
64 bytes from 10.244.1.6: seq=2 ttl=62 time=1.682 ms
64 bytes from 10.244.1.6: seq=3 ttl=62 time=0.432 ms
......
网络策略NetworkPolicy的更多相关文章
- Kubernetes之canal的网络策略(NetworkPolicy)
安装要求: 1.我们这里安装的是3.3的版本.kubernetes的要求: 支持的版本 1.10 1.11 1.12 2.CNI插件需要启用,Calico安装为CNI插件.必须通过传递--networ ...
- NetworkPolicy网络策略以及举例说明
网络策略(NetworkPolicy)是一种关于pod间及pod与其他网络端点间所允许的通信规则的规范.NetworkPolicy 资源使用标签选择pod,并定义选定pod所允许的通信规则. 前提 网 ...
- canel的网络策略
资源: https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/flannel 基于pod Egress ...
- kubernetes学习笔记之十三:基于calico的网络策略入门
一..安装calico [root@k8s-master01 ~]# kubectl apply -f https://docs.projectcalico.org/v3.3/getting-star ...
- Kubernetes学习之路(二十一)之网络模型和网络策略
目录 Kubernetes的网络模型和网络策略 1.Kubernetes网络模型和CNI插件 1.1.Docker网络模型 1.2.Kubernetes网络模型 1.3.Flannel网络插件 1.4 ...
- Calico网络策略实践
因为Kubernetes官方用的flannel无法实现多租户环境下的网络隔离,建立起来的pod之间实际可以相互访问,而Calico可以实现,因此周末找个时间试了一下大概的过程. 前面的kubernet ...
- k8s基于canel的网络策略
Kubernetes能够把集群中不同Node节点上的Pod连接起来,并且默认情况下,每个Pod之间是可以相互访问的.但在某些场景中,不同的Pod不应该互通,这个时候就需要进行访问控制.亲测:在kube ...
- k8s-基于canel的网络策略-十九
一.前提 上一节学习了flannel,但是我们应该了解flannel只能提供网络通讯,而不能提供网络策略.因此,我们本节学习canal,让它来提供网络策略,来配合flannel使用. canal是ca ...
- Kubernetes 学习19基于canel的网络策略
一.概述 1.我们说过,k8s的可用插件有很多,除了flannel之外,还有一个流行的叫做calico的组件,不过calico在很多项目中都会有这个名字被应用,所以他们把自己称为project cal ...
- k8s之网络插件flannel及基于Calico的网络策略
1.k8s网络通信 a.容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现; b.pod之间的通信:pod ip <---> pod ip,pod和pod之间不经过任何转换即可 ...
随机推荐
- ohpm : 无法将“ohpm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
ohpm : 无法将"ohpm"项识别为 cmdlet.函数.脚本文件或可运行程序的名称. 造成该问题有两个: 没有配置好 ohpm 的环境变量. 没有配置好 PowerShell ...
- SetupFactory-脚本
1.写注册表 lResult = Registry.DoesKeyExist(HKEY_LOCAL_MACHINE, "SOFTWARE\\MapInfo\\MapX\\5.0") ...
- 项目管理知识体系指南(PMBOK 指南)
项目管理知识体系指南(PMBOK 指南) 第6版--笔记项目管理十大知识领域,五大管理过程组,49个过程.如下表格:项目:项目的定义 : (Project Management Institute)项 ...
- Delphi 中拖动无边框窗口的5种方法
1.MouseMove事件中加入: // ReleaseCapture; // Perform(WM_SYSCOMMAND, $F017 , 0); 2.MouseDown事件中加入: // POST ...
- Delphi 判断当前系统是否64位
uses Winapi.Windows; function IsWin64: Boolean; var IsWow64Process: function(Handle: THandle; var Re ...
- osmts:OERV之一站式管理测试脚本
最近团队里面实习的小伙伴开发了一个新的项目,可以用来一键式运行各种测试脚本并且完成数据总结,我也尝试部署了一下,遇到了一些问题,接下来一起解析一下这个项目. 首先是获取osmts git cl ...
- String常见面试题
第一题:打印的结果是true还是false呢? 在之前我们就说过这题,执行s1时,检查字符串常量池,发现没有"abc",于是创建"abc",执行s2时,接着检查 ...
- 【Linux】5.4 Shell数组
Shell数组 数组中可以存放多个值.Bash Shell 只支持一维数组(不支持多维数组),初始化时不需要定义数组大小(与 PHP 类似). 1. 数组赋值 与大部分编程语言类似,数组元素的下标由0 ...
- android中大咖:TlistView
d的android中的Tlistview相当于cxGrid,其开发使用中的主咖地位至高无上. 可是如何高效使用快速实现的需求呢?需要的话补官方的教程 上图: GOODLUCK!
- 学习Kotlin语法(二)
简介 经过上一章节,我们对Kotlin基础语法有了大致的了解,了解了什么是基本类型.集合.控制流程.函数.类.空安全,接下来我们将更近一步的去了解Kotlin的相关知识,本章节将详细的学习Kotlin ...