我使用 vagrant box 建立了一個虛擬 kubernetes 叢集。我所有的盒子都有 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 上有一個問題與您的問題相關: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 文件:
- --node-ip string - 節點的 IP 位址。如果設置,kubelet 將使用該節點的 IP 位址
- --hostname-override string - 如果非空,將使用此字串作為識別而不是實際的主機名稱。
如果我們看一下程式碼,我們會看到它需要 IPv4 或 IPv6地址在這裡:
if addr := net.ParseIP(kl.hostname); addr != nil
最後兩個選項在您的情況下使用起來不是很方便和可靠,所以我跳過了它們。
如果您不使用雲端供應商,請嘗試修改 kubelet 命令列選項以傳遞「--node-ip=」或在 kubelet 設定 yaml 檔案中設定 NodeIP 配置。
無論如何,您可以選擇最適合您的。