K8s 网络新手教程(Kubernetes Networking Guide for Beginners)
K8s 网络新手教程(Kubernetes Networking Guide for Beginners)
译者注: 建议对照阅读 The Layers of the OSI Model Illustrated. (有机会翻译下这篇, 挖坑不填 )
译者注:
由于没有预先了解过相关的网络知识,我在初学 Kubernetes 时, 经常会迷失在各种高深的行话和晦涩的图表中。
为了避免后来人遇到和我一样的情况, 我在这里总结了一份为新手学习 Kubernetes 需要预先了解的网络知识。
学习 Kubernetes 网络, 需要理解以下五个基本的知识点:
- 同一个 Pod 中的各个 Containers 之间的通信
- 同一个 Node 中的各个 Pod 之间的通信
- 不同 Node 的 Pod 之间的通信
- Pod 和 Service 之间的通信
- DNS 如何工作?如何发现 IP 地址?
同一个 Pod 中的各个 Containers 之间的通信
假设有两个运行在同一个 Pod 的 Container, 它们之间如何通信呢?
答案是: 类似于在同一个主机通信的进程, 他们通过 localhost 和端口号。
这是因为同一个 Pod 的容器共享相同的 network namespace —— 这使得它们可以共享网络资源。
什么是网络名称空间(network namespace)?
网络名称空间是网卡(Network Interface)和路由表的集合。
名称空间可以减少同一个虚拟机中的碰撞和冲突。
(在同一个网络名称空间下监听同一个端口号会发生冲突)
每个 Pod 中都有一个 pause container, 负责维护 Pod 的网络名称空间。
译者注:
更多关于 pause container: The Almighty Pause Container
每个 Pod 拥有独立的网络名称空间,在同一个 Pod 的 Container 因此享有相同的网络名称空间。这就是为什么同一个 Pod 下的容器之间可以通过 localhost 通信的原因。同时, 这也是为什么同一个 Pod 的不同 Container 的 port 会冲突的原因。
同一个 Node 的不同 Pod 之间的通信
每个 Pod 有自己的网络名称空间和自己的 IP 地址。
Pod 认为自己有一个普通的网络以太网设备 eth0 来处理网络请求,这是 Kubernetes 创建的虚拟的以太网设备。
这个 虚拟以太网设备 是连接 Pod 和 Node 网络的一个通道,它的一端是 Pod 的 eth0,一端是 Node 的 vethX。
Pod 发送请求到其他 Node 时, 请求会通过 eth0 转发到它所在 Node 对应的 vethX 接口。
那么, 这个请求又是怎么到达其他 Pod 的呢?
答案是通过 网桥(Network Bridge)
什么是网桥?
网桥是连接独立子网的网络设备。当请求达到网桥, 它会询问所有连接它的网络设备是否是该请求的目的 IP 指定的设备。然后, 它会将请求转发到对应的设备。
(每个 Pod 有自己的 IP 地址, 并且它知道自己的 IP 地址是什么)
在 Kubernetes 中, 这个网桥叫做 cbr0。每个 Node 的 cbr0 保存了它的所有 Pod 的转发信息, 以此将同一 Node 下的所有 Pod 连接起来。
不同 Node 的 Pod 之间的通信
注: 这部分不同的云厂商/网络插件实现可能会有所不通过。
那么不同 Node 的 Pode 之间如何进行通信呢?
当网桥询问了所有它所有连接的 Pod 后, 发现并没有找到目的 IP 对应的设备。
之后, 网桥会找到默认网关, 上升到集群级别查询该 IP 地址。
集群级别有一个不同 Node 的路由表, 登记 Node 内的 Pods 所在的子网。
举个例子, Kubernetes 为 Node 1 的 Pods 提供 IP 地址: 100.96.1.1, 100.96.1.2 等。Kubernetes 为 Node 1 的 Pods 提供 IP 地址: 100.96.2.1, 100.96.2.2 等。
查询该路由表, 会将发送到 100.96.1.xxx 的请求转发到 node1,将发送到 100.96.2.xxx 的请求转发到 node2。
Pod 和 Service 之间的通信
Kubernetes 的 Service 将一个 IP 地址绑定到多个 Pod。网络请求发送到一个终端(Endpoint, 域名/IP 地址), service 代理将请求转发到该 service 对应的 Pod。
Kubernetes 通过在每个 Node 运行的 kube-proxy 进程实现这个功能。
kube-proxy 将虚拟 IP 地址映射为一组实际的 Pod IP 地址。
一旦 kube-proxy 将 Service 的虚拟 IP 映射到了一个实际的 Pod IP, 剩下的操作就和和上面提到的流程一样了。
译者注:
- 更多关于 kube-proxy: Virtual IPs and service proxies
DNS 是如何工作的?它是如何发现 IP 地址的?
Kubernetes 集群通过 DNS 解析将域名映射为对应的 IP 地址。
Kubernetes 集群会给每个服务分配一个像 my-service.my-namespace.svc.cluster.local 这样的域名。
同样地,Kubernetes 也会为 Pod 自动分配 DNS 域名。你也可以通过 YAML 文件的 hostname
和 subdomain
字段指定 Pod 的域名。
这样,当通过域名访问 Service 时, DNS 服务就会将它解析为对应的 IP 地址。
然后 kube-proxy 会将 Service 的 IP 地址转化为 Pod 的 IP 地址。最后就可以根据该 Pod 是否在同一个 Node 按照上述流程将请求转发到对应的 Container。
译者注:
==================== 我是分割线 ====================
号外~ 号外~
字节跳动 2022 届校招提前批开始啦~
如何加入我们:
字节跳动校招内推码: UQAYUMY
投递链接: https://jobs.toutiao.com/s/eGx5Pv4
或直接发送简历到邮件:yangling.leo@bytedance.com
我们是谁:
字节跳动基础架构团队主要负责公司私有云建设,支撑着今日头条、抖音、西瓜视频等多款明星产品。
我们积极拥抱开源和创新的软硬件架构,构建一系列基础设施引导研发活动的最佳实践,为整个公司的发展保驾护航。
我们在找谁:
2022届获得本科及以上学历,计算机相关专业
热爱计算机科学和互联网技术
掌握扎实的计算机基础知识,深入理解数据结构、算法和操作系统知识
K8s 网络新手教程(Kubernetes Networking Guide for Beginners)的更多相关文章
- 【Kubernetes】K8S网络方案--最近在看的
K8S网络-最近在看的 Create a Minikube cluster - Kubernetes Kubernetes Documentation - Kubernetes Kubernetes ...
- 【Kubernetes】K8S 网络隔离 方案
参考资料: K8S-网络隔离参考 OpenContrail is an open source network virtualization platform for the cloud. – Kub ...
- [翻译] 一个kubernetes网络简明教程[Part 1]
一个kubernetes网络简明教程[Part 1] 翻译: icebug 所有我学到的关于kubernetes网络的事情 你可能已经在kubernetes集群当中跑了一堆服务并且正在享受其带来的好处 ...
- Kubernetes(k8s)完整安装教程
Kubernetes(k8s)完整安装教程 2019-08-27 2.3k 记录 发表评论 目录 1 安装 1.1 安装 Docker 1.2 安装 VirtualBox 1.3 安装 kubect ...
- ASP.NET Core on K8S深入学习(11)K8S网络知多少
本篇已加入<.NET Core on K8S学习实践系列文章索引>,可以点击查看更多容器化技术相关系列文章. 一.Kubernetes网络模型 我们都知道Kubernetes作为容器编排引 ...
- k8s网络之设计与实现
k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 K8s网络设计与实现是在学习k8s网络过程中总结的内容.在学习k8s网络各种插件 ...
- k8s网络配置管理
docker容器的四种网络类型 1.桥接 2.联盟 3.主机 4.无 docker跨节点的容器通信必须通过NAT机制 宿主机上的容器一般都是私网地址 它可以通过宿主机 ...
- hibernate官方新手教程 (转载)
hibernate官方新手教程第一部分 - 第一个Hibernate程序 首先我们将创建一个简单的控制台(console-based)Hibernate程序.我们使用内置数据库(in-memory d ...
- k8s网络之Flannel网络
k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划 ...
- k8s网络之Calico网络
k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Calico 是一种容器之间互通的网络方案.在虚拟化平台中,比如 Open ...
随机推荐
- .NET 7 的 AOT 到底能不能扛反编译?
一:背景 1.讲故事 在B站,公众号上发了一篇 AOT 的文章后,没想到反响还是挺大的,都称赞这个东西能抗反编译,可以让破解难度极大提高,可能有很多朋友对逆向不了解,以为用 ILSpy,Reflect ...
- win 10玩魔兽争霸/黑边,不能全屏,闪退
1.win键+s键搜索注册表 打开 找到路径 计算机\HKEY_CURRENT_USER\SOFTWARE\Blizzard Entertainment\Warcraft III\Video 这里有两 ...
- 【Java Web】项目通用返回模块ServerResponse:枚举code状态码、泛型返回值、序列化注解限制数据
一.枚举类编写ResponseCode package com.boulderaitech.common; /** * 编写枚举类的步骤 * (1)编写所需的变量 * (2)编写枚举类构造方法 * ( ...
- 【每日一题】【第一个出现的值】【二分】2022年1月10日-NC105 二分查找-II
描述请实现有重复数字的升序数组的二分查找给定一个 元素有序的(升序)长度为n的整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的第一个出现的target,如果目标值存在返 ...
- 互联网最全cka真题解析-2022
1.CKA真题解析kubectl自动补全及帮助信息1.配置kubectl自动补全apt install bash-completion source <(kubectl completion b ...
- 小技巧 EntityFrameworkCore 实现 CodeFirst 通过模型生成数据库表时自动携带模型及字段注释信息
今天分享自己在项目中用到的一个小技巧,就是使用 EntityFrameworkCore 时我们在通过代码去 Update-Database 生成数据库时如何自动将代码模型上的注释和字段上的注释携带到数 ...
- 数据库MySQL(完结)
SQL注入问题 简介 针对SQL注入的攻击行为可描述为通过用户可控参数中注入SQL语法,破坏原有SQL结构,达到编写程序意料之外结果的攻击行为. 其成因可归结为以下两个原理叠加造成: 程序编写者在处理 ...
- 使用WPF或AspNetCore创建简易版ChatGPT客户端,让ChatGPT成为你的私人助理
前言:前一天写的一个ChatGPT服务端,貌似大家用起来还不是那么方便,所以我顺便用WPF和AspNetCore的webapi程序做个客户端吧,通过客户端来快速访问chatgpt模型生成对话. 1 ...
- 【机器学习】李宏毅——AE自编码器(Auto-encoder)
1.What 在自编码器中,有两个神经网络,分别为Encoder和Decoder,其任务分别是: Encoder:将读入的原始数据(图像.文字等)转换为一个向量 Decoder:将上述的向量还原成原始 ...
- Vue3.0 生命周期
所有生命周期钩子的this上下文都是绑定至实例的. beforeCreate:在实例初始化之后.进行数据帧听和事件/侦听器的配置之前同步调用. created:实例创建完成,主要包括数据帧听.计算属性 ...