Docker和Kubernetes网络模型
Docker网络模型
Bridge模式(默认)
Docker程序启动后会创建一个bridge0网桥,并分配一个IP,可以想象成一个虚拟的交换机,创建的容器实例都会通过虚拟网卡veth pair设备连接到这个网桥上,并以网桥IP作为网关,这样就可以实现容器间的通信。 如果容器内程序想访问宿主机服务,则可以直接访问bridge0的IP,注意:此流量不走localhost,宿主机上服务需要监听0.0.0.0,并且此方法在不同系统间不通用。 如果容器内程序想访问外网服务,则需要通过SNAT机制,将来自容器内部的源IP替换成宿主机IP。 如果外部程序想访问容器内服务,则需要在启动容器时做端口绑定,也是通过iptables添加一条DNAT规则,实现目的IP转换。如:
1 |
|
Host模式
该模式下容器网络并未与宿主机网络进行隔离,而是占用了宿主机的端口,容易造成端口冲突。
Containner模式
该模式指后创建的容器与已有容器共用同一个Network Namespace,即共用一个IP和端口范围。则两个容器可以通过localhost网卡通信。
Kubernetes网络模型
Pod内容器间的通信
每个Pod创建的时候都先会创建一个默认的Pause容器,后面每个新建的容器则都使用Containner模式,这样所有容器之间都可以通过localhost网卡通信,实现了Pod内容器的网络共享。
同一Node上Pod间的通信
采用了类似Docker Bridge模式的网桥技术,将不同Pod连接在了同一网段中。
不同Node上Pod间的通信
Kubernetes中规定Pod IP在整个集群中唯一,且互相可以不通过IP转换直接通信。此点相比于Docker简化了跨Node通信的配置工作。 此时需要借助实现了CNI标准的插件来实现了,比如:flannel、weave等。 flannel为Kubernetes集群提供了一个三层路由转发网络,通过存储在etcd的pod ip与node ip对应关系,转发数据包到相应的节点上。
Service与Pod间的通信
由于Pod IP会经常变化,所以K8s在提供同样服务的Pod之上又抽象出了Service的概念。Service具有固定的CluserIp:port,可以通过内建的负载均衡器路由到背后的pod容器。 在Pod内程序往Service上发送数据包时,数据包会经过iptables进行过滤,iptables接受数据包后会使用kube-proxy在Node上安装的规则来响应Service或Pod的事件, 将数据包的目的地址从Service的IP重写为Service后端特定的Pod IP,之后就与不同Node上Pod间的通信过程类似。
外部网络访问Service
NodePort模式+LoadBalancer(四层流量入口)
通过配置Service类型为NodePort,则外网则可以通过集群中任意节点的NodeIp:NodePort访问服务,接收到报文的节点会重定向到对应的Service。 NodePort是靠kube-proxy服务通过iptables的nat转换功能实现的,kube-proxy会在运行过程中动态创建与Service相关的iptables规则,这些规则实现了NodePort的请求流量重定向到kube-proxy进程上对应的Service的代理端口上。 kube-proxy接受到Service的请求访问后,会从service对应的后端Pod中选择一个进行访问。 在这之前如果可以添加一个负载均衡器,比如目前阿里云上的SLB,则请求会通过访问负载均衡器的IP在被负载到K8s集群中的Node上。
Ingress模式(七层流量入口)
不像负载均衡器每个服务需要一个公开ip,ingress所有服务只需要一个公网ip,当客户端向Ingress发送http请求时候,ingress会根据请求的主机名和路径决定请求转发到那个服务。 它底层其实是通过Nginx来实现的,它会去对应服务的Endpoints列表里查找pod IP自己选择一个直接访问。 基于http请求的负责模式可以通过host和url进行请求细分服务流量,还可以在请求的X-Forwarded-For标头中提供原始客户端的IP地址。
Docker和Kubernetes网络模型的更多相关文章
- 第25 章 : Kubernetes 网络模型进阶
Kubernetes 网络模型进阶 本文将主要分享以下五个方面的内容: Kubernetes 网络模型来龙去脉 Pod 究竟如何上网? Service 究竟怎么工作? 啥?负载均衡还分内部外部? 思考 ...
- 如何在Windows 10上运行Docker和Kubernetes?
如何在Windows 10上运行Docker和Kubernetes? 在Windows上学习Docker和Kubernetes,开始的时候会让你觉得无从下手.最起码安装好这些软件都不是一件容易的事情. ...
- QCon技术干货:个推基于Docker和Kubernetes的微服务实践
2016年伊始,Docker无比兴盛,如今Kubernetes万人瞩目.在这个无比需要创新与速度的时代,由容器.微服务.DevOps构成的云原生席卷整个IT界.在近期举办的QCon全球软件开发大会上, ...
- Kubernetes网络模型概念
Kubernetes网络模型 Kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址,而且假定所有Pod都在一个可以直接连通的.扁平的网络空间中.所以不管它们是否运行在同 ...
- 在Docker和Kubernetes上运行MongoDB微服务
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟.容器是完全使用沙箱机制,相互之间不会有任何接 ...
- 大型网站技术学习-3. 容器Docker与kubernetes
大型网站技术基石篇-容器Docker与kubernetes Docker和Kubernetes的关系就如Xen与OpenStack. Docker是一种容器技术,和Hypervisor(KVM/X ...
- Docker vs. Kubernetes vs. Apache Mesos: Why What You Think You Know is Probably Wrong
Docker vs. Kubernetes vs. Apache Mesos: Why What You Think You Know is Probably Wrong - Mesosphere h ...
- Linux下安装docker与kubernetes(k8s)
环境 安装是使用Vmware虚拟机下进行,操作系统是CentOS7 64位.规划是使用三台虚拟机搭建k8s的集群,网络使用NAT模式.三台的ip分别为: k8s-master:192.168.91.1 ...
- 极简Docker和Kubernetes发展史
2013年 Docker项目开源 2013年,以AWS及OpenStack,以Cloud Foundry为代表的开源Pass项目,成了云计算领域的一股清流,pass提供了一种"应用托管&qu ...
- Docker学习-Kubernetes - 集群部署
Docker学习 Docker学习-VMware Workstation 本地多台虚拟机互通,主机网络互通搭建 Docker学习-Docker搭建Consul集群 Docker学习-简单的私有Dock ...
随机推荐
- ClickHouse入门教程
目录 什么是ClickHouse? OLAP场景的关键特征 列式数据库更适合OLAP场景的原因 输入/输出 CPU ClickHouse的特性 真正的列式数据库管理系统 数据压缩 数据的磁盘存储 多核 ...
- Linux 下使用Docker 安装 LNMP环境 超详细
首先在阿里云购买了一台服务器 选择了华南-深圳地区 操作系统选用了 CentOS8.0 64位 1. 初始化账号密码 登陆xshell,开始装Docker 一.安装docker 1.Docker 要求 ...
- 运行typhoon程序的三种方式
cmd直接编写运行:用于较短 临时执行的代码 解释器命令运行:可以编写较长的代码 并且可以长久保存 利用IDE工具编写:IDE开发者工具自动提示 携带各种功能插件 编写代码效率更高更快
- MS17-010漏洞复现(永恒之蓝)
0x01:温馨提示 微软已于2017 年 发布MS17-010补丁,修复了"永恒之蓝"攻击的系统漏洞,一定要及时更新Windows系统补丁. 本次只是简易的复现MS17-010,成 ...
- [python] CairoSVG使用教程
1 CairoSVG介绍 代码下载地址 CairoSVG是一个将SVG1.1转为PNG,PDF, PS格式的转化.SVG算目前火热的图像文件格式了,它的英文全称为Scalable Vector Gra ...
- Raft一致性共识算法论文学习
论文地址:https://pdos.csail.mit.edu/6.824/papers/raft-extended.pdf 看完raft共识算法,脑袋非常懵,所以写一篇学习笔记,记录一下. raft ...
- Educational Codeforces Round 33 (Rated for Div. 2) 虚拟赛体验
前言 就只做出了 \(A,B,C,D\) 是不是很弱? A.Chess For Three A,B,C 三人下棋,A和B先下,每次下完棋之后由现在观战的人(例如第一局就由C)代替下输的人. 每次输入一 ...
- CentOS7.6系统安装和网络配置
CentOS7.6系统安装配置 前言:文章内容可能会因环境不同而有所差异,所谓集思广益说不定灵感就来了呢; 文章初衷旨在交流学习.记录个人成长,如果能帮助到您,那就点个赞噢. 环境说明: 1.本实验使 ...
- Potree 003 基于Potree Desktop创建自定义工程
1.第三方js库 第三方库js库选择dojo,其官网地址为https://dojotoolkit.org/,git地址为https://github.com/dojo/dojo,demo地址为http ...
- A+B Problem C++
前言继上次发表的A+B Problem C语言后,今天我们来学习一下A+B Problem C++ 正文什么是C++? C++既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象 ...