kubesystem ポッドのネットワークインターフェースを指定する

kubesystem ポッドのネットワークインターフェースを指定する

Vagrant Boxを使用して仮想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 アドレスを持ちます。どうやらこれは仮想ボックスのようです。vagrant の最新バージョンは、 vagrant.github.com/hashicorp/vagrant/issues/6456 です。ボックス同士が通信できるように、enp0s8 インターフェイスをプライベート ネットワークとして追加しました。このインターフェイスはボックスごとに異なる IP を持っているため、Kubernetes に使用したいと思います。

クラスターをセットアップするときに、このコマンドを使用して、最初のノードにクラスターを作成し、2番目のノードに参加させることができました。

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

問題は、すべてのkube-systemポッドがまだ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 ドキュメント:

  1. --node-ip 文字列 - ノードのIPアドレス。設定されている場合、kubeletはノードにこのIPアドレスを使用します。
  2. --hostname-override 文字列 - 空でない場合、実際のホスト名の代わりにこの文字列を識別として使用します。

見てみるとコード、私たちはそれがIPv4またはIPv6を期待する住所はこちら:

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

最後の 2 つのオプションは、あなたのケースではあまり便利で信頼性が高くないので、スキップしました。

最初の選択肢は、dcbwの中にコメントそして肯定的なフィードバックを得ました:

クラウド プロバイダーを使用していない場合は、kubelet コマンドライン オプションを変更して "--node-ip=" を渡すか、kubelet 構成 yaml ファイルで NodeIP 構成を設定してみてください。

いずれにせよ、自分に最も合ったものを選択するのはあなた次第です。

関連情報