kubesystem 포드에 대한 네트워크 인터페이스 지정

kubesystem 포드에 대한 네트워크 인터페이스 지정

방랑 상자를 사용하여 가상 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 포드가 여전히 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 string - 노드의 IP 주소입니다. 설정되면 kubelet은 노드에 이 IP 주소를 사용합니다.
  2. --hostname-override string - 비어 있지 않은 경우 실제 호스트 이름 대신 이 문자열을 ID로 사용합니다.

우리가 살펴보면암호, 우리는 그것을 볼 것입니다IPv4 또는 IPv6가 필요합니다.여기 주소:

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

마지막 두 가지 옵션은 귀하의 경우에는 사용하기에 매우 편리하지도 않고 신뢰할 수도 없으므로 건너뛰었습니다.

첫 번째 옵션도 제안했습니다.dcbw에서논평긍정적인 피드백을 받았습니다:

클라우드 공급자를 사용하지 않는 경우 kubelet 명령줄 옵션을 수정하여 "--node-ip="를 전달하거나 kubelet config yaml 파일에서 NodeIP 구성을 설정해 보세요.

어쨌든 가장 적합한 것을 선택하는 것은 귀하에게 달려 있습니다.

관련 정보