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

推荐订阅源

Recent Announcements
Recent Announcements
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Martin Fowler
Martin Fowler
The Cloudflare Blog
The Register - Security
The Register - Security
WordPress大学
WordPress大学
量子位
Vercel News
Vercel News
C
Check Point Blog
V
Visual Studio Blog
Microsoft Azure Blog
Microsoft Azure Blog
J
Java Code Geeks
B
Blog RSS Feed
Stack Overflow Blog
Stack Overflow Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
Apple Machine Learning Research
Apple Machine Learning Research
PCI Perspectives
PCI Perspectives
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
美团技术团队
Schneier on Security
Schneier on Security
O
OpenAI News
M
MIT News - Artificial intelligence
S
Secure Thoughts
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Application and Cybersecurity Blog
Application and Cybersecurity Blog
S
Security Affairs
雷峰网
雷峰网
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
小众软件
小众软件
MongoDB | Blog
MongoDB | Blog
云风的 BLOG
云风的 BLOG
N
News and Events Feed by Topic
大猫的无限游戏
大猫的无限游戏
Google DeepMind News
Google DeepMind News
Recorded Future
Recorded Future
S
Security @ Cisco Blogs
www.infosecurity-magazine.com
www.infosecurity-magazine.com
C
Cyber Attacks, Cyber Crime and Cyber Security
GbyAI
GbyAI
L
LINUX DO - 最新话题
The Last Watchdog
The Last Watchdog
C
CERT Recently Published Vulnerability Notes
aimingoo的专栏
aimingoo的专栏
V
V2EX
博客园 - 【当耐特】
Last Week in AI
Last Week in AI
P
Proofpoint News Feed
阮一峰的网络日志
阮一峰的网络日志

陈少文的网站

巨变与机遇的未来十年 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) 使用 Velero 备份 Kubernetes 集群 Kubernetes Cheat Sheet 开发 Tips(18) 如何构建一个 Java 工程 开发 Tips(17) KubeSpray 安装 Kubernetes 报错 ip in ansible_all_ipv4_addresses 基于 Kubernetes 和 Jenkins 搭建自动化测试系统 在 Kubernetes 上动态创建 Jenkins Slave 使用 Jenkins 进行服务拨测 开发 Tips(16) Kubernetes 签发 Ingress 证书及日常故障运维 Kubernetes 中 Deployment 的基本操作 Kubernetes 中的证书 如何使用 KubeBuilder 开发一个 Operator Kubernetes 1.6.0 安装问题汇总 镜像管理工具 -- Harbor 开发 Tips(15) Docker 如何拉取镜像 开发 Tips(14) 使用 Helm 安装 harbor 开发 Tips(13) 使用 S2I 构建云原生应用 在 Kubernetes 中使用 emptyDir、hostPath、localVolume 开发 Tips(12) 开发 Tips(11) 代码质量分析工具 SonarQube 使用 Kubeadm 安装 Kubernetes 集群 一起来学 Go --(4)常用函数 Kubernetes 中的 Ceph Kubernetes 之 Volumes Kubernetes 之 Labels、Selectors 开发 Tips(10) 开源正在重构商业模式 Kubernetes 之 API 使用 Helm 和 Operator 快速部署 Prometheus Kubernetes 复杂有状态应用管理框架 -- Operator Kubernetes 的包管理器 -- Helm 一起来学 Go --(3)Go Modules 如何一步一步地优化博客方案 kubectl 实用指南 Kubernetes 中的基本概念 搭建远程 Kubernetes 开发环境 大公司和小公司的 ToB 思路 开发 Tips(9) Go 入门指南 一起来学 Go --(2)数据与逻辑结构 如何预防 Web 富文本中的 XSS 攻击 django-xss-cleaner 云工作时代 一起来学 Go --(1)背景与特点 SaaS 开发团队的不同阶段 你不知道的 Git 使用技巧 输出既服务 微服务设计 继续奔跑 开发 Tips(8) 从账户安全到二次验证 Django 性能之数据库查询优化 Django 性能之分库分表 敏捷开发之研发流程 打造一致性的团队 开发 Tips(7) Pytest 进阶学习之 Mock PaaS 部署之 buildpack Go 开发配置 领域输出才是 PaaS 的核心竞争力 Pytest 入门学习 开发 Tips(6) 如何使用 Jenkins、Docker、GitLab 搭建 Django 自动化部署流程 开发 Tips(5)
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. 参考