Kubernetes flannel容器获取错误的网络

46次阅读
没有评论

问题描述

在运行一个在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

正文完