1. 配置准备
1. 准备一台服务器,保证此服务器所在的IPV6网段和目的服务器在同一个网段
2. 安装好K3S软件
1.1. 配置cni及容器内IPV6地址
我们称此步骤的服务器为:服务器A
K3S现在是用网桥连通容器和宿主机,网桥所在的网卡为cni0。(如果是用docker命令直接起的容器,网卡为docker0)
Cni作为中转网卡,需要注意:
- 它的IPV6以及IPV4网段均不能跟实际网卡的网段相同
- 容器内的IPV4,IPV6网段需与cni网段相同
接下来以一个实际例子为例。当前有一台通用服务器,配置前网卡信息如下:
1.1.1. 配置cni以及容器IPV6
- 将CNI的IPV6网段改成fe81::/64,使其与实际网卡不同,用于与实际网卡的fe80::/64通
删除原有IPV6:ip -6 addr del fe80::8c0c:56ff:fe8e:c447/64 dev cni0
增加新的IPV6:ip -6 addr add fe81::8c0c:56ff:fe8e:c447/64 dev cni0
2017:8:40:96::/64,用于与实际网卡的2016:8:40:96::/64通
ip -6 addr add 2017:8:40:96:c11::98/64 dev cni0
3. 配置容器IPV6
进入容器
(1) 打开IPV6开关:
修改/etc/sysctl.conf文件,增加
net.ipv6.conf.eth0.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0
运行sysctl –p生效
(2)将eth0的fe80::/64段的IPV6改成与cni同网段
验证与cni的IPV6是否通:ping6 fe81::8c0c:56ff:fe8e:c447
2017:8:40:96::/64段的地址,用于与cni的2017:8:40:96::/64段通
ip -6 addr add 2017:8:40:96:c11::99/64 dev eth0
验证连通性:
4. 容器内配置IPV6路由
查看路由命令: ip -6 route show
配置完IP后的路由为:
要和实际网卡通,就要加两条实际网卡IPV6的路由,用cni的IP为网关:
ip -6 route add fe80::/64 via fe81::8c0c:56ff:fe8e:c447
ip -6 route add 2016:8:40:96::/64 via 2017:8:40:96:c11::98
此时宿主机的路由为:
测试与实际网卡IPV6连通性:
1.1.2. 配置跨服务器路由
经过以上步骤,服务器A容器内部与宿主机已经通了。现在要配置跨服务器的网络通。
在我的测试环境中,跨服务器的IPV6是用2016:8:40:96::/64段通信的。此时,只需要在另一台服务器上配置一条路由,使其能跟2017:8:40:96::/64(cni网段)通,那么就能跟容器通。
我称另一台服务器为:服务器B
所以:在服务器B加一条到2017:8:40:96::/64的路由,网关为服务器A实际网卡的2016:8:40:96::/64段的IPV6地址:
注意:服务器A、B的IPV6要在同一局域网内
2. 遇到的问题
- SIOCSIFADDR: Permission denied问题
这是未打开IPV6权限,参考1.1.1中的第一步