kubernetes单Master集群部署--部署flannel网络(4)
作者:@skyflask
转载本文请注明出处:https://www.cnblogs.com/skyflask/articles/11357316.html
目录
1、kubernetes网络模型
2、原理说明
3、定义子网
5、查看flannel路由信息
6、检查和测试flannel
7、部署脚本化
1、kubernetes网络模型
Container Network Interface(CNI)容器网络接口,由Google和coreOS主导。
kubernetes网络模型设计基本要求:
- 一个pod一个ip
- 每个pod独立IP,pod内所有容器共享网络(同一个IP)
- 所有容器都可以与其他容器通信
- 所有节点都可以与所有容器通信
简言之:所有ip都是可以通信的!
2、原理说明
Overlay NetWork:覆盖网络,在基础网络上叠加的一种虚拟网络技术模式,改网络中的主机通过虚拟链路连接起来。
flannel:是overlay网络的一种,也是将源数据包封装在另一种网络包里面进行路由转发和通信,目前已经支持UDP、HOST/GW、VXLAN、AWS VPC和GCE路由等数据转发方式。
HOST/GW同一网段
VXLAN可跨网络
Flannel为每个host分配一个subnet,容器从这个subnet中分配IP,这些IP可以在host间路由,容器间无需使用nat和端口映射即可实现跨主机通信
每个subnet都是从一个更大的IP池中划分的,flannel会在每个主机上运行一个叫flanneld的agent,其职责就是从池子中分配subnet
Flannel使用etcd存放网络配置、已分配 的subnet、host的IP等信息
Flannel数据包在主机间转发是由backend实现的,目前已经支持UDP、VxLAN、host-gw、AWS VPC和GCE路由等多种backend
数据流过程:
-
容器直接使用目标容器的ip访问,默认通过容器内部的eth0发送出去。
-
报文通过veth pair被发送到vethXXX。
-
vethXXX是直接连接到虚拟交换机docker0的,报文通过虚拟bridge docker0发送出去。
-
查找路由表,外部容器ip的报文都会转发到flannel0虚拟网卡,这是一个P2P的虚拟网卡,然后报文就被转发到监听在另一端的flanneld。
-
flanneld通过etcd维护了各个节点之间的路由表,把原来的报文UDP封装一层,通过配置的iface发送出去。
-
报文通过主机之间的网络找到目标主机。
-
报文继续往上,到传输层,交给监听在8285端口的flanneld程序处理。
-
数据被解包,然后发送给flannel0虚拟网卡。
-
查找路由表,发现对应容器的报文要交给docker0。
-
docker0找到连到自己的容器,把报文发送过去。
3、定义子网
Falnnel要用etcd存储自身一个子网信息,所以要保证能成功连接Etcd,写入预定义子网段:
1 2 3 4 | /opt/etcd/bin/etcdctl \ --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem \ --endpoints= "https://10.11.97.191:2379,https://10.11.97.192:2379,https://10.11.97.71:2379" \ set /coreos.com/network/config '{ "Network": "172.17.0.0/16", "Backend": {"Type": "vxlan"}}' |
4、部署flannel
以下部署步骤在规划的每个node节点都操作。
下载二进制包:
1 2 3 | # wget https://github.com/coreos/flannel/releases/download/v0.10.0/flannel-v0.10.0-linux-amd64.tar.gz # tar zxvf flannel-v0.9.1-linux-amd64.tar.gz # mv flanneld mk-docker-opts.sh /opt/kubernetes/bin |
配置Flannel:
cat /opt/kubernetes/cfg/flanneld
1 | FLANNEL_OPTIONS= "--etcd-endpoints=https://10.11.97.191:2379,https://10.11.97.192:2379,https://10.11.97.71:2379 -etcd-cafile=/opt/etcd/ssl/ca.pem -etcd-certfile=/opt/etcd/ssl/server.pem -etcd-keyfile=/opt/etcd/ssl/server-key.pem" |
systemd管理Flannel:
cat /usr/lib/systemd/system/flanneld.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | [Unit] Description=Flanneld overlay address etcd agent After=network-online.target network.target Before=docker.service [Service] Type=notify EnvironmentFile=/opt/kubernetes/cfg/flanneld ExecStart=/opt/kubernetes/bin/flanneld --ip-masq $FLANNEL_OPTIONS ExecStartPost=/opt/kubernetes/bin/mk-docker-opts.sh -k DOCKER_NETWORK_OPTIONS -d /run/flannel/subnet.env Restart= on -failure [Install] WantedBy=multi-user.target |
配置Docker启动指定子网段:
cat /usr/lib/systemd/system/docker.service
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | [Unit] Description=Docker Application Container Engine Documentation=https: //docs.docker.com After=network-online.target firewalld.service Wants=network-online.target [Service] Type=notify EnvironmentFile=/run/flannel/subnet.env ExecStart=/usr/bin/dockerd $DOCKER_NETWORK_OPTIONS ExecReload=/bin/kill -s HUP $MAINPID LimitNOFILE=infinity LimitNPROC=infinity LimitCORE=infinity TimeoutStartSec=0 Delegate=yes KillMode=process Restart= on -failure StartLimitBurst=3 StartLimitInterval=60s [Install] WantedBy=multi-user.target |
重启flannel和docker:
# systemctl daemon-reload
# systemctl start flanneld
# systemctl enable flanneld
# systemctl restart docker
5、查看flannel路由信息
1 | /opt/etcd/bin/etcdctl --ca-file=/opt/etcd/ssl/ca.pem --cert-file=/opt/etcd/ssl/server.pem --key-file=/opt/etcd/ssl/server-key.pem --endpoints= "https://10.11.97.191:2379,https://10.11.97.192:2379,https://10.11.97.71:2379" ls /coreos.com/network/subnets |
查看具体路由的分配:
可以看到,24网段分配在node01节点10.11.97.71上。
6、检查和测试flannel
检查是否生效:
确保docker0与flannel.1在同一网段。
测试不同node之间互ping是通的。
node02节点:
在node02节点上ping node01节点:
在node01节点上ping node02节点:
7、部署脚本化
脚本地址:https://github.com/loveqx/k8s-study/blob/master/flannel/flannel.sh
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」