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 ...
随机推荐
- SQL审核平台Yearning
1.关于Yearming Yearming是一个Sql审核平台,底层使用Go语言,安装和部署方式也很便捷 项目地址 https://guide.yearning.io/install.html git ...
- 一个简单的工具开发:从学生端更新程序部署工具说起,浅谈qt中自定义控件制作和调用、TCP协议下文件的收发 、以及可执行文件的打包
一个简单的工具开发:从学生端更新程序部署工具说起,浅谈qt中ui的使用和TCP协议下文件的收发.以及可执行文件的打包 写在前面,Qt Designer是一个非常操蛋的页面编辑器,它非常的...怎么说呢 ...
- Vue3 企业级优雅实战 - 组件库框架 - 9 实现组件库 cli - 上
上文搭建了组件库 cli 的基础架子,实现了创建组件时的用户交互,但遗留了 cli/src/command/create-component.ts 中的 createNewComponent 函数,该 ...
- 使用IntelliJ IDEA打开一个项目步骤
目录 1.普通java项目 步骤一.使用IDEA打开一个新的项目 步骤二.设置项目的SDK 步骤三.设置项目的src为Resources Root 2.Maven项目 前三步同普通java项目相同 ...
- 关于Git在Visual studio及Git Bush中的日常操作教程,有图有说明,会一直更新本页内容... (Git相对SVN具有更加安全的分布式存储, 分支版本之间切换秒级速度, 分支版本强大灵活等特点)
>安装命令行和TortoiseGit UI程序. <git bash的安装> https://git-scm.com/downloads <windows可视化工具 Torto ...
- Git和Maven的学习笔记
Git 1.Git简介 Git 是一个免费的.开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种 项目. Git 易于学习,占地面积小,性能极快. 它具有廉价的本地库,方便的暂存区域和多个 ...
- kafka详解(01) - 概述
kafka详解(01) - 概述 定义:Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域. 消息队列 MQ传统应用场景之异步处理 使用消 ...
- [Leetcode]完全平方数
题目 代码 class Solution { public: int numSquares(int n) { vector<int> dp(n + 1, INT_MAX); dp[0] = ...
- 【Django drf】 序列化类常用字段类和字段参数 定制序列化字段的两种方式 关系表外键字段的反序列化保存 序列化类继承ModelSerializer 反序列化数据校验源码分析
目录 序列化类常用字段类和字段参数 常用字段类 常用字段参数 选项参数 通用参数 序列化类高级用法之source source填写类中字段 source填写模型类中方法 source支持跨表查询 定制 ...
- 【学习笔记】Tarjan 图论算法
- 前言 本文主要介绍 Tarjan 算法的「强连通分量」「割点」「桥」等算法. 争取写的好懂一些. - 「强连通分量」 - 何为「强连通分量」 在有向图中,如果任意两个点都能通过直接或间接的路径相互 ...