惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Jina AI
Jina AI
博客园 - 司徒正美
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
J
Java Code Geeks
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
爱范儿
爱范儿
美团技术团队
腾讯CDC
博客园 - Franky
MyScale Blog
MyScale Blog
人人都是产品经理
人人都是产品经理
罗磊的独立博客
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
aimingoo的专栏
aimingoo的专栏
博客园_首页
V
V2EX
Martin Fowler
Martin Fowler
T
The Blog of Author Tim Ferriss

陈少文的网站

巨变与机遇的未来十年 Kubernetes 平台管理软件压力测试方案 使用镜像部署 Hexo 静态页面 终于等到你 - GitHub 镜像仓库服务(ghcr.io) 一起来学 Go --(6)Interface 一起来学 Go --(5)Goroutine 和 Channel 什么是函数式编程 如何在 Kubernetes 集群集成 Kata 柯里化与偏函数 使用 PyGithub 自动创建 Label 软件产品是团队能力的输出 Helm 2 、Helm 3 比较 IoT 变现 Kubernetes 中的 DNS 服务 国内的 Helm 镜像源 Harbor 使用自签证书支持 Https 访问 DevOps 工具链之 Prow 如何使用 kfctl 安装 Kubeflow VS Code 无法下载 Go 插件的工具包 工程师更应具有服务精神 你不知道的 Docker 使用技巧 使用 Docker 运行 Tensorflow 论中国 什么是左移 如何清空 Git 仓库全部历史记录 一禅小和尚 有风吹过厨房 时间的玫瑰 如何在 CentOS 安装 GPU 驱动 开发 Tips(19)
Kubernetes 之网络
微信公众号 · 2019-07-28 · via 陈少文的网站

1. Docker 的网络模型

1.1 bridge 模式

默认使用 bridge 模式,也可以使用 --net=bridge 指定 bridge 模式。

bridge 模式下,容器连接到同一个虚拟网桥 docker0 上。docker0 通常会占用 172.17.0.1/16 网段。同一个网桥上的容器之间,可以通过 ip 直接通信。

1.2 host 模式

使用 --net=host 指定 host 模式。

host 模式,容器与主机共享 Network Namespace。容器直接使用主机的 IP 地址,同时,可以查看主机上的所有网络设备。

1.3 none 模式

使用 --net=none 指定,none 模式。

none 模式为容器分配 Network Namespace,但是不对容器进行任何网络配置。也就是说,容器没有网卡、IP、路由等网络配置。

1.4 container 模式

使用 --net=container:container_id/container_name 指定 container 模式。

container 模式可以指定与另外一个已经存在的容器,共享 IP、端口等网络资源。这两个容器之间除了网络相同,其他都是隔离的,可以通过 IO 网卡进行通信。

2. Kubernetes 的网络模型

2.2 Kubernetes 网络的基本原则

每个 Pod 都拥有一个独立的 IP 地址。所有的 Pod 都在一个可以直接连通的、扁平的网络空间中。

用户不需要额外考虑如何建立 Pod 之间的连接,也不需要考虑将容器端口映射到主机端口等问题。

所有的容器都可以在不用 NAT 的方式下与其他的容器通信;所有节点都可以在不用 NAT 的方式下与所有容器通信;容器的地址和别人看到的地址是同一个地址。

2.1 Kubernetes 中的 IP 类型

Kubernetes 中的 IP 有三种:

  • Pod IP

IP per Pod,每个 Pod 启动时,会自动创建一个镜像为 gcr.io/google_containers/pause 的容器,容器内部与外部的通信经由此容器代理,该容器的 IP 就是 Pod IP 。

  • Cluster IP

Cluster IP 并不与实际网卡或虚拟设备绑定,而是 Iptables 规则。例如,Service Cluster IP 就是由 kube-proxy 使用 Iptables 规则重定向到其本地端口,再负载均衡到后端 Pod 上。

  • 外部 IP

上面的 IP 都是用于内部通信,对于外部服务,需要暴露一个外部可以访问的 IP,通常是代理节点的物理 IP 地址。这里同样需要借助 kube-proxy 和 Iptables 将流量转发到后端 Pod 上。

3. Kubernetes 中的网络场景

3.1 同一个 Pod 内的容器

Pod 内的容器共享同一个网络空间,容器之间的通信可以用 localhost 地址 + 容器端口实现。

3.2 同一个 Node 内的容器

docker0 是同一个 Node 中 Pod 的路由。Pod 的地址网段相同,可以进行直接通信。

3.3 不同 Node 内的容器

不同 Node 间容器通信,通过将 Pod 的 IP 和所在的 Node 的 IP 关联起来实现。

Node 之间的通信,通过其网卡转发实现。要求对整个集群的 Pod-IP 分配需要进行规划,Pod 的 IP 地址不能冲突。

4. 两种网络模型: CNI,CNM

CNM 与 Docker 绑定紧密。CNI 兼容其他容器技术(例如,rkt)及上层编排系统(Kubernetes 、Mesos),社区更活跃。

4.1 CNI

CNI 是 CoreOS 和 Google 公司主导制定的网络模型。这个模型定义了两个组件,容器管理、网络插件。它们之间通过 Json 格式通信,实现容器的网络功能。插件实现具体功能。

4.2 CNM

CNM 是 Docker 公司主导的网络模型,Libnetwork 是 CNM 规范的实现,Libnetwork 提供了 Docker 守护程序和网络驱动程序之间的接口。网络控制器负责将驱动程序与网络配对。每个驱动程序负责管理其拥有的网络,包括提供给该网络的服务。每个网络有一个驱动程序,多个驱动程序可以与连接到多个网络的容器同时使用。

4.3 CNI 插件

  • Flannel

Flannel 是 CoreOS 开发的项目。相较于其他插件,Flannel 更容易安装和配置。Flannel 使用 Overlay 创建网络。

  • Calico

Calico 的功能更加全面,不仅提供主机与 Pod 之间的网络连接,还涉及网络安全和管理。

Calico 使用 BGP 路由协议在主机之间路由数据包,性能更好。除此,Calico 还提供了强大的网络策略配置,允许用户自由配置转发规则。

  • Canal

Canal 试图将 Flannel 提供的网络层与 Calico 的网络策略功能集成在一起。

5. 参考