为 kubesystem pods 指定网络接口

为 kubesystem pods 指定网络接口

我使用 vagrant boxes 创建了一个虚拟 Kubernetes 集群。我的所有 box 都有 2 个网络接口

2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 02:1d:76:b3:3c:fe brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global enp0s3
   valid_lft forever preferred_lft forever
inet6 fe80::1d:76ff:feb3:3cfe/64 scope link 
   valid_lft forever preferred_lft forever
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 08:00:27:35:39:9f brd ff:ff:ff:ff:ff:ff
inet 192.168.70.11/24 brd 192.168.70.255 scope global enp0s8
   valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe35:399f/64 scope link 
   valid_lft forever preferred_lft forever

enp0s3 是默认创建的,并且在所有盒子上具有相同的 ip 地址。显然这是一个虚拟盒子的东西https://github.com/hashicorp/vagrant/issues/6456。我添加了 enp0s8 接口作为私有网络,以允许我的盒子互相通信,这个接口在每个盒子上都有不同的 IP,所以我想将它用于 kubernetes。

当我设置集群时,我使用了这个命令,它允许我在第一个节点上创建集群并加入第二个节点

$ kubeadm init --apiserver-advertise-address=192.168.70.11 --pod-network-cidr=10.244.0.0/16

问题是所有 kube-system pod 仍在使用 enp0s3 接口

$ kubectl -n kube-system get pods -owide
NAME                             READY     STATUS    RESTARTS   AGE       IP           NODE
coredns-78fcdf6894-8tpnc         1/1       Running   0          11m       10.244.0.2   node-1
coredns-78fcdf6894-tbqxk         1/1       Running   0          11m       10.244.0.3   node-1
etcd-node-1                      1/1       Running   0          10m       10.0.2.15    node-1
kube-apiserver-node-1            1/1       Running   0          10m       10.0.2.15    node-1
kube-controller-manager-node-1   1/1       Running   0          10m       10.0.2.15    node-1
kube-flannel-ds-5wm74            1/1       Running   0          11m       10.0.2.15    node-2
kube-flannel-ds-wx77l            1/1       Running   0          11m       10.0.2.15    node-1
kube-proxy-gmst8                 1/1       Running   0          11m       10.0.2.15    node-2
kube-proxy-sbqqs                 1/1       Running   0          11m       10.0.2.15    node-1
kube-scheduler-node-1            1/1       Running   0          10m       10.0.2.15    node-1

我想强制 kubernetes 独占使用 enp0s8。有没有办法在不删除 enp0s3 接口的情况下做到这一点?

节点的样子如下

$ kubectl get nodes -owide
NAME      STATUS    ROLES     AGE       VERSION   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
node-1    Ready     master    4m        v1.11.2   <none>        Ubuntu 16.04.5 LTS   4.4.0-134-generic   docker://17.3.2
node-2    Ready     <none>    3m        v1.11.2   <none>        Ubuntu 16.04.5 LTS   4.4.0-134-generic   docker://17.3.2

这是版本信息

$ sudo KUBECONFIG=/etc/kubernetes/admin.conf kubectl version
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:17:28Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.2", GitCommit:"bb9ffb1654d4a729bb4cec18ff088eacc153c239", GitTreeState:"clean", BuildDate:"2018-08-07T23:08:19Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}

答案1

GitHub 上有一个与您的问题相关的 Issue:kubelet 报告错误的 IP 地址 #44702

讨论结束时,玉菊红 解释为什么会发生这种情况:

kubelet 使用云提供商报告的 IP 地址如果存在,或者第一个非环回 IPv4 地址(代码在这里)(如果没有云提供商)。此外,它可能会被 kubelet 标志覆盖。

我已将引文中的链接更新为 v1.11。以下是代码v1.11 的评论:

    // 1) Use nodeIP if set
    // 2) If the user has specified an IP to HostnameOverride, use it
    // 3) Lookup the IP from node name by DNS and use the first valid IPv4 address.
    //    If the node does not have a valid IPv4 address, use the first valid IPv6 address.
    // 4) Try to get the IP from the network interface used as default gateway

代码注释中提到的 kubelet 选项均复制自kubelet 文档

  1. --node-ip 字符串 - 节点的 IP 地址。如果设置,kubelet 将使用此 IP 地址作为节点
  2. --hostname-override 字符串 - 如果非空,将使用此字符串作为标识而不是实际主机名。

如果我们看看代码,我们将会看到需要 IPv4 或 IPv6地址在这里:

if addr := net.ParseIP(kl.hostname); addr != nil

最后两个选项对于你的情况来说不是很方便和可靠,所以我跳过了它们。

第一个选项也是由直流电压在里面评论并得到了积极的反馈:

如果您没有使用云提供商,请尝试修改 kubelet 命令行选项以传递“--node-ip=”或在 kubelet 配置 yaml 文件中设置 NodeIP 配置。

无论如何,由您来选择最适合您的。

相关内容