Kubernetes

KVM(Hypervisor) 기반으로 Kubernetes 클러스터 구축하기 2편

[혜안] 2024. 3. 19. 18:02
728x90

지난 포스팅에 이어서,

위와같은 환경으로 만들어보겠습니다.

핵심은 저 물음표와 같이 물리적으로 서로다른 Host OS 내부에 NAT로 구성된 Node들을 어떻게 클러스터링 할 수 있는가 입니다.

 

우선 그 전에 Host OS에서 아래와 같이 네트워크 인터페이스가 구성되어 있는지 확인합니다.

ip addr
...
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 58:58:58:58:58:58 brd ff:ff:ff:ff:ff:ff
    inet 192.168.123.2/24 metric 100 brd 192.168.123.255 scope global dynamic eth0
       valid_lft 41sec preferred_lft 41sec
    inet6 fe80::fe80:fe80:fe80:fe80/64 scope link
       valid_lft forever preferred_lft forever
...
6: virbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 52:54:00:50:50:50 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.200/29 brd 192.168.100.207 scope global virbr0
       valid_lft forever preferred_lft forever
...

Host OS의 물리 네트워크 인터페이스는 eth0 입니다. 이름은 다를 수 있습니다. 실제 IP를 물고있는 인터페이스를 찾으시면 됩니다.

Guest OS들을 위한 가상 네트워크 인터페이스는 virbr0 입니다. KVM을 설치하면 기본으로 생성됩니다.

이 두 인테페이스 간의 라우팅과 iptables를 조절하여 원하는 결과를 얻을 수 있습니다.

 

라우팅 테이블

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.100.200 0.0.0.0         255.255.255.248 U     0      0        0 virbr0
192.168.100.208 192.168.123.3   255.255.255.248 UG    200    0        0 eth0
192.168.100.216 192.168.123.4   255.255.255.248 UG    201    0        0 eth0

Host OS #01번의 라우팅 테이블입니다.

각 행별 의미를 보자면 아래와 같습니다.

192.168.100.200 0.0.0.0         255.255.255.248 U     0      0        0 virbr0
→ 192.168.100.200~207까지의 노드를 찾아가려면 virbr0 인터페이스로 보내라는 설정입니다. KVM이 설치되면 기본으로 추가되는 라우팅이므로 따로 추가할 필요는 없습니다.

192.168.100.208 192.168.123.3   255.255.255.248 UG    200    0        0 eth0
  192.168.100.208~215까지의 노드를 찾아가려면 192.168.123.3 Host를 경유하라는 설정입니다.

192.168.100.216 192.168.123.4   255.255.255.248 UG    201    0        0 eth0
  192.168.100.216~223까지의 노드를 찾아가려면 192.168.123.4 Host를 경유하라는 설정입니다.

아래 커맨드로 적용 가능합니다.

라우팅 테이블 설정 방법

ip r add 192.168.100.208/29 via 192.168.123.3
ip r add 192.168.100.216/29 via 192.168.123.4

영구저장은 아래 파일에 설정하면 됩니다.

sudo vi /etc/netplan/00-installer-config.yaml
...
   routes:
   - to: 192.168.100.208/29
     via: 192.168.123.3
     metric: 200
   - to: 192.168.100.216/29
     via: 192.168.123.4
     metric: 201
...

 

그리고 iptables 설정도 필요합니다.

iptables

sudo iptables -nvL FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
...
    2   267 ACCEPT     icmp --  eth0   virbr0  0.0.0.0/0            0.0.0.0/0
  21M 7773M ACCEPT     udp  --  eth0   virbr0  0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     tcp  --  eth0   virbr0  0.0.0.0/0            0.0.0.0/0
...

Host OS의 기본 인터페이스인 eht0로 들어오는 tcp, udp, icmp 패킷을 virbr0로 포워딩하는 설정입니다.

iptables 설정 방법

#인터페이스 포워딩
iptables -I FORWARD -i eth0 -p tcp -o virbr0 -j ACCEPT
iptables -I FORWARD -i eth0 -p udp -o virbr0 -j ACCEPT
iptables -I FORWARD -i eth0 -p icmp -o virbr0 -j ACCEPT

#포워딩 허용
iptables -I FORWARD -m state -p tcp -d 192.168.100.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -m state -p tcp -d 192.168.123.0/24 --state NEW,RELATED,ESTABLISHED -j ACCEPT

#저장
iptables-save

 

지난번 포스트를 참조하여 Host #02, Host #03 설정을 마치고, 마찬가지로 위 설정들도 적용해주면 멀티 호스팅 환경에서 Guest OS들의 클러스터링이 가능합니다.

물론 K8s-base 이미지는 반복해서 만들 필요없이 Host #01 에서 생성한 k8s-base.qcow2 파일을 복사해서 재활용하시면 됩니다.

확인방법

설정 했으면, 제대로 노드들을 찾아가는지 traceroute를 설치하고 확인해볼 수 있습니다.

Control Plane Node(192.168.100.201)에 traceroute를 설치하고 Worker Node #04(192.168.100.210)로 routetrace한 결과입니다.

sudo apt install traceroute
traceroute 192.168.100.210
...
traceroute to 192.168.100.210 (192.168.100.210), 30 hops max, 60 byte packets
 1  192.168.100.200 (192.168.100.200)  0.544 ms  0.469 ms  0.442 ms
 2  192.168.123.3 (192.168.123.3)  0.689 ms  0.671 ms  0.656 ms
 3  192.168.100.210 (192.168.100.210)  1.385 ms  1.370 ms  1.356 ms

Node에서 Host로 올라가서 라우팅 테이블에 설정한대로 192.168.123.3을 통해 192.168.100.210에 도달했습니다.

아래 그림과 같습니다.

 

추가로,

이렇게 NAT로 구성되어 있는 클러스터는 NodePort로 서비스를 expose하더라도 NAT 내부에서만 접근할 수 있습니다.

Host OS 레벨에 존재하는 외부 클라이언트 들이 접속하게 하려면 Host OS 레벨에 무언가 포워딩해줄 수 있는 장치가 필요합니다.

위와 같이 특정 사용자가 K8s 의 서비스에 접근하려면 Host OS #01에서 Guest OS 쪽으로 패킷 포워딩을 해주어야 한다는 이야기 입니다.

사용자의 PC에 라우팅테이블을 설정할 수는 없으니까요.

방법은 몇가지가 있습니다.

우선 제일 빠르게 설정할 수 있는 방법은 iptables의 PREROUTING 입니다.

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.100.201:30080

위와 같이 설정하게되면, Host가 80포트로 받는 패킷은 무조건 192.168.100.201의 30080포트로 포워딩 됩니다.

하지만 iptables는 기능이 너무 막강해서 자기 자신의 인터페이스를 경유하는 모든 패킷을 포워딩 시켜버립니다.

즉 192.168.100.201에서 나오는 80포트 트래픽 조차 되돌려보낼 수 있습니다.

때문에 되도록이면 iptables 의 설정보다는 별도 reverse proxy 서비스를 설치하는게 좋습니다.

 

728x90