更改 Kubernetes docker-for-desktop 集群网络 ip

Posted

技术标签:

【中文标题】更改 Kubernetes docker-for-desktop 集群网络 ip【英文标题】:Change Kubernetes docker-for-desktop cluster network ip 【发布时间】:2019-05-04 13:03:19 【问题描述】:

我正在尝试在 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。

我在这里面临的问题是我在一个 *** 中,它与 kubernetes 默认网络 (10.1.0.0/16) 具有相同的网络 IP,所以如果我尝试 ping 一个位于 *** 下的主机,我从中使用的容器我在做 ping 一直说Destination Host Unreachable

我正在运行 Docker Desktop(在 Windows Pro 下)版本 2.0.0.0-win81 (29211) 频道:stable Build:4271b9e。

Kubernetes 由 Docker 桌面提供

来自官方documentation我知道了

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

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

【问题讨论】:

您能否添加有关集群配置的更多信息,例如您使用哪个网络插件?你用的是什么 Kubernetes 安装程序? 添加了更多信息@ArtemGolenyaev,谢谢 我不确定这种适用于 Windows 的 Kubernetes 安装,通常 Kubernetes 不仅使用 Docker 网络,还使用网络插件。这是列表kubernetes.io/docs/concepts/cluster-administration/addons可能需要更深入地查看此类设置 我正在为完全相同的问题而苦苦挣扎(但在 MacOS 上),所以如果你想出任何办法来解决它,我很高兴听到 :) 有这方面的消息吗?抄送@SaskiaKeil :) 【参考方案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 展示了一种解决方法,我对其进行了一些修改以供阅读:

    禁用 Kubernetes 重新启动 Docker for-win 以从“疑难解答”屏幕(带有错误图标的屏幕)单击“重新启动” - guillaumerose 的解决方法中缺少此步骤,见下文 docker run -it --privileged --pid=host justincormack/nsenter1 并编辑 /var/lib/cni/conf/10-default.conflist。将提到的10.1.0.0/16 更改为您想要的网络。不要忘记网关和 dns 启用 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!每当 docker 重新启动时,10-default.conflist 都会被重置/恢复

是的,每次 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 的内容会恢复为出厂默认设置,我很想知道这是为什么以及如何解决最后一个烦人的问题。

【讨论】:

【参考方案2】:

在 Windows 上,编辑此文件以获得永久修复:

%AppData%\Docker\cni\10-default.conflist

【讨论】:

【参考方案3】:

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

为什么要为 Docker 内置的 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 容器中运行。我不认为我会回去......

【讨论】:

【参考方案4】:

您是否重新启动了 docker-for-desktop 或整个计算机?您是否在应该在您的计算机上创建的 docker 网络适配器中看到了那些新的网络设置? 如果这些网络更改没有反映在您计算机上的虚拟网络适配器上,那么这些更改不知何故没有应用。尝试卸载 docker-for-desktop 或 kubernetes 服务。

如果该虚拟网络确实有这些更改,或者可能已在您的计算机上为 kubernetes 创建了第二个网络适配器,您可能需要重新安装 kubernetes 服务。 Kubernetes 使用网络特定的配置,它是在安装服务时获得的。

【讨论】:

以上是关于更改 Kubernetes docker-for-desktop 集群网络 ip的主要内容,如果未能解决你的问题,请参考以下文章

Kubernetes 更新更改了 Google Cloud 中节点的静态+保留外部 IP

Skaffold Kubernetes 不显示 React 更改

当我们扩展 kubernetes 部署并更改其中一个 pod 或容器配置时会发生啥?

在暂停部署期间更改副本立即创建/删除 pod,但在 kubernetes 官方文档中未指定

更改 Kubernetes docker-for-desktop 集群网络 ip

如何更改 Kubernetes cronjob 的计划或如何手动启动它?