此插件借助kubernetescni插件中的bridge
和dhcp
, 实现了类似于虚拟机的桥接模式网络.
在此网络模型下创建的Pod可以获得宿主机网络的IP, Pod与宿主机网络中的主机可以直接通信.
此插件的工作流程十分简单, 只有如下两步:
- 创建bridge接口, 连接物理网卡与bridge, 然后修改路由(从物理网卡改为通过bridge设备);
- 启动dhcp服务守护进程(其实
dhcp
插件在工程代码中就给出了.service
服务脚本, 本来建议使用systemctl
将其作为服务启动的, 但是我更希望在Pod中集成这样的功能, 减少多余的操作).
修改kube-cni.yaml
文件中的--iface
选项为宿主机的主网卡名称(一般是eth0
), 然后使用kubectl apply -f kube-cni.yaml
即可.
本插件应该算是Underlay L2
的解决方案, 不适用于各种云环境, 而适用于自建IDC, Esxi虚拟机集群(需要交换机开启混杂模式), 本地Vmware虚拟机等场景.
+-----------------------------------------------------------+
| +-----------------------------------------------------+ |
| | Newwork Protocol Stack | |
| +------↑-----------------------↑-------------------↑--+ |
| | | | |
|.........|.......................|...................|.....|
| | | | |
| | +--------+ | +--------+ | |
| | | pod1 | | | pod2 | | |
| | +----↑---+ | +---↑----+ | |
| | └─────┐ | ┌─────┘ | |
| +-------↓-------+ +--↓--↓--↓--+ ***↓**** |
| | eth0 | | mybr0 | * dhcp * |
| |192.168.0.10/24| +-----------+ ***↓**** |
| +-------↑-------+ |
+---------|-------------------------------------------------+
↓
+-----------------------------------------------------------+
| +-----------------------------------------------------+ |
| | Newwork Protocol Stack | |
| +------------------------------↑-------------------↑--+ |
| | | |
|.................................|...................|.....|
| | | |
| +--------+ | +--------+ | |
| | pod1 | | | pod2 | | |
| +----↑---+ | +---↑----+ | |
| └─────┐ | ┌─────┘ | |
| +----↓--↓--↓----+ | |
| +-----------+ | mybr0 | ***↓**** |
| | eth0 |<------->|192.168.0.10/24| * dhcp * |
| +-----↑-----+ +---------------+ ******** |
+---------|-------------------------------------------------+
↓
在此网络模式中, 物理网卡eth0
退化为一条网线, 由mybr0
接管其原有IP, 对外连接物理网络, 各节点之间相当于通过交换机直接相连.
由于此插件使用桥接网络, 所以会使kubeadm --config
配置文件中的networking.podSubnet
字段(或是--pod-network-cidr
选项)失效.
在这种模式下, ServiceIP就会变得没有意义(虽然仍然有效).
编译
$ go build -o terway main.go
$ go build -o cni-terway ./cni/main.go