top of page
작성자 사진LoxiLB

loxilb & calico BGP 연동

최종 수정일: 2023년 6월 13일

이 문서에서는 calico CNI를 사용하는 kubernetes와 loxilb를 연동하는 방법을 설명합니다.


This article describes how to integrate loxilb using calico CNI in Kubernetes.


환경 -

이 예제에서는 kubernetes와 loxilb가 다음과 같이 연결되어 있다고 가정합니다.


kubernetes는 단순함을 위해서 단일 마스터 클러스터를 사용하며 모든 클러스터는 192.168.57.0/24 동일한 서브넷을 사용합니다. loxilb 컨테이너가 실행중인 로드밸런서 노드 역시 kubernetes와 동일한 서브넷에 연결되어 있습니다. 외부에서 kubernetes접속은 모두 로드밸런서 노드와 loxilb를 거치도록 설정했습니다.


해당 예제에서는 docker를 사용해 loxilb 컨테이너를 실행합니다. 해당 예제에서는 kubernetes & calico는 이미 설치되어 있다고 가정하고 설명합니다.


1. loxilb setup


1.1 docker network 생성


우선 loxilb와 kubernetes 연동을 위해서는 서로 통신할 수 있어야 합니다. kubernetes & 로드밸런서 노드가 연결되어 있는 네트워크에 loxilb 컨테이너도 연결되도록 docker network를 생성합니다. 현재 로드밸런서 노드는 eno6 인터페이스를 통해 kubernetes와 연결되어 있습니다. 따라서 eno6 인터페이스를 parent로 사용하는 macvlan 타입 docker network 만들어서 loxilb 컨테이너에 제공하도록 하겠습니다. 다음 명령어로 docker network를 생성합니다.


sudo docker network create -d macvlan -o parent=eno6 \
  --subnet 192.168.57.0/24 \
  --gateway 192.168.57.1 \
  --aux-address 'cp1=192.168.57.101' \
  --aux-address 'cp2=192.168.57.102' \
  --aux-address 'cp3=192.168.57.103' k8snet

외부에서 kubernetes 서비스로 접근하는 트래픽 역시 loxilb를 거치도록, 외부와 통신이 가능한 docker network 역시 생성합니다. 로드밸런서 노드는 eno8을 통해 외부와 연결되어 있습니다.


sudo docker network create -d macvlan -o parent=eno8 \
  --subnet 192.168.20.0/24 \
  --gateway 192.168.20.1 llbnet

docker network list 명령어로 생성한 네트워크를 확인할 수 있습니다.

netlox@nd8:~$ sudo docker network list
NETWORK ID     NAME      DRIVER    SCOPE
5c97ae74fc32   bridge    bridge    local
6142f53e8be6   host      host      local
24ee7dbd7707   k8snet    macvlan   local
81c96ceda375   llbnet    macvlan   local
7bcd1738501b   none      null      local

1.2 loxilb docker 생성

loxilb container 이미지는 github에서 제공되고 있습니다. 컨테이너 이미지만 먼저 다운로드하고 싶을 경우 다음 명령어를 사용합니다.

docker pull ghcr.io/loxilb-io/loxilb:latest

다음 명령어로 loxilb 컨테이너를 생성할 수 있습니다.

sudo docker run -u root --cap-add SYS_ADMIN --restart unless-stopped \
  --privileged -dit -v /dev/log:/dev/log \
  --net=k8snet --ip=192.168.57.4 --name loxilb ghcr.io/loxilb-io/loxilb:latest \
  --host=0.0.0.0

사용자가 지정해야 하는 옵션은 다음과 같습니다.

docker ps 명령어로 생성한 컨테이너를 확인할 수 있습니다.

netlox@nd8:~$ sudo docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED       STATUS       PORTS       NAMES
eae349a283ae   loxilbio/loxilb:beta   "/root/loxilb-io/lox…"   11 days ago   Up 11 days               loxilb

위에서 컨테이너 생성할 때 kubernetes 네트워크만 연결했기 때문에, 외부 통신용 docker network와도 연결해야 합니다. 다음 명령어로 컨테이너에 네트워크를 주가로 연결할 수 있습니다.

sudo docker network connect llbnet loxilb

연결이 완료되면 다음과 같이 컨테이너의 인터페이스 2개를 확인할 수 있습니다

netlox@netlox:~$ sudo docker exec -ti loxilb ip route
default via 192.168.20.1 dev eth0
192.168.20.0/24 dev eth0 proto kernel scope link src 192.168.20.4
192.168.30.0/24 dev eth1 proto kernel scope link src 192.168.30.2

2. kubernetes에 kube-loxilb설치

kube-loxilb는 loxilb 로드밸런서를 kubernetes에게 제공하기 위한 cloud-controller-manager 로서, kubernetes와 loxilb 연동에 반드시 필요합니다. 해당 문서를 참고해서, configMap의 apiServerURL을 위에서 생성한 loxilb의 IP 주소로 변경한 후 kubernetes에 설치하시면 됩니다. kube-loxilb까지 정상적으로 설치되었다면 연동 작업이 완료됩니다.


3.기본 연동 확인

2번 항목까지 완료되었다면, 이제 kubernetes에서 LoadBalancer 타입 서비스를 생성하면 External IP가 부여됩니다. 다음과 같이 테스트용으로 test-nginx-svc.yaml 파일을 생성합니다.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app.kubernetes.io/name: proxy
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
      - containerPort: 80
        name: http-web-svc
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  type: LoadBalancer
  selector:
    app.kubernetes.io/name: proxy
  ports:
  - name: name-of-service-port
    protocol: TCP
    port: 8888
    targetPort: http-web-svc

파일을 생성한 다음, 아래 명령으로 nginx pod와 LoadBalancer 서비스를 생성합니다.

kubectl apply -f test-nginx-svc.yaml

서비스 nginx-service가 LoadBalancer 타입으로 생성되었고 External IP를 할당받았음을 확인할 수 있습니다. 이제 IP 123.123.123.15와 port 8888을 사용해 외부에서 kubernetes 서비스로 접근이 가능합니다.

vagrant@node1:~$ sudo kubectl get svc
NAME            TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)          AGE
kubernetes      ClusterIP      10.233.0.1      <none>           443/TCP          28d
nginx-service   LoadBalancer   10.233.21.235   123.123.123.15   8888:31655/TCP   3s

LoadBalancer 룰은 loxilb 컨테이너에도 생성됩니다. 로드밸런서 노드에서 다음과 같이 확인할 수 있습니다.

netlox@nd8:~$ sudo docker exec -ti loxilb loxicmd get lb
|  EXTERNAL IP   | PORT | PROTOCOL | SELECT | # OF ENDPOINTS |
|----------------|------|----------|--------|----------------|
| 123.123.123.15 | 8888 | tcp      |      0 |              2 |

4. calico BGP & loxilb 연동


Calico에서 BGP 모드로 네트워크를 구성할 경우, loxilb 역시 BGP 모드로 동작해야 합니다. loxilb는 goBGP 기반으로 BGP 네트워크 기능을 지원합니다. 이하 내용은 calico가 BGP mode로 설정되어 있다고 가정하고 설명합니다.


4.1 loxilb BGP mode setup

다음 명령어로 loxilb 컨테이너를 생성하면 BGP 모드로 실행됩니다. 명령어 마지막의 -b 옵션이 BGP 모드 옵션입니다.

sudo docker run -u root --cap-add SYS_ADMIN --restart unless-stopped \
  --privileged -dit -v /dev/log:/dev/log \
  --net=k8snet --ip=192.168.57.4 \
  --name loxilb ghcr.io/loxilb-io/loxilb:latest \
  --host=0.0.0.0 -b
4.2 gobgp_loxilb.yaml 파일 생성

loxilb 컨테이너의 /opt/loxilb/ 디렉토리에 gobgp_loxilb.yaml 파일을 생성합니다.

global:
    config:
        as: 65002
        router-id: 172.1.0.2
neighbors:
    - config:
        neighbor-address: 192.168.57.101
        peer-as: 64512
    - config:
        neighbor-address: 192.168.20.55
        peer-as: 64001

global 항목에는 loxilb 컨테이너의 as-id와 router-id 등 BGP 정보를 등록해야 합니다. neighbors는 loxilb와 Peering되는 BGP 라우터의 IP 주소 및 as-id 정보를 등록합니다. 해당 예제에서는 calico의 BGP 정보(192.168.57.101)와 외부 BGP 정보(129.168.20.55) 를 등록했습니다.


4.3 loxilb docker lo 인터페이스에 router-id 추가

gobgp_loxilb.yaml 파일에서 router-id로 등록한 IP를 lo 인터페이스에 추가해야 합니다.

sudo docker exec -ti loxilb ip addr add 172.1.0.2/32 dev lo
4.4 loxilb docker 재시작

Restart the loxilb docker for the settings in gobgp_loxilb.yaml to take effect.

sudo docker stop loxilb
sudo docker start loxilb
4.5 Calico에 BGP Peer 정보 추가

Calico에도 loxilb의 BGP Peer 정보를 추가해야 합니다. 다음과 같이 calico-bgp-config.yaml 파일을 생성합니다.

apiVersion: projectcalico.org/v3
kind: BGPPeer
metadata:
  name: my-global-peers2
spec:
  peerIP: 192.168.57.4
  asNumber: 65002

peerIP에 loxilb의 IP 주소를 입력합니다. asNumber에는 위에서 설정한 loxilb BGP의 as-ID를 입력합니다. 파일을 생성한 다음, 아래 명령어로 calico에 BGP Peer 정보를 추가합니다.

sudo calicoctl apply -f calico-bgp-config.yaml
4.6 BGP 설정 확인

이제 다음과 같이 loxilb 컨테이너에서 BGP 연결을 확인할 수 있습니다.

netlox@nd8:~$ sudo docker exec -ti loxilb3 gobgp neigh
Peer              AS  Up/Down State       |#Received  Accepted
192.168.57.101 64512 00:00:59 Establ      |        4         4

정상적으로 연결되었다면 State가 Establish로 표시됩니다. gobgp global rib 명령으로 calico의 route 정보를 확인할 수 있습니다.

netlox@nd8:~$ sudo docker exec -ti loxilb3 gobgp global rib
   Network              Next Hop             AS_PATH              Age        Attrs
*> 10.233.71.0/26       192.168.57.101       64512                01:02:03   [{Origin: i}]
*> 10.233.74.64/26      192.168.57.101       64512                01:02:03   [{Origin: i}]
*> 10.233.75.0/26       192.168.57.101       64512                01:02:03   [{Origin: i}]
*> 10.233.102.128/26    192.168.57.101       64512                01:02:03   [{Origin: i}]

조회수 253회댓글 0개

최근 게시물

전체 보기

コメント


GIThub

Learn, Contribute & Share

GETTING STARTED

Get started with deploying LoxiLB in your cluster

Documentation

Check LoxiLB Documentation for more information.

Join the LoxiLB slack channel to chat with the developers community.

bottom of page