更改Kubernetes桌面专用docker集群网络ip

时间:2018-12-03 08:55:20

标签: docker networking kubernetes

我正在尝试在docker-for-desktops上配置Kubernetes,我想更改分配给容器的默认网络。

  

示例:默认网络为10.1.0.0/16,但我想要172.16.0.0/16

我将docker网络部分更改为Subnet address: 172.16.0.0 and netmask 255.255.0.0,但是集群继续分配网络10.1.0.0/16。 Network configuration

我在这里面临的问题是我所在的VPN具有与kubernetes默认网络(10.1.0.0/16)相同的网络IP,因此如果我尝试ping vpn下的主机,则该容器来自ping时常说Destination Host Unreachable

我正在运行Docker Desktop(在Windows Pro下)2.0.0.0-win81(29211)版本:稳定版本:4271b9e。

Kubernetes是从Docker桌面Kuberbetes

提供的

从官方documentation那里我知道

  

Kubernetes适用于Windows 18.02 CE Edge和更高版本以及18.06 Stable和更高版本的Docker,其中包括独立的Kubernetes服务器和客户端以及Docker CLI集成。 Kubernetes服务器在您的Docker实例中本地运行,不可配置,并且是单节点集群

这样说,Kubernetes是否应该使用底层docker的配置(例如网络,卷等)?

2 个答案:

答案 0 :(得分:1)

Kubernetes 也有一个它使用的子网和一个相应的网络设置,默认为 10.1.0.0/16,但此设置未在 Docker for-win UI 中公开。在 docker/for-win issue #1667: Can not access local network, with kubernetes installed 中,guillaumerose 展示了一种解决方法,我对其进行了一些改动以供阅读:

  1. 禁用 Kubernetes
  2. 重新启动 Docker for-win 以从“疑难解答”屏幕(带有错误图标的屏幕)中单击“重新启动”- guillaumerose 的解决方法中缺少此步骤,请参见下文
  3. docker run -it --privileged --pid=host justincormack/nsenter1 并编辑 /var/lib/cni/conf/10-default.conflist。将提到的 10.1.0.0/16 更改为您想要的网络。不要忘记网关和 dns
  4. 启用 Kubernetes

在第 3 步中,我像这样更改了 /var/lib/cni/conf/10-default.conflist

# diff -u 10-default.conflist.orig 10-default.conflist
--- 10-default.conflist.orig
+++ 10-default.conflist
@@ -10,11 +10,11 @@
       "hairpinMode": true,
       "ipam": {
         "type": "host-local",
-        "subnet": "10.1.0.0/16",
-        "gateway": "10.1.0.1"
+        "subnet": "10.250.0.0/16",
+        "gateway": "10.250.0.1"
       },
       "dns": {
-        "nameservers": ["10.1.0.1"]
+        "nameservers": ["10.250.0.1"]
       }
     },
     {

这是有效的。我现在可以 ping 10.1.119.43 使用 kubernetes。

OBS! 10-default.conflist 会在 docker 重新启动时重置/恢复

是的,每次 docker 重新启动时(例如,由于 Windows 重新启动),kubernetes 都会恢复使用 10.1.0.0/16,然后它再次被破坏。再次应用上述解决方法,它会再次起作用。

所以我个人有一个应用了上述补丁的 ~/10-default.conflist.250 文件,然后执行:

docker run -i --rm --privileged --pid=host justincormack/nsenter1 /bin/sh -c '/bin/cat > /var/lib/cni/conf/10-default.conflist' < ~/10-default.conflist.250

按照上面的第 3 步操作,而不是一遍遍地手动编辑文件。

每次重新启动 docker for-win 时都必须应用此解决方法,这很烦人,但总比不工作要好:-)。

关于禁用kubernetes后需要重启Docker for-win

我的经验是,当 kubernetes 重新启动并恢复使用 10.1.0.0/16 时,如果我跳过第 2 步 - “restart Docker for-win”步骤 - 尝试启动 kubernetes 需要超过 5 分钟之后我放弃等待。当我现在重新启动 docker 时(因为 kubernetes 处于错误状态),kubernetes 将被重新启用(再次使用 10.1.0.0/16),但现在我可以再次遵循解决方法(包括第 2 步)。因此,在禁用 kubernetes 和修改 10-default.conflist 之间重新启动 docker 可以使 kubernetes 的后续启动真正起作用。

如果有人知道为什么每次 docker 重新启动时 /var/lib/cni/conf/10-default.conflist 的内容都会恢复为出厂默认值,我很想知道为什么会这样以及如何解决最后一个烦人的问题。

答案 1 :(得分:0)

在花时间调查我的另一个答案后,一位同事建议:

<块引用>

为什么要为 Docker for-win 内置的 kubernetes 烦恼呢?

为什么不直接使用 "kind" - kubernetes-in-docker?

brew install kind
kind create cluster

# Cluster is ready for use:
kubectl --context kind-kind get -A pods

轰! Kubernetes 在 20 秒内运行。整个单节点 kubernetes 集群在单个 docker 容器中运行。我想我永远不会回去了...