쿠버네티스 일반/Diamanti

Diamanti 핵심 기능 - SR-IOV

Jerry_이정훈 2021. 7. 6. 10:06
728x90

디아만티 2가지 핵심 기능(SR-IOV, Local NVMe Disk) 중 첫번째 Network SR-IOV 기능을 소개해 드리겠습니다.

 

쿠버네티스 환경에서 네트워크를 구성하려면 3rd party CNI(Container Network Interface) 솔루션 (Calico, Flannel 등)을 사용합니다. 모든 CNI는 기본적으로 아래와 같이 호스트 서버의 물리 NIC를 컨테이너 NIC로 iptables, network namespace 등의 기능을 통하여 매핑하는 구조입니다.

이런 경우 중간 단계에서 NAT를 사용해야 하며 그 과정에서 성능이 저하합니다. 그리고 추상화 과정이 필요하므로 네트워크에 익숙하지 않은 개발자 및 운영자 분들은 이해하기가 쉽지 않습니다. 무엇보다 문제가 발생할 경우 Troubleshooting이 용이하지 않습니다. (실제 쿠버네티스 운영 시 발생하는 네트워크 관련 문제는 늘 쉽지 않은 이슈 입니다.) 흔히 POD에서 나가는 것은 알겠는데, POD로 들어오는 건 이해하기 어렵다는 말을 하곤 합니다.

 

이를 해결하기 위하여 DIAMANTI는 성숙된 표준 기술인 SR-IOV(single root input/output virtualization)를 이용합니다. 자체 FPGA (Field-Programmable Gate Array) Chip 기반(Diamanti 특허)에서 SR-IOV를 구현하여 성능이 뛰어나며 CPU 성능 저하(offload)가 없습니다. 또한 Diamanti 자체 CNI를 제공하여 Kubernetes 환경에서 편리하게 사용 가능합니다. 

(Kubernetes 환경 SR-IOV CNI, Intel Multus https://github.com/intel/multus-cni

SR-IOV를 사용하여 POD에 마치 베어메털 혹은 VM에 IP를 할당하듯이 직접 VLAN 기반 IP를 할당하므로 관리가 용이합니다. 별도의 Bridge/Overlay 네트워크를 사용하지 않고 기존 Baremetal 서버 처럼 사용하는 IP 대역 그대로 POD에 적용이 가능합니다. 또한 3rd party 가 아닌 DIAMANTI 에서 직접 CNI Driver를 제공하므로 외부 업체에 맡기는 것이 아니라(혹은 별도 Enterprise Level Support 계약 체결) 소스 코드 업데이트 및 쿠베 버전 호환 등의 유지 보수 책임 역시 벤더가 가져가므로 안정적인 운영이 가능합니다.

 

당연히 물리 가상 NIC를 POD에 직접 할당(POD NIC MAC 주소와 Host Virtual MAC 주소 동일)하므로 latency가 빠릅니다. 노드 당 최대 40Gbps 까지 연결 가능하고 개별 POD는 최대 10Gbps까지 사용 가능합니다.

 

그럼, Demo 를 통하여 확인해 보겠습니다.

DIAMANTI 네트워크 구성

spkr@erdia22:~/02.k8s_code/90.Demo$ dctl network list
NAME             TYPE      START ADDRESS   TOTAL     USED      GATEWAY       VLAN      NETWORK-GROUP   ZONE
blue (default)   public    10.10.100.11    90        10        10.10.100.1   100
red              public    10.10.110.11    90        0         10.10.110.1   110

DIAMANTI 에서는 위와 같이 사전에 네트워크 대역을 구분하고 해당 네트워크 IP 대역을 개별 POD에 할당 가능 합니다. 일반적으로 기업 환경에서 WEB/WAS/DB/DMZ 등의 Zone 으로 구분되는데, 해당하는 IP 대역을 POD에 할당 가능합니다. POD Application에 따라서 이중 방화벽 등을 사용하는 DB는 DB IP 대역, Web 등은 DMZ 존에 할당 할 수 있습니다. 

Deployment YAML File 예제
spkr@erdia22:~/02.k8s_code/90.Demo$ cat 02.busybox-network-deploy.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: busybox-deployment
  labels:
    app: busybox
spec:
  replicas: 3
  selector:
    matchLabels:
      app: busybox
  template:
    metadata:
      labels:
        app: busybox
      annotations:
        diamanti.com/endpoint0: '{"network":"blue","perfTier":"high"}'
    spec:
      containers:
      - name: busybox
        image: busybox
        command:
        - sleep
        - "3600"

위 예제에서 확인 할 수 있듯이 DIAMANTI 에서는 사전에 정의된 네트워크 대역을 POD YAML 파일의 annotations으로 지정하여 IP를 할당합니다. (생략할 경우, Default Network IP 대역 할당) Apply 후 확인하면 아래와 같이 blue zone 으로 할당한 네트워크 대역 대의 IP(10.10.100.0/24)가 신규 생성한 busybox POD에 할당 되었습니다.

spkr@erdia22:~/02.k8s_code/90.Demo$ k get pods -o wide
NAME                                  READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
busybox-deployment-5b6f86bdc4-bxbg7   1/1     Running   16         16h   10.10.100.16   dia02   <none>           <none>
busybox-deployment-5b6f86bdc4-kn78k   1/1     Running   16         16h   10.10.100.15   dia03   <none>           <none>
busybox-deployment-5b6f86bdc4-sl9nb   1/1     Running   16         16h   10.10.100.17   dia04   <none>           <none>

해당 POD 에 접속하여 POD NIC 의 MAC 정보와 Baremetal Node 의 가상 NIC(vf) 의 MAC 정보 확인이 가능합니다.

위와 같이 POD NIC 의 MAC 정보( 8e:a2:00:28:60:31)가 물리 NODE(dia02)의 가상 NIC(vf 1)의 MAC 정보와 일치합니다. (DIAMANTI 에서는 내부적으로 POD 생성 시 NIC를 Node 의 가상 NIC에서 가져옵니다.)

 

다음으로 외부에서 POD로 바로 접속해 보겠습니다. 이번에는 편의를 위하여 NGINX 웹서버를 구동(apply) 하였습니다.

spkr@erdia22:~/02.k8s_code/90.Demo$ k get pod -o wide
NAME                                  READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
nginx-deployment-5c8bd85d6-n7sh2      1/1     Running   0          16h   10.10.100.20   dia02   <none>           <none>
nginx-deployment-5c8bd85d6-rdmmc      1/1     Running   0          16h   10.10.100.19   dia03   <none>           <none>

해당 POD IP 로 사무실(데이터센터) 내 외부 관리자 PC 에서 바로 접속 하겠습니다.

spkr@erdia22:~/02.k8s_code/90.Demo$ k get svc
NAME         TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
kubernetes   ClusterIP   10.0.0.1     <none>        443/TCP   4d23h
spkr@erdia22:~/02.k8s_code/90.Demo$ ip a show wifi0
3: wifi0: <BROADCAST,MULTICAST,UP> mtu 1500 group default qlen 1
    link/ieee802.11 d0:c6:37:a4:55:56
    inet 172.17.19.47/20 brd 172.17.31.255 scope global dynamic
       valid_lft 14396sec preferred_lft 14396sec
    inet6 fe80::e0b8:2d60:926b:9174/64 scope link dynamic
       valid_lft forever preferred_lft forever

 

위와 같이 Kubernetes 별도 Service (NodePort or LoadBalancer) 구성을 하지 않아도 외부 IP (172.17.19.47) 대역에서 해당 POD (10.10.100.20)로 바로 접속이 가능합니다. Host 의 가상 NIC 가 POD 로 직접 할당이 되므로 호스트 내부의 POD 접속이 마치 또 다른 Baremetal 서버에 접속 하듯이 가능합니다.

 

이를 Native Kube 환경이라면 다음과 같이 POD로 직접 접속이 불가능합니다.

[spkr@erdia22 04.yelb (ubuns:default)]$ k get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE    IP              NODE       NOMINATED NODE   READINESS GATES
nginx-6799fc88d8-997vp   1/1     Running   0          2m5s   10.233.104.38   ubun20-1   <none>           <none>
[spkr@erdia22 ~ (ubuns:default)]$ ping 10.233.104.38
PING 10.233.104.38 (10.233.104.38) 56(84) bytes of data.
^C
--- 10.233.104.38 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1065ms

[spkr@erdia22 ~ (ubuns:default)]$
[spkr@erdia22 ~ (ubuns:default)]$ curl 10.233.104.38
^C

위와 같이 overlay 네트워크 환경이라 POD에 접속하기 위해서는 별도의 서비스 설정이 필요합니다.

 

정리하면 Diamanti는 SR-IOV로 1) VLAN 기반 POD 별 IP 대역 분리 2) 추가 Kubernetes 서비스 설정(NodePort, LoadBalaner) 없이 POD 직접 접속 가능 3) Data 및 Management 네트워크 분리 기능을 제공하고 있습니다. 

 

감사합니다.

 

DIAMANTI 제품 관련 문의 : leejunghoon@spkr.co.kr

반응형

'쿠버네티스 일반 > Diamanti' 카테고리의 다른 글

Diamanti 특별 프로모션  (0) 2021.07.27
Diamanti - NVMe over Ethernet PVC  (0) 2021.07.06
Diamanti 기능 및 제공 서비스 내역  (0) 2021.07.04
Diamanti 제품 소개  (0) 2021.07.02