问题描述
在运行一个在pod中的flannel容器时,发现它获取了错误的子网,导致网络出现问题。具体表现为flannel从10.105.0.0/16中分配了/24的子网,而实际上应该从10.105.5.128/21中分配/26的子网。感谢任何帮助。
以下是详细信息:
/usr/bin/kubeadm init --kubernetes-version v1.7.5 --pod-network-cidr 10.105.5.128/21 --service-cidr 10.105.5.136/21 --token XXXXXXXXXXX
kube-flannel-rbac.yml在kube-flannel.yml之后加载,只修改了kube-flannel.yml中的一些位(SubenetLen和Network):
{
"Network": "10.105.5.128/21",
"SubnetLen": 26,
"Backend": {
"Type": "vxlan"
}
}
DNS在systemd文件中设置为:
--cluster-dns=10.105.5.136.10
使用的是Ubuntu 16.04 LTS和默认内核。
以下是docker daemon.json文件的内容:
{
"hosts": [
"fd://",
"0.0.0.0"
],
"ip-masq": false,
"experimental": true,
"registry-mirrors": [
"http://hub.xyz.com"
],
"insecure-registries": [
"http://hub.xyz.com"
],
"tls": true,
"tlsverify": true,
"tlscacert": "/etc/docker/ca.pem",
"tlscert": "/etc/docker/cert.pem",
"tlskey": "/etc/docker/key.pem"
}
所有的kubernetes组件都是从ubuntu k8s仓库安装的,版本为1.7.5。
以下是kube-flannel容器的日志:
I0926 03:29:10.214198 89 main.go:446] Determining IP address of default interface
I0926 03:29:10.216166 89 main.go:459] Using interface with name eth0 and address 10.105.5.12
I0926 03:29:10.216261 89 main.go:476] Defaulting external address to interface address (10.105.5.12)
I0926 03:29:10.242216 89 kube.go:283] Starting kube subnet manager
I0926 03:29:10.242055 89 kube.go:130] Waiting 10m0s for node controller to sync
I0926 03:29:11.242864 89 kube.go:137] Node controller sync successful
I0926 03:29:11.242957 89 main.go:226] Created subnet manager: Kubernetes Subnet Manager - kube-m2.XXXXX.com
I0926 03:29:11.242969 89 main.go:229] Installing signal handlers
I0926 03:29:11.243984 89 main.go:330] Found network config - Backend type: vxlan
I0926 03:29:11.288902 89 ipmasq.go:51] Adding iptables rule: -s 10.105.0.0/21 -d 10.105.0.0/21 -j RETURN
I0926 03:29:11.306692 89 ipmasq.go:51] Adding iptables rule: -s 10.105.0.0/21 ! -d 224.0.0.0/4 -j MASQUERADE
I0926 03:29:11.314413 89 ipmasq.go:51] Adding iptables rule: ! -s 10.105.0.0/21 -d 10.105.0.0/24 -j RETURN
I0926 03:29:11.323229 89 ipmasq.go:51] Adding iptables rule: ! -s 10.105.0.0/21 -d 10.105.0.0/21 -j MASQUERADE
I0926 03:29:11.329676 89 main.go:279] Wrote subnet file to /run/flannel/subnet.env
I0926 03:29:11.329746 89 main.go:284] Finished starting backend.
I0926 03:29:11.329829 89 vxlan_network.go:56] Watching for L3 misses
I0926 03:29:11.329903 89 vxlan_network.go:64] Watching for new subnet leases
解决方案
请注意以下操作注意版本差异及修改前做好备份。
方案1
你对CIDR的理解可能有误。10.105.5.128/21只是10.105.0.0 – 10.105.7.255范围内的一个地址。
所以,要么你的CIDR位数不是你期望的,10.105.5.128/26将是一个有效的网络定义,但它是10.105.0.0/21中的一个/26子网,要么你没有使用正确的网络定义。
你可以在这个非常有帮助的网站上检查这些划分(链接已经使用了你上面的网络)。
方案2
使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。你可以使用docker run
命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。
示例:
以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:
#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b
在这个示例中,我们首先使用docker run
命令启动容器A,并将其命名为container_a
。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo
命令来测试)。一旦容器A就绪,我们再使用docker run
命令启动容器B,并将其命名为container_b
。