k8s中的网络策略主要分为原生 NetworkPolicy 和第三方网络插件提供的网络策略。本文将主要分析原生Networkpolicy的网络策略。

什么是网络策略

网络策略(NetworkPolicy)是一种关于 Pod 间及 Pod 与其他网络端点间所允许的通信规则的规范。NetworkPolicy 资源使用标签选择 Pod,并定义选定 Pod 所允许的通信规则。

k8s中的网络策略由实现了CNI接口的网络插件提供,网络插件监听集群中 NetworkPolicy 资源的创建/删除/更新事件生成对应的规则来控制 Pod 的流量是否放行。

常见的支持 NetworkPolicy 的网络插件有:

  • Calico
  • Cilium
  • Kube-router
  • Romana
  • Weave Net

默认情况下 Pod 间及 Pod 与其他网络端点间的访问是没有限制的。

如下是一个 NetworkPolicy 定义的例子,该策略的含义是阻止所有流量访问有app=web这个 label 的 Pod。

经常有人会问网络策略要怎么写,或者是这个网络策略代表了什么含义。笔者认为这个问题主要是因为使用者不了解网络策略的省缺行为。

NetworkPolicy 字段含义

NetworkPolicy 这个资源属于命名空间级别的,因此metadata 中的 namespace 不可省略,否则只会对default 命名空间下的满足条件的 Pod 生效。

下面介绍下 NetworkPolicy 中各字段的含义,并说明各字段省缺值及其含义,主要看 Spec 中的字段,
podSelector: 必填字段,Pod 的标签选择器,表示该网络策略作用于哪些 Pod。如果为空{}则表示选中本命名空间下所有 Pod。

policyTypes: 可选字段,字符串,策略规则类型, 表示该网络策略中包含哪些类型的策略,可选为"Ingress", "Egress", 或 "Ingress,Egress"。未填时,这个值依据下面的 ingress 和 egress 来定。如果该字段未设置且下面只出现了 ingress,则对 egress 不做限制。如果填了这个值,同时后续没有设定对应的规则,则认为设定的规则对应的流量全部禁止。例如:

该规则就限制了所有 Pod 的出流量。

ingress: 可选字段,数组,入站规则。互相间为或的关系,满足其中一条则放行。

ports: 可选字段,数组,放行端口信息。互相间为或的关系,如果为空表示端口不受约束,如果非空,则表示除了出现的端口放行,其他未指定的端口都禁止。
-port: 可选字段,数字,协议端口号。如果不写,表示协议所有端口。
-protocol: 可选字段,字符串,协议。允许取值为 TCP,UDP,SCTP。省缺为 TCP。

from: 可选字段,数组,放行源地址信息。互相间为或的关系,如果为空表示不约束源地址,如果非空,则表示除了出现的源地址放行外,其他源地址都禁止。
-ipBlock: 可选字段,放行 ip 段。
cidr: 标准 cidr,除了指定的cidr放行外其他都禁止。
except: 标准 cidr 字符串数组,表示前面cidr 中的放行的 cidr 段需要再排除掉 except 中指定的。

-namespaceSelector: 可选字段,namespace 的标签选择器,表示放行集群中的哪些命名空间中过来的流量。如果为空{}或未出现则表示选中所有命名空间。

-podSelector: 可选字段,Pod 的标签选择器,表示放行哪些 Pod 过来的流量,默认情况下从NetworkPolicy 同命名空间下的 Pod 中做筛选,如果前面设定了namespaceSelector则从符合条件的命名空间中的 Pod 中做筛选。如果为空{}则表示选中满足namespaceSelector 条件的所有 Pod。

egress: 可选字段,数组,出站规则。互相间为或的关系,满足其中一条就放行。

ports: 可选字段,数组,放行端口信息。互相间为或的关系,如果为空表示端口不受约束,如果非空,则表示除了出现的端口放行,其他未指定的端口都禁止。(详细字段同 ingress 中的 ports)

to: 可选字段,数组,放行目的地址信息。互相间为或的关系,如果为空表示不约束目的,如果非空,则表示除了出现的目的地址放行外,其他目的地址都禁止。(详细字段同ingress 中的 from)

介绍完 Spec 中各字段的含义及其默认行为后,做个简单的小结,NetworkPolicy 定义了放行规则,规则间是或的关系,只要命中其中一条规则就认为流量可以放行。

下面以一个kubernetes官网中的例子来回顾下前面的知识。

首先该规则指定了命名空间为 default, 选择了其中所有包含 role=db 这个 label 的 Pod,定义了入站流量规则与出站流量规则。

对于入站流量,放行源地址来自 cidr 172.17.0.0/16 除了 172.17.1.0/24 之外的流量,放行来自有project=myproject 这个label的namespace中的流量,放行 default 命名空间下有 label role=frontend 的 Pod 的流量,并限定这些流量只能访问到 role=db 这个 label 的 Pod 的 TCP 6379端口。

对于出站流量,只放行其访问目的地址属于 cidr 10.0.0.0/24 中,且端口为 TCP 5978的流量。

需要注意的是 NetworkPolicy 选中的 Pod 只能是与 NetworkPolicy 同处一个 namespace 中的 Pod,因此对于有些规则可能需要在多个命名空间中分别设置。或者使用非原生的网络策略定义,例如 Calico 中的 GlobalNetworkPolicy。

NetworkPolicy 变更历史

v1.6 以及以前的版本需要在 kube-apiserver 中开启 extensions/v1beta1/networkpolicies;

v1.7 版本 Network Policy 已经 GA,API 版本为 networking.k8s.io/v1;

v1.8 版本新增 Egress 和 IPBlock 的支持;

附录

  • 推荐观看Securing Cluster Networking with Network Policies - Ahmet Balkan, Google
  • 一些常见的策略样例ahmetb/kubernetes-network-policy-recipes

浅析 Kubernetes原生NetworkPolicy 网络策略,让更安全的容器运行环境唾手可得相关推荐

  1. 关于 Kubernetes中NetworkPolicy(网络策略)方面的一些笔记

    写在前面 学习k8s遇到整理笔记 博文内容主要涉及 Kubernetes网络策略理论简述 K8s中网络策略方式:egress和ingress的Demo ipBlock,namespaceSelecto ...

  2. 关于 kubernetes网络(CNI规范)中Calico,NetworkPolicy(网络策略)方面的一些笔记

    写在前面 学习k8s遇到整理笔记 博文内容主要涉及 K8s网络理论体系简述 K8s中Calico网络方案容器跨主机通信过程Demo K8s中Calico的实现方案 K8s中网络策略方式:egress和 ...

  3. 7-4 NetworkPolicy网络策略简介与Ingress及Egress案例

    文章目录 前言 准备工作 linux命名空间 python命名空间 Ingress策略 podSelector podSelector-SinglePort podSelector-MultiPort ...

  4. 轻量级Kubernetes之k3s:2:使用docker作为容器运行环境

    缺省安装的k3s使用的是containerd作为容器运行环境,如果希望使用Docker作为容器运行环境,只需要在安装时通过环境变量INSTALL_K3S_EXEC指定--docker即可.这篇文章具体 ...

  5. 云原生爱好者周刊:比 runc 更神奇的容器运行时 - Sysbox

    云原生一周动态要闻: Flant 宣布推出容器平台 Deckhouse 的开源版本 Chaos Mesh 2.0 发布 Cloud Foundry 更新 PaaS 环境 Spectro Cloud 宣 ...

  6. Kubernetes Egress 网络策略指南

    作者:Viswajith Venugopal 翻译:Bach(才云) 校对:bot(才云).星空下的文仔(才云) Kubernetes 中的网络策略用于指定 Pod 组之间以及其与外部网络端点之间的通 ...

  7. Kubernetes之(十七)网络模型和网络策略

    目录 Kubernetes之(十七)网络模型和网络策略 Kubernetes网络模型和CNI插件 Docker网络模型 Kubernetes网络模型 Flannel网络插件 Direct routin ...

  8. K8s的网络模型和网络策略

    K8s的网络模型和网络策略_路---的博客-CSDN博客_k8s网络模式 1.Kubernetes网络模型和CNI插件 在Kubernetes中设计了一种网络模型,要求无论容器运行在集群中的哪个节点, ...

  9. 深入理解Kubernetes网络策略

    [编者的话]当我们逐渐向着微服务.云原生迈进的时候,传统静态的.相对简单的网络安全策略开始显得吃力. Kubernetes 的 Network Policy 特性正是来解决这个问题的.在刚刚出炉不久的 ...

最新文章

  1. linux孤立cpu,Linux 抛弃旧款 CPU,一下子少 50 万行代码
  2. MySQL中的子查询
  3. mysql 5.7.9_MySQL5.7.9免安装版配置方法
  4. BUUCTF-pwn2_sctf_2016(整数溢出+泄露libc)
  5. 周至四中计算机老师,周至县第四中学顺利承办周至县 “教育信息化技术与教学课堂深度融合交流研讨会”...
  6. java 并发_Java并发编程中断机制 so easy
  7. iOS 新浪微博-5.3 首页微博列表_集成图片浏览器
  8. ubuntu14安卓phalcon
  9. vcredist_x86.exe 静默安装方法
  10. CDN技术详解(电子书)下载链接
  11. 游戏多开检测的几种实现方法及破解方法参考
  12. RFID电子标签对于图书管理的应用
  13. 数据压缩_任务五_预测误差均方值推导及最小二乘法
  14. win10关机后cpu风扇还在转_win10关机风扇一直转 指示灯亮怎么办_win10关机风扇还转指示灯亮的解决方法...
  15. 腾讯视频播放插件Txplayer的使用
  16. 自制Java大学英语四级成绩计算器
  17. C++程序中如何执行cmd命令
  18. 八种点云聚类方法(二)— KMeans
  19. 保研面试/考研复试 可能用到的英语口语整理()
  20. 计算机打字怎么分行,微信打字怎么换行

热门文章

  1. 2021年日历记事备忘录(A4可打印版)
  2. 现代密码学导论-2-古典密码及其密码分析
  3. platform总线
  4. CocosCreator优化之DrawCall漫谈
  5. 14天内购买iPad1代可退100美元或退货
  6. 小程序主体为个人的教育类小程序备案——教育APP备案问题
  7. Epson L4158打印机安装与配置
  8. 2021年塔式起重机司机最新解析及塔式起重机司机考试试卷
  9. sqlmap超详细使用说明书
  10. 策略模式及简单Java案例代码实现