K8s-网络原理-下篇

引言

本文是《深入剖析 K8s》的学习笔记,相关图片和案例可从https://github.com/WeiXiao-Hyy/k8s_example中获取,欢迎Star!

K8s 的网络隔离: NetWorkPolicy

K8s 如何考虑容器之间网络的“隔离” -> NetWorkPolicy

以下是一个 NetWorkPolicy 的定义。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: test-network-policynamespace: default
spec:# 指定套用 network policy 的 pod# 若沒指定 podSelector,就表示將 network policy 套用到 namespace 中的所有 podpodSelector:matchLabels:role: db# 設定 network policy 包含的 policy type 有那些policyTypes:- Ingress- Egress# ingress 用來設定從外面進來的流量的白名單ingress:- from:# 指定 IP range- ipBlock:cidr: 172.17.0.0/16# 例外設定except:- 172.17.1.0/24# 帶有特定 label 的 namespace 中所有的 pod- namespaceSelector:matchLabels:project: myproject# 同一個 namespace 中帶有特定 label 的 pod- podSelector:matchLabels:role: frontendports:- protocol: TCPport: 6379# egress 用來設定 pod 對外連線的白名單egress:- to:- ipBlock:cidr: 10.0.0.0/24ports:- protocol: TCPport: 5978

ingress, egress 的行为

  • ingress 搭配 from, 负责管理从外部进来的流量
  • egress 搭配 to, 负责管理从内部出去的流量

设定 Default Policy

  • 若要选择所有的 pod,则将 podSelector 设定为 {}
  • Network Policy 的设定,若是设定 policyType,就表示要全部拒绝该种连接(ingress/egress)的流量
  • 若要打开上面的限制,則要在 spec.ingress or spec.egress 中设定

凡是支持 NetWorkPolicy 的 CNI 网络插件,都维护着一个 NetWorkPolicy Controller,通过控制循环的方式对 NetWorkPolicy 对象的 CRUD 做出响应,然后在宿主机上完成 iptables 规则的配置工作。

案例

apiVersion: v1
kind: Pod
metadata:name: deny-egress-testlabels:app: "deny-egress-test"namespace: "new-ns"
spec:containers:- name: nettoolsimage: travelping/nettoolscommand: ["sh", "-c", "sleep 3600"]

正常的 pod 可以访问外界。
请添加图片描述

添加如下 NetWorkPolicy 之后,ping 失败。

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:name: deny-egress-testnamespace: "new-ns"
spec:podSelector:matchLabels:app: "deny-egress-test"policyTypes:- Egress

请添加图片描述

iptables

iptables 相关配置可以参考https://zh.wikipedia.org/wiki/Iptables

Service、DNS 与服务发现

Service 是由 kube-proxy 组件,加上 iptables 来共同实现的。部署 service 和 deploy 后可发现,其默认提供的是 Round Robin 方式的负载均衡。

-A KUBE-SERVICES -d 10.108.229.168/32 -p tcp -m comment --comment "default/hostnames: cluster IP" -m tcp --dport 80 -j KUBE-SVC-NWV5X2332I4OT4T3

这条 iptables 规则的含义是:凡是目的地址是 10.0.1.175、目的端口是 80 的 IP 包,都应该跳转到另外一条名叫 KUBE-SVC-NWV5X2332I4OT4T3 的 iptables 链进行处理。

KUBE-SVC-NWV5X2332I4OT4T3 规则如下:

-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.33332999982 -j KUBE-SEP-WNBA2IHDGP2BOBGZ
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -m statistic --mode random --probability 0.50000000000 -j KUBE-SEP-X3P2623AGDH6CDF3
-A KUBE-SVC-NWV5X2332I4OT4T3 -m comment --comment "default/hostnames:" -j KUBE-SEP-57KPRZ3JQVENLNBR

这三条链指向的最终目的地,其实就是三个 Service 代理的三个 Pod。通过查看上述三条链的明细,如下所示:

-A KUBE-SEP-57KPRZ3JQVENLNBR -s 10.1.0.116/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-57KPRZ3JQVENLNBR -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.1.0.116:9376
-A KUBE-SEP-WNBA2IHDGP2BOBGZ -s 10.1.0.117/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-WNBA2IHDGP2BOBGZ -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.1.0.117:9376
-A KUBE-SEP-X3P2623AGDH6CDF3 -s 10.1.0.118/32 -m comment --comment "default/hostnames:" -j MARK --set-xmark 0x00004000/0x00004000
-A KUBE-SEP-X3P2623AGDH6CDF3 -p tcp -m comment --comment "default/hostnames:" -m tcp -j DNAT --to-destination 10.1.0.118:9376

上述本质是 DNAT 规则,基于 DNAT 规则将流入 IP 包的目的地址和端口,改成 to-destination 所指定新的目的地址和端口(被代理 Pod 的 IP 地址和端口)。

注意

当你的宿主机上有大量 Pod 的时候,成百上千条 iptables 规则不断地被刷新,会大量占用该宿主机的 CPU 资源,甚至会让宿主机“卡”在这个过程中。所以说,一直以来,基于 iptables 的 Service 实现,都是制约 Kubernetes 项目承载更多量级的 Pod 的主要障碍。

往往采用 IPVS 技术进行优化,IPVS 并不需要在宿主机上为每个 Pod 设置 iptables 规则,而是把对这些“规则”的处理放到了内核态,从而极大地降低了维护这些规则的代价。

Service和DNS关系

在K8s中,Service和Pod都会被分配对应的DNS记录。

  • ClusterIP模式:解析的是该Service的VIP地址
  • Headless模式:解析的是Pod的IP地址的集合

NodePort

所谓 Service 的访问入口,其实就是每台宿主机上由 kube-proxy 生成的 iptables 规则,以及 kube-dns 生成的 DNS 记录。而一旦离开了这个集群,这些信息对用户来说,也就自然没有作用了。

注意

在 NodePort 方式下,Kubernetes 会在 IP 包离开宿主机发往目的 Pod 时,对这个 IP 包做一次 SNAT 操作。

-A KUBE-POSTROUTING -m comment --comment "kubernetes service traffic requiring SNAT" -m mark --mark 0x4000/0x4000 -j MASQUERADE

这条规则设置在 POSTROUTING 检查点,也就是说,它给即将离开这台主机的 IP 包,进行了一次 SNAT 操作,将这个 IP 包的源地址替换成了这台宿主机上的 CNI 网桥地址,或者宿主机本身的 IP 地址

这个 SNAT 操作只需要对 Service 转发出来的 IP 包进行,依据,就是查看该 IP 包是否有一个“0x4000”的“标志”,这个标志正是在 IP 包被执行 DNAT 操作之前被打上去的。

DNAT和SNAT相关原理

相关资料:https://juejin.cn/post/7144679982759936013

简单概括即:SNAT是原地址转换,DNAT是目标地址转换。

  • SNAT:如果内部地址要访问公网上的服务时,内部地址会主动发起连接,将内部地址转化为公有ip。
  • DNAT:当内部需要对外提供服务时,外部发起主动连接,路由器或防火墙的网关接收到这个连接,然后把连接转换到内部,此过程是由带公有ip的网关代替内部服务来接收外部的连接,然后在内部做地址转换。

为什么要对流出的包做SNAT呢?

如果客户端通过Node2访问Service,则有可能负载到Node1上的endpoint提供服务,则如果不做SNAT则返回的地址为Node1,会导致client接收包失败(client请求的是Node2,响应是Node1)。
请添加图片描述

不做SNAT可以吗?

可以,在某些场景下,Node1需要知道IP包来自外部的Client而不是Node2,则上述SNAT无法满足需求。可以将Service.externalTrafficPolicy设置为local,保证了所有Pod通过Service收到请求之后,一定可以“看到”真正的client的源地址。

如果一台宿主器不存在任何被代理的Pod,比如上述的Node2,则使用使用Node2的IP地址访问这个Service则是无效的。

参考资料

  • https://godleon.github.io/blog/Kubernetes/k8s-Network-Policy-Overview/
  • https://zh.wikipedia.org/wiki/Iptables

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务day07 -- 搜索引擎 ( 数据聚合 + 自动补全 + 数据同步 + ES集群 )

1.数据聚合 聚合(aggregations)可以让我们极其方便的实现对数据的统计、分析、运算。例如: 什么品牌的手机最受欢迎? 这些手机的平均价格、最高价格、最低价格? 这些手机每月的销售情况如何? 实现这些…

常用中间件redis,kafka及其测试方法

常用消息中间件及其测试方法 一、中间件的使用场景引入中间件的目的一般有两个:1、提升性能常用的中间件:1) 高速缓存:redis2) 全文检索:ES3) 存日志:ELK架构4) 流量削峰:kafka 2、提升可用性产品架构中高可…

Kubernetes Pod深度解析:构建可靠微服务的秘密武器(上)

🐇明明跟你说过:个人主页 🏅个人专栏:《Kubernetes航线图:从船长到K8s掌舵者》 🏅 🔖行路有良友,便是天堂🔖 目录 一、引言 1、Kubernetes概述 2、Pod概述 二、Po…

基于SSM框架的酒店预订系统

基于SSM框架的酒店预订系统的设计与实现 摘要 当今世界的互联网信息技术飞速发展,网络化的工作模式已经几乎覆盖到各个工作领域中的业务内,人们的日常生活也渐渐离不开互联网。因此,在当下全国各处的酒店都开始构建起了自己的网络预订系统。…

C++ 简单模拟实现 STL 中的 list 与 queue

目录 一,list 1, list 的节点与迭代器 2,list 的数据结构、一些简单的功能、构造函数 3,list 的对元素操作 4,C 11 的一些功能 5,完整代码: 二,queue 一,list std…

目前国内体验最佳的AI问答助手:kimi.ai

文章目录 简介图片理解长文档解析 简介 kimi.ai是国内初创AI公司月之暗面推出的一款AI助手,终于不再是四字成语拼凑出来的了。这是一个非常存粹的文本分析和对话工具,没有那些东拼西凑花里胡哨的AIGC功能,实测表明,这种聚焦是对的…

『Apisix入门篇』从零到一掌握Apache APISIX:架构解析与实战指南

📣读完这篇文章里你能收获到: 🌐 深入Apache APISIX架构: 从Nginx到OpenResty,再到etcd,一站式掌握云原生API网关的构建精髓,领略其层次化设计的魅力。 🔌 核心组件全解析&#xff…

Ubuntu deb文件 安装 MySQL

更新系统软件依赖 sudo apt update && sudo apt upgrade下载安装包 输入命令查看Ubuntu系统版本 lsb_release -a2. 网站下载对应版本的安装包 下载地址. 解压安装 mkdir /home/mysqlcd /home/mysqltar -xvf mysql-server_8.0.36-1ubuntu20.04_amd64.deb-bundle.tar# …

判断a是否大于b operator.gt(a, b) 判断a是否大于等于b operator.ge(a, b)

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 判断a是否大于b operator.gt(a, b) 判断a是否大于等于b operator.ge(a, b) [太阳]选择题 请问执行以下程序的结果是: import operator print("【执行】2>2") print(2…

hbase启动错误-local host is“master:XXXX“ destination is:master

博主的安装前提: zookeeper安装完成,且启动成功 hdfs高可用安装,yarn高可用安装,且启动成功 报错原因:端口配置不对 解决方案: 输入:hdfs getconf -confKey fs.default.name 然后把相应的…

影视文件数字指纹签名检验系统的用户操作安全大多数

国内网盘服务大规模出现版权问题。 一些个人或团体会通过云存储客户端将主要由电影、电视、音乐组成的文件上传到网盘,然后在圈子里分享。 可供下载。 大量受版权保护的视频音乐就是通过这种特殊的盗版方式传播的,而这种传播方式暂时不受监管。 一些云存…

开发者的瑞士军刀:DevToys

DevToys: 一站式开发者工具箱,打造高效创意编程体验,让代码生活更加得心应手!—— 精选真开源,释放新价值。 概览 不知道大家是否在windows系统中使用过PowerToys?这是微软研发的一项免费实用的系统工具套…

iMazing2024功能强大的iPhone和iPad管理工具

iMazing是一款功能强大的iPhone和iPad管理工具,确实可以作为iTunes的替代品进行数据备份。以下是一些关于iMazing的主要特点和功能: 设备备份:iMazing可以备份iOS设备上的所有数据,包括照片、视频、音乐、应用程序等。与iTunes相比…

【元胞自动机】MATLAB界面聚合的元胞自动机模拟完整实现运行

文末有完整代码分享链接 文件介绍 automain 为元胞自动机主函数 choosedirection 选择方向函数,主函数调用 judgedirection 判断位置函数,主函数调用 neighbor 求每个元胞的邻居函数,主函数调用 surfaceness 求表面粗糙度 porosity 求孔隙率…

机器学习作业二之KNN算法

KNN(K- Nearest Neighbor)法即K最邻近法,最初由 Cover和Hart于1968年提出,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路非常简单直观:如果一个样本在特征空间中的K个最相似&…

Arduino IDE工程代码多文件编程和中文设置

一、esp8266模块信息 二、中英文切换 点击文件( File )–选择首选项( Preference )—选择语言( Language )—选择中文–点击确定( OK ) 三、多文件编程 在Arduino编程中,将代码分割成多个文件是一种很好的做法,特别是项目变得越来越大和复杂时。这样…

【微服务】Eureka(服务注册,服务发现)

文章目录 1.基本介绍1.学前说明2.当前架构分析1.示意图2.问题分析 3.引出Eureka1.项目架构分析2.上图解读 2.创建单机版的Eureka1.创建 e-commerce-eureka-server-9001 子模块2.检查父子pom.xml1.子 pom.xml2.父 pom.xml 3.pom.xml 引入依赖4.application.yml 配置eureka服务5.…

【牛客】SQL142 对试卷得分做min-max归一化

描述 现有试卷信息表examination_info(exam_id试卷ID, tag试卷类别, difficulty试卷难度, duration考试时长, release_time发布时间): idexam_idtagdifficultydurationrelease_time19001SQLhard602020-01-01 10:00:0029002Chard802020-01-0…

huawei 华为 交换机 配置 LACP 模式的链路聚合示例 (交换机之间直连)

组网需求 如 图 3-22 所示, SwitchA 和 SwitchB 通过以太链路分别都连接 VLAN10 和 VLAN20 的网络,且SwitchA 和 SwitchB 之间有较大的数据流量。用户希望 SwitchA 和 SwitchB 之间能够提供较大的链路带宽来使相同VLAN 间互相通信。在两台 Switch 设备上…

【SpringBoot】实现一个简单的图片上传

前端上传表单 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <form enctype"multipart/form-data" method"post" action&q…