k8s网络策略

news2024/11/18 11:21:47

网络策略介绍

网络策略官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/

网络策略是控制Pod之间如何进行通信的规则,它使用标签来筛选Pod,并在该组Pod之上定义规则来定义管控其流量,从而为k8s提供更精细的流量控制和租户隔离机制。管理员和用户可以通过NetworkPolicy资源按需定义网络访问控制策略

网络策略的具体实现要依靠CNI网络插件完成,例如Calico、Weave和Antrea等。因此,仅在使用支持网络策略的网络插件时才能让自定义的网络策略生效。不同的网络插件实现网络策略的方式也是不一样的。

本文以Calico网络插件为例,它的calico-kube-contollers是用于将用户自定义的网络策略进行实现的组件,它主要依赖于在节点上构建iptales规则实现访问控制功能。

默认情况下,k8s并未对Pod的流量做任何限制。Pod对象能够与集群上其他任何Pod通信,也能够与集群外部的网络端点通信。NetworkPolicy是名称空间级别资源,允许用户在通过标签选择器筛选的一组Pod上分别管理入站(Ingress)和出站(Egress)流量。将NetworkPolicy应用到名称空间中后,被标签选择器选中的Pod将默认拒绝所有流量,仅放行由NetworkPolicy资源明确允许的流量。未被NetworkPolicy资源的标签选择器选中的Pod对象的流量则不受影响。

NetworkPolicy是Kubernetes API中标准的资源类型,它的部署文件常用字段如下:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: ...
  namespace: ...
spec:
  podSelector: <Object>	#Pod标签选择器,用来在当前名称空间下筛选出一组Pod,之后定义的出入站规则对此组Pod生效
  policyTypes: <[]string>	#网络策略类型,Ingress表示对入站流量限制;Egress表示对出站流量限制,同时提供表示都限制
  ingress:	#允许通过的入站流量的规则定义,空值表示允许所有的入站流量通过
  - from:	#允许通过的入站流量的源端点列表,空值表示所有端点
    - ipBlock:	#用IP地址范围匹配源端点,不能与下面的namespacesSelector和podSelector同时使用
        cidr: <string>		#源端点的IP网段
        except: <[]string>	#从cidr中排除的网段范围或地址,这些源端点不能访问指定的Pod
      namespacesSelector: <Object>	#由标签选择器筛选的名称空间中的端点,空值表示所有名称空间
      podSelector: <Object>		#由标签选择器筛选的Pod端点,空值表示none
    ports: <[]Object>	#入站流量的目标端口列表,空值表示所有端口
  egress:	#允许通过的出站流量的规则定义,空值表示允许所有出站流量通过
  - to: <[]Object>	#允许出站流量访问的目标端点对象列表,空值表示所有端点,可嵌套字段通ingress.from
    ports: <[]Object>	#允许出站流量访问的目标端口对象列表,空值表示所有端口

为了方便理解NetworkPolicy资源及其功能,常用的术语如下:

  • Pod组:由NetworkPolicy通过标签选择器筛选出的一组Pod,它们是网络策略规则管控的目标
  • Egress规则:出站流量相关的规则,负责管控选定的Pod组发往其它端点的流量,可由流量的目标端点(spec.egress.to)和目标端口(spec.egress.ports)来定义
  • Ingress规则:入站流量的相关规则,负责管控选定的Pod组所能接收的流量,可由流量的源端点(spec.ingress.from)和流量的目标端口(spec.ingress.ports)来定义
  • 对端端点:与选定的Pod组交互的对端主机,可以由CIDR格式的地址段(ipBlock)来匹配指定地址段内的Pod对象、名称空间选择器(namespacesSelector)来匹配名称空间内的所有Pod对象,也可以结合Pod选择器(podSelector)在指定名称空间选出一组Pod对象

在Ingress规则中,由from字段指定的端点称为源端点;而在Egress规则中,网络端点也称为目标端点,用to字段标识。对于未启用Ingress或Egress规则的Pod组,出站和入站流量默认均为允许。一旦在networkpolicy.spec中定义了ingress或egress字段,则它们的from或to字段就代表白名单列表,空值意味着选定所有端点,即允许相应方向上所有流量通过,此时ingress和egress字段作用与未启用流量方向设置(即spec.policyTypes字段为空)时相同。

Ingress和Egress的生效逻辑略微复杂,Egress规则生效逻辑和Ingress类似,以Ingress规则为例:

  1. 定义了spec.policyTypes值为Ingress,但未定义spec.ingress字段时,它无法匹配任何流量,因此选定的Pod组不接受任何端点访问
  2. 定义了spec.policyTypes值为Ingress,但使用空值的spec.ingress或spec.ingress.from字段,表示匹配所有的端点,因而选出的Pod组可以被任意端点访问
  3. 最后,即使Egress规则拒绝所有流量,但由Ingress规则放行的请求流量的响应报文依然能够正常出站,它并不受限于Egress规则的限制,反之亦然

Ingress规则

在实际环境中,有些Pod提供的服务不需要或不能公开给所有人访问,这时候就需要对它们施加访问控制。在需要管控的Pod对象所在的名称空间创建一个NetworkPolicy资源,使用spec.podSelector筛选要管控的Pod,并使用spec.ingress定义入站规则就实现入站流量管控。

spec.ingress可嵌套的from和ports均为可选字段,空值表示允许所有入站流量通过。仅定义from字段时表示入站流量的目标端口不做限制,仅定义ports字段时表示入站流量的源端点不做限制。from和ports定义在一个列表项时,它们是逻辑与关系,表示匹配那些同时满足from和ports的入站流量

  • ingress.from字段
    from字段的值是一个列表,用于指定访问目标Pod组入站流量的来源,可嵌套使用ipBlock、namespaceSelector和podSelector 3个字段。这3个字段匹配Pod的方式各有不同,且ipBlock不能和另外两个字段同时使用,同时使用namespaceSelector和podSelector这两个字段时它们是逻辑与关系。from下的多个列表项是逻辑或关系,入站流量只要能匹配其中一个就可以。
    • ipBlock:根据IP地址或网络地址来匹配源端点
    • namespaceSelector:使用标签选择器筛选名称空间,它将匹配筛选出的名称空间内的所有Pod对象;空值表示匹配所有名称空间,即源端点可以是集群上的任意Pod对象
    • podSelector:在NetworkPolicy资源所在的名称空间中基于标签选择器筛选Pod对象,空值表示选中当前名称空间所有Pod对象。与namespaceSelector同时使用时,作用域为namespaceSelector筛选出的名称空间
  • ingress.ports 字段
    ports字段的值也是一个对象列表,用于定义入站流量可以访问的目标端口,可以嵌套使用port和protocol字段
    • port:端口号或在container上定义的端口名称,未定义时匹配所有端口
    • protocol: 协议,TCP或UDP,默认TCP

下面创建一些资源,用来后续测试网络策略的功能,包括两个名称空间project1和project2,在project1名称空间下部署一个nginx和tomcat,在project名称空间下部署一个nginx,部署文件如下:

apiVersion: v1
kind: Namespace
metadata:
  name: project1
  labels:
    name: project1

---
apiVersion: v1
kind: Namespace
metadata:
  name: project2
  labels:
    name: project2

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-project1
  namespace: project1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
      project: project1
  template:
    metadata:
      labels:
        app: nginx
        project: project1
        tier: fronted
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - name: http
          containerPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: tomcat-project1
  namespace: project1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: tomcat
      project: project1
      tier: backend
  template:
    metadata:
      labels:
        app: tomcat
        project: project1
        tier: backend
    spec:
      containers:
      - name: tomcat
        image: tomcat:10.1.2
        ports:
        - name: http
          containerPort: 8080

---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc-project1
  namespace: project1
spec:
  type: NodePort
  selector:
    app: nginx
    project: project1
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP

---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-project2
  namespace: project2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
      project: project2
  template:
    metadata:
      labels:
        app: nginx
        project: project2
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - name: http
          containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-svc-project2
  namespace: project2
spec:
  type: NodePort
  selector:
    app: nginx
    project: project2
  ports:
  - name: http
    port: 80
    targetPort: 80
    protocol: TCP

在这里插入图片描述

示例1

限定指定的标签的Pod才能访问project1名称空间下的tomcat pod

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy-demo1
  namespace: project1
spec:
  policyTypes: ["Ingress"]
  podSelector:	#规则针对tomcat Pod生效
    matchLabels:
      app: tomcat
      project: project1
      tier: backend
  ingress:
  - from:
    - podSelector:	#拥有下面指定标签的Pod才能访问tomcat Pod,默认是在当前名称空间下筛选
        matchLabels:
          app: nginx
          project: project1
          tier: fronted
    ports:		#只能访问tomcat Pod的8080端口
    - port: 8080
      protocol: TCP

查看networkpPolicy资源
在这里插入图片描述
用同名称空间下nginx pod访问tomcat Pod,可以访问,因为nginx pod的标签符合NetworkPolicy的设定
在这里插入图片描述

在default名称空间中使用clinet-pod访问project1名称空间下的tomcat,无法访问,因为client-pod的标签不符合NetworkPolicy的设定
在这里插入图片描述

示例2

通过ip地址限定可以访问tomcat的Pod

kind: NetworkPolicy
metadata:
  name: network-policy-demo2
  namespace: project1
spec:
  policyTypes: ["Ingress"]
  podSelector:
    matchLabels:
      app: tomcat
      project: project1
      tier: backend
  ingress:
  - from:
    - ipBlock:
        cidr: 10.244.0.0/16
        except:
        - 10.244.169.0/24
    ports:
    - port: 8080
      protocol: TCP

在node-01和node-02上分别运行一个client-pod,然后去访问tomcat,node-01上的client-pod可以访问,node-02上的client-pod不能访问,因为它属于10.244.169.0/24网段
在这里插入图片描述
在这里插入图片描述

示例3
通过名称空间限定可以访问tomcat Pod

kind: NetworkPolicy
metadata:
  name: network-policy-demo3
  namespace: project1
spec:
  policyTypes: ["Ingress"]
  podSelector:
    matchLabels:
      app: tomcat
      project: project1
      tier: backend
  ingress:
  - from:	#限定只有project2名称空间下具有app=nginx的Pod才能访问tomcat
    - podSelector:	#podSlector筛选app=nginx的Pod
        matchLabels:
          app: nginx
      namespaceSelector:	#namespaceSelector和podSlector是逻辑与关系,表示在namespaceSelector筛选出的名称空间下用podSlector筛选Pod
        matchLabels:
          name: project2
    ports:
    - port: 8080
      protocol: TCP

在project1名称空间下用nginx-pod访问tomcat-pod,不能访问
在这里插入图片描述
在project2名称空间下用nginx-pod访问tomcat-pod,可以访问
在这里插入图片描述
在project2名称空间下使用其它pod访问tomcat,无法访问
在这里插入图片描述

Egress规则

大多数情况下,一个名称空间下的Pod资源总有对外请求的需求,例如向CoreDns请求名称解析等。因此,通常应该将出站流量的默认策略设置为允许通过。但如果要实现更精细的控制,仅放行有对外请求必要的Pod对象的出站流量,可以通过Egress实现。

spec.egress字段用于定义出站流量规则,它可以嵌套使用to和ports字段,to用于定义选定的Pod组的出站流量可访问的目标端点,其格式和逻辑与ingress.from一致;ports用于定义选定的Pod组的出站流量可访问的目标端口。

下面是一个示例:

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: network-policy-egress-demo1
  namespace: project1
spec:
  policyTypes: ["Egress"]	#网络策略类型为Egress
  podSelector:	#对project1名称空间下的nginx-pod进行限制
    matchLabels:
      app: nginx
      project: project1
      tier: fronted
  ingress:
  - to:		#Egress条件1,限制nginx只能访问同名称空间下的tomcat-pod的8080端口
    - podSelector:
        matchLabels:
          app: tomcat
          project: project1
          tier: backend
    ports:
    - port: 8080
      protocol: TCP
  - to:		#Egress条件2,限制nginx只能访问192.168.211.0/24网段的主机的任何端口(不定义ports字段表示不限制)
    - ipBlock:
        cidr: 192.168.211.0/24

测试在project1名称空间下nginx-pod访问同名称空间下的tomcat-pod,可以正常访问
在这里插入图片描述
测试在project1名称空间下nginx-pod访问192.168.211.12:80,可以正常访问
在这里插入图片描述

测试在project1名称空间下nginx-pod访问coredns服务,解析域名失败,无法访问
在这里插入图片描述

综合示例

下面是一个综合示例,用于实现名称空间隔离。它大致实现了以下几点需求:

1.本 名称空间内的Pod可以互相访问
2. 集群上管理类应用所在名称空间中的Pod(例如日志收集、监控、dashboard等)可以访问本名称空间中的Pod
3. 本名称空间中的Pod可以访问CoreDns、Kubernetes API等必要的服务

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: default-networkpolicy
  namespace: project1
spec:
  policyTypes: ["Ingress", "Egress"]
  podSelector: {}	#project1名称空间下所有Pod对象
  ingress:
  - from:	#入站规则1,允许指定名称空间中的Pod访问任意端口
    - namespaceSelector:
        matchExpressions:
        - {key: "name", operator: In, values: ["kube-system", "kube-dashboard", "log", "monitor", "project1"]}
  egress:
  - to:		#出战规则1,允许访问同名称空间下Pod的任意端口
    - namespaceSelector:
        matchLabels:
          name: project1
  - to: []	#出站规则2,允许访问任何端点的UDP 53端口,DNS服务
    ports:
    - port: 53
      protocol: UDP
  - to:		#出站规则3,允许访问kube-apierver
    - podSelector:
        matchLabels:
          component: kube-apiserver
      namespaceSelector:
        matchLabels:
          kubernetes.io/metadata.name: kube-system
    ports:
    - port: 443
      protocol: TCP

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/77767.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

何为Spring Batch?怎么玩?

何为批处理&#xff1f; 何为批处理&#xff0c;大白话讲就是将数据分批次进行处理的过程。比如&#xff1a;银行对账&#xff0c;跨系统数据同步等。这些处理逻辑一般来说都不需要人工参与就能够自动高效地进行复杂的数据处理与分析。 典型批处理特点&#xff1a; 自动执行&…

ubuntu下使用vscode开发golang程序,从控制台到简单web程序

最近项目要使用go语言开发一个web程序&#xff0c;由于是第一次使用go开发&#xff0c;就将开发过程中的点滴做个记录吧。 1.安装go 1.1 安装 Ubuntu下安装go语言开发运行环境有如下两种方法 &#xff08;1&#xff09;方法一&#xff1a;使用命令 sudo apt install golan…

天天刷 B站,了解他们的评论系统是如何设计的吗?

今天给大家分享 B站的评论系统的 组件化、平台化建设 通过持续演进架构设计&#xff0c;管理不断上升的系统复杂度&#xff0c;从而更好地满足各类用户的需求。 基础功能模块 评论的基础功能模块是相对稳定的。 1. 发布评论&#xff1a;支持无限盖楼回复。 2. 读取评论&am…

异步编程解决方案 Promise

1. 回调地狱 2. Promise 的使用 3. Promise 的状态 4. Promise 的结果 5. Promise 的 then 方法 6. Promise 的 catch 方法 7. 回调地狱的解决方案 1. 回调地狱 回调地狱: 在回调函数中嵌套回调函数 因为 ajax 请求是异步的&#xff0c;所以想要使用上一次请求的结果作为请求…

ADI Blackfin DSP处理器-BF533的开发详解21:RTC实时时钟的原理及应用(含源码)

硬件准备 ADSP-EDU-BF533&#xff1a;BF533开发板 AD-HP530ICE&#xff1a;ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 功能介绍 ADSP-BF53x 处理器上集成了一个实时时钟&#xff08;RTC&#xff09;模块&#xff0c;板卡上设计了一个专门用于 RTC 时钟源的晶体32.7…

如何修复错误:无法下载 metadata repo appstream

如何修复错误&#xff1a;无法下载 metadata repo appstream 如果您出于某种原因仍在积极使用CentOS 8&#xff0c;您可能在尝试更新系统或只是安装软件包时遇到以下错误。 Error: Failed to download metadata for repo appstream: Cannot prepare internal mirrorlist: No …

Linux内存管理

平时我们说计算机的“计算”两个字&#xff0c;其实说的就是两方面&#xff0c;第一&#xff0c;进程和线程对于CPU的使用&#xff1b;第二&#xff0c;对于内存的管理。——这个是对计算机的理解的两个大方面&#xff0c;面试中问到的场景设计题可以尝试从这两个角度出发。 可…

Gradle学习笔记之项目生命周期及settings文件

文章目录Gradle项目的生命周期settings文件Gradle项目的生命周期 Gradle项目的生命周期分为初始化->配置->执行三步&#xff0c;如下图所示&#xff1a; 初始化阶段主要目的是初始化构建&#xff0c;分为执行初始化脚本和执行设置脚本两步&#xff0c;前者在每个项目构…

多线程的实现

目录 进程和线程 并发和并行 继承实现Runnable接口的Thread类实现的多线程 实现Runnable接口创建线程类 线程常用方法 进程和线程 进程&#xff1a;一个程序的启动就可以抽象化为一个进程 线程&#xff1a;线程是由进程开启的&#xff0c;一个进程可以创建多个线程&#x…

环形队列、 条带环形队列 Striped-RingBuffer (史上最全)

文章很长&#xff0c;而且持续更新&#xff0c;建议收藏起来&#xff0c;慢慢读&#xff01;疯狂创客圈总目录 博客园版 为您奉上珍贵的学习资源 &#xff1a; 免费赠送 :《尼恩Java面试宝典》 持续更新 史上最全 面试必备 2000页 面试必备 大厂必备 涨薪必备 免费赠送 经典…

基于jsp+mysql+ssm项目bug修复管理系统-计算机毕业设计

项目介绍 本文主要是采用ssm的mvc技术、Mysql数据库、Tomcat服务器作为开发平台&#xff0c;系统采用B/S结构进行开发&#xff0c;完成一个项目修复管理系统&#xff0c;构建企业管理与员工任务计划相结合。提供了包括传统业务中最基本的用户注册、登录、查询、职位信息、部 门…

MicroPython-On-ESP8266——8x8LED点阵模块(3)使用MAX7219驱动

MicroPython-On-ESP8266——8x8LED点阵模块&#xff08;3&#xff09;使用MAX7219驱动 1. 新主角登场 手上有块8x8LED点阵屏&#xff0c;咱们已经了解了点阵屏的基础电路与驱动原理&#xff0c;并用两片74HC595锁存IC成功驱动点阵屏显示需要的图案。 MicroPython-On-ESP8266…

DBCO-PEG-CHO,DBCO-CHO,二苯基环辛炔-聚乙二醇-醛基

一、理论分析&#xff1a; 中文名&#xff1a;二苯基环辛炔-聚乙二醇-胆固醇&#xff0c;胆固醇偶联二苯基环辛炔&#xff0c; 二苯基环辛炔-聚乙二醇-醛基&#xff0c;点击试剂DBCO偶联醛基 英文名&#xff1a;DBCO-PEG-CHO&#xff1b; DBCO-CHO 二、结构式&#xff1a; 三…

【JavaEE】B/S结构系统的会话机制_session机制

session机制什么是会话&#xff1f;session机制为什么需要session对象来保存会话状态呢&#xff1f;只要B和S断开了&#xff0c;那么关闭浏览器这个动作&#xff0c;服务器知道吗&#xff1f;为什么不使用request(ServletRequest)对象保存会话状态&#xff1f;为什么不使用appl…

【c++实战项目】——云备份服务器

项目介绍 云备份服务器能够通过浏览器将文件上传到服务器上。并且随时可以通过浏览器进行查看并且下载&#xff0c;其中下载的过程支持断点续传。服务器上有热点管理模块&#xff0c;将非热点文件进行压缩存储&#xff0c;节省服务器的磁盘空间。服务器各个模块的功能介绍 配…

Python入门学习需要知道的100个小技巧,加了几个小时班终于整理出来了

Python新手需要知道的100个小技巧序言最后序言 哈喽兄弟们&#xff0c;今天给大家分享一下Python初学需要知道的100个小技巧~ 1、for循环中的else条件 这是一个for-else方法&#xff0c;循环遍历列表时使用else语句。下面举个例子&#xff0c;比如我们想检查一个列表中是否包…

DNSPod十问陈迪菲:从C到B,鹅厂设计师的中场战事

陈迪菲&#xff0c;腾讯云设计中心总经理&#xff0c;公司设计通道副会长&#xff0c;设计技术委员会委员&#xff0c;腾讯学院优秀讲师&#xff0c;曾于2019年获得新中国成立70周年中国用户体验设计70人提名奖。2010年加入腾讯&#xff0c;10年设计团队项目管理经验&#xff0…

C++手机运动信息管理系统

C手机运动信息管理系统 《程序设计基本能力综合实训》 实训案例名称:手机运动信息管理系统 -----说明文档 本案例主要完成手机运动信息的管理。主要功能包括:用户信息的管理、运动信息的管理、查看运动排行榜、定制运动路线、数据文件操作和退出。 如图 1-1 所示。 图1-1 …

web前端期末大作业 :HTML+CSS+JavaScript+Bootstrap实现响应式网站潮酷音乐网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

初始C语言2【函数 、数组、操作符、关键字、#define 定义常量和宏、指针、结构体】

目录 八、函数 九、数组 1、数组的定义&#xff1a;一组相同类型元素的集合 2、数组的下标 数组的每个元素都有一个下标&#xff0c;下标是从0开始的。 数组可以通过下标来访问元素。 3、数组的使用 十、操作符 1.常见操作符&#xff1a; 举例&#xff1a; 1&#xff…