当前位置:网站首页>【云原生 | Kubernetes篇】Kubernetes 网络策略(NetworkPolicy)
【云原生 | Kubernetes篇】Kubernetes 网络策略(NetworkPolicy)
2022-06-12 12:49:00 【Lanson】
文章目录
Kubernetes 网络策略(NetworkPolicy)
Kubernetes 网络策略(NetworkPolicy)
网络策略(网络隔离策略)
指定Pod间的网络隔离策略,默认是所有互通。
Pod 之间互通,是通过如下三个标识符的组合来辩识的:
- 其他被允许的 Pods(例外:Pod 无法阻塞对自身的访问)
- 被允许的名称空间
- IP 组块(例外:与 Pod 运行所在的节点的通信总是被允许的, 无论 Pod 或节点的 IP 地址)
一、Pod隔离与非隔离
- 默认情况下,Pod网络都是非隔离的(non-isolated),可以接受来自任何请求方的网络请求。
- 如果一个 NetworkPolicy 的标签选择器选中了某个 Pod,则该 Pod 将变成隔离的(isolated),并将拒绝任何不被 NetworkPolicy 许可的网络连接。
二、规约
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: test-network-policy
namespace: default
spec:
podSelector: ## 选中指定Pod
matchLabels:
role: db
policyTypes: ## 定义上面Pod的入站出站规则
- 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: 6379
egress: ## 定义出站白名单
- to:
- ipBlock:
cidr: 10.0.0.0/24
ports:
- protocol: TCP
port: 5978- 基本信息: 同其他的 Kubernetes 对象一样,
NetworkPolicy需要apiVersion、kind、metadata字段 - spec:
NetworkPolicy的spec字段包含了定义网络策略的主要信息:- podSelector: 同名称空间中,符合此标签选择器
.spec.podSelector的 Pod 都将应用这个NetworkPolicy。上面的 Example中的 podSelector 选择了role=db的 Pod。如果该字段为空,则将对名称空间中所有的 Pod 应用这个NetworkPolicy - policyTypes:
.spec.policyTypes是一个数组类型的字段,该数组中可以包含Ingress、Egress中的一个,也可能两个都包含。该字段标识了此NetworkPolicy是否应用到 入方向的网络流量、出方向的网络流量、或者两者都有。如果不指定policyTypes字段,该字段默认将始终包含Ingress,当NetworkPolicy中包含出方向的规则时,Egress也将被添加到默认值。 - ingress:ingress是一个数组,代表入方向的白名单规则。每一条规则都将允许与
from和ports匹配的入方向的网络流量发生。例子中的ingress包含了一条规则,允许的入方向网络流量必须符合如下条件:- Pod 的监听端口为
6379 - 请求方可以是如下三种来源当中的任意一种:
- ipBlock 为
172.17.0.0/16网段,但是不包括172.17.1.0/24网段 - namespaceSelector 标签选择器,匹配标签为
project=myproject - podSelector 标签选择器,匹配标签为
role=frontend
- ipBlock 为
- Pod 的监听端口为
- egress:
egress是一个数组,代表出方向的白名单规则。每一条规则都将允许与to和ports匹配的出方向的网络流量发生。例子中的egress允许的出方向网络流量必须符合如下条件:- 目标端口为
5978 - 目标 ipBlock 为
10.0.0.0/24网段
- 目标端口为
- podSelector: 同名称空间中,符合此标签选择器
因此,例子中的 NetworkPolicy 对网络流量做了如下限制:
- 隔离了
default名称空间中带有role=db标签的所有 Pod 的入方向网络流量和出方向网络流量 - Ingress规则(入方向白名单规则):
- 当请求方是如下三种来源当中的任意一种时,允许访问
default名称空间中所有带role=db标签的 Pod 的6379端口:- ipBlock 为
172.17.0.0/16网段,但是不包括172.17.1.0/24网段 - namespaceSelector 标签选择器,匹配标签为
project=myproject - podSelector 标签选择器,匹配标签为
role=frontend
- ipBlock 为
- 当请求方是如下三种来源当中的任意一种时,允许访问
- Egress规则(出方向白名单规则):
- 当如下条件满足时,允许出方向的网络流量:
- 目标端口为
5978 - 目标 ipBlock 为
10.0.0.0/24网段
- 目标端口为
- 当如下条件满足时,允许出方向的网络流量:
三、to和from选择器的行为
NetworkPolicy 的 .spec.ingress.from 和 .spec.egress.to 字段中,可以指定 4 种类型的标签选择器:
- podSelector 选择与
NetworkPolicy同名称空间中的 Pod 作为入方向访问控制规则的源或者出方向访问控制规则的目标 - namespaceSelector 选择某个名称空间(其中所有的Pod)作为入方向访问控制规则的源或者出方向访问控制规则的目标
- namespaceSelector 和 podSelector 在一个
to/from条目中同时包含namespaceSelector和podSelector将选中指定名称空间中的指定 Pod。此时请特别留意 YAML 的写法,如下所示:
...
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
podSelector:
matchLabels:
role: client
...该例子中,podSelector 前面没有 - 减号,namespaceSelector 和 podSelector 是同一个 from 元素的两个字段,将选中带 user=alice 标签的名称空间中所有带 role=client 标签的 Pod。但是,下面的这个 NetworkPolicy 含义是不一样的:
...
ingress:
- from:
- namespaceSelector:
matchLabels:
user: alice
- podSelector:
matchLabels:
role: client
...后者,podSelector 前面带 - 减号,说明 namespaceSelector 和 podSelector 是 from 数组中的两个元素,他们将选中 NetworkPolicy 同名称空间中带 role=client 标签的对象,以及带 user=alice 标签的名称空间的所有 Pod。
前者是交集关系(且),后者是并集关系(或)
- ipBlock 可选择 IP CIDR 范围作为入方向访问控制规则的源或者出方向访问控制规则的目标。这里应该指定的是集群外部的 IP,因为集群内部 Pod 的 IP 地址是临时分配的,且不可预测。
集群的入方向和出方向网络机制通常需要重写网络报文的 source 或者 destination IP。kubernetes 并未定义应该在处理 NetworkPolicy 之前还是之后再修改 source / destination IP,因此,在不同的云供应商、使用不同的网络插件时,最终的行为都可能不一样。这意味着:
- 对于入方向的网络流量,某些情况下,你可以基于实际的源 IP 地址过滤流入的报文;在另外一些情况下,NetworkPolicy 所处理的 "source IP" 可能是 LoadBalancer 的 IP 地址,或者其他地址
- 对于出方向的网络流量,基于 ipBlock 的策略可能有效,也可能无效
四、场景
参考官网文档:
- 博客主页:https://lansonli.blog.csdn.net
- 欢迎点赞 收藏 留言 如有错误敬请指正!
- 本文由 Lansonli 原创,首发于 CSDN博客
- 停下休息的时候不要忘了别人还在奔跑,希望大家抓紧时间学习,全力奔赴更美好的生活
边栏推荐
- 配准后图像对比函数itk::CheckerBoardImageFilter
- Pytorch官方Faster R-CNN源代码解析(一)——特征提取
- Binary tree (thoughts)
- Theoretical knowledge of improved DH parameters and standard DH parameters of manipulator
- Installation of pagoda
- 检测vector是否有交集
- OpenMAX (OMX)框架
- 移动应用出海的“新大陆”
- B站分布式KV存储混沌工程实践
- R language Visual facet chart, hypothesis test, multivariable grouping t-test, visual multivariable grouping faceting bar plot, adding significance level and jitter points
猜你喜欢

Advanced C language -- storage of deep anatomical data in memory (with exercise)

Overview of embedded system 1- definition, characteristics and development history of embedded system

When to use binary search

用PyTorch进行语义分割

2022 ARTS|Week 23

Vant tab bar + pull-up loading + pull-down refresh demo van tabs + van pull refresh + van list demo

数组——双指针技巧秒杀七道数组题目

二叉树(构造篇)

提升管道效率:你需要知道如何识别CI/CD管道中的主要障碍

leetcode 47. Permutations II 全排列 II(中等)
随机推荐
【VIM】.vimrc配置,已经安装Vundle,YoucompleteMe
Eight misunderstandings are broken one by one (2): poor performance? Fewer applications? You worry a lot about the cloud!
Geek challenge 2021 Web
Newoj week 10 question solution
itk itk::BSplineDeformableTransform
什么时候运用二分搜索
unittest框架
Typescript and abstract classes
Binary tree (serialization)
Buu question brushing record - 5
嵌入式系统硬件构成-基于ARM的嵌入式开发板介绍
Differences and recommended uses of VaR, let and const (interview)
嵌入式系统概述3-嵌入式系统的开发流程和学习基础、方法
二叉树(纲领篇)
itk::SymmetricForcesDemonsRegistrationFilter
八大误区,逐个击破(2):性能差?应用程序少?你对云的这些担心很多余!
大一女生废话编程爆火!懂不懂编程的看完都拴Q了
Binary tree (construction)
Safety KNN
Brush questions [de1ctf 2019]shellshellshell