2021-07-09 16:49:33 +08:00
|
|
|
|
# 网络
|
2018-02-05 22:12:32 +08:00
|
|
|
|
|
2021-12-23 20:07:44 +08:00
|
|
|
|
Kubernetes 中的网络可以说对初次接触 Kubernetes 或者没有网络方面经验的人来说可能是其中最难的部分。Kubernetes 本身并不提供网络功能,只是把网络接口开放出来,通过插件的形式实现。
|
2018-02-05 22:12:32 +08:00
|
|
|
|
|
2018-07-08 19:03:30 +08:00
|
|
|
|
## 网络要解决的问题
|
2018-02-05 22:12:32 +08:00
|
|
|
|
|
2021-12-23 20:07:44 +08:00
|
|
|
|
既然 Kubernetes 中将容器的联网通过插件的方式来实现,那么该如何解决容器的联网问题呢?
|
2018-02-05 22:12:32 +08:00
|
|
|
|
|
2021-12-23 20:07:44 +08:00
|
|
|
|
如果您在本地单台机器上运行 docker 容器的话会注意到所有容器都会处在 `docker0` 网桥自动分配的一个网络 IP 段内(172.17.0.1/16)。该值可以通过 docker 启动参数 `--bip` 来设置。这样所有本地的所有的容器都拥有了一个 IP 地址,而且还是在一个网段内彼此就可以互相通信了。
|
2018-02-05 22:12:32 +08:00
|
|
|
|
|
2021-12-23 20:07:44 +08:00
|
|
|
|
但是 Kubernetes 管理的是集群,Kubernetes 中的网络要解决的核心问题就是每台主机的 IP 地址网段划分,以及单个容器的 IP 地址分配。概括为:
|
2018-02-05 22:12:32 +08:00
|
|
|
|
|
2021-12-23 20:07:44 +08:00
|
|
|
|
- 保证每个 Pod 拥有一个集群内唯一的 IP 地址
|
|
|
|
|
- 保证不同节点的 IP 地址划分不会重复
|
|
|
|
|
- 保证跨节点的 Pod 可以互相通信
|
|
|
|
|
- 保证不同节点的 Pod 可以与跨节点的主机互相通信
|
2018-02-05 22:12:32 +08:00
|
|
|
|
|
2021-12-23 20:07:44 +08:00
|
|
|
|
为了解决该问题,出现了一系列开源的 Kubernetes 中的网络插件与方案,如:
|
2018-02-05 22:12:32 +08:00
|
|
|
|
|
2018-07-08 19:03:30 +08:00
|
|
|
|
- flannel
|
|
|
|
|
- calico
|
|
|
|
|
- contiv
|
2021-12-23 20:07:44 +08:00
|
|
|
|
- weave
|
2018-07-08 19:03:30 +08:00
|
|
|
|
- kube-router
|
|
|
|
|
- cilium
|
|
|
|
|
- canal
|
2018-02-05 22:12:32 +08:00
|
|
|
|
|
2021-12-23 20:07:44 +08:00
|
|
|
|
还有很多就不一一列举了(请见 [Awesome Cloud Native](https://jimmysong.io/awesome-cloud-native/#network)),只要实现 Kubernetes 官方的设计的 [CNI - Container Network Interface(容器网络接口)](cni.md) 就可以自己写一个网络插件。
|
2018-02-05 22:12:32 +08:00
|
|
|
|
|
2021-12-23 20:07:44 +08:00
|
|
|
|
下面仅以当前最常用的 flannel 和 calico 插件为例解析。
|
2018-02-05 22:12:32 +08:00
|
|
|
|
|
2021-12-23 20:07:44 +08:00
|
|
|
|
- [Kubernetes 中的网络:flannel](flannel.md)
|
|
|
|
|
- [Kubernetes 中的网络:calico](calico.md)
|