이번 포스트에서는 Tanzu에 LoxiLB를 in-cluster 모드로 배포하고, BGP를 사용해 LoadBalancer 서비스의 External IP를 외부로 공개하는 방법에 대해 기술하겠습니다.
전제사항
해당 포스트에서는 Tanzu 설치 방법 설명은 생략하고, LoxiLB 배포 방법과 BGP 연결 예제 위주로 설명할 예정입니다. 이 포스트에서 사용한 Tanzu는 AWS를 통해 배포했으며, 다음과 같은 토폴로지로 구성되었습니다.
Tanzu는 간략하게 2개의 인스턴스로 구성되었습니다.
tkg-control-plane (172.16.0.71) : 컨트롤 플레인 노드
tkg-worker (172.16.0.206) : 워커 노드
Tanzu의 각 노드는 프라이빗 네트워크 (172.16.0.0.24) 에만 연결되었으며, 외부에서 접근 및 kubectl 사용은 tkg-jumbobox를 통해서만 가능하도록 구성했습니다.
tkg-test (172.16.0.115) 는 BGP Peering 및 LoadBalancer 서비스 접근 테스트용 인스턴스입니다.
토폴로지 구성에 사용한 OS는 Ubuntu 20.04를 사용했으며, 커널 버전은 5.15를 사용했습니다.
이하 모든 포스트 내용은 AWS 기준입니다. 각 노드간 통신을 위하여, 노드가 사용하는 security group끼리 sctp/tcp 프로토콜 통신을 허용하도록 설정했습니다. 또한, AWS에서 할당하지 않은 IP를 사용해 서비스로 접근할 수 있도록 BGP Peering을 맺을 (이 포스팅에서는 tkg-test와 tkg-control-plane) 인스턴스의 Networking 설정에서 Change source/destination check 설정을 stop으로 설정하셔야 합니다.
tkg-test 인스턴스에 BGP 설정
먼저 BGP Peering 테스트용 인스턴스인 tkg-test에 BGP를 설정하는 것부터 시작하겠습니다. 이 포스트에서는 BGP 설정을 위해서 bird를 사용할 것입니다.
BGP 설정은 아래처럼 설정합니다.
tkg-test
router id : 172.16.0.115 (tkg-test 인스턴스 IP)
as id : 64515
LoxiLB
router id : 172.16.0.71 (tkg-control-plane 인스턴스 IP)
as id : 64512
다음 명령어로 tkg-test에 BGP를 설치할 수 있습니다.
$ apt install bird2
bird 설치가 완료되면 bird 설정 파일이 /etc/bird/bird.conf 경로에 생성됩니다. 파일을 열고 다음 내용을 추가합니다.
protocol bgp llb1 {
local 172.16.0.115 as 64515;
neighbor 172.16.0.71 as 64512;
ipv4 {
import all;
export all;
};
}
해당 설정은 bird에서 BGP의 router id와 as id를 설정하고, neighbor를 추가합니다.
local 에 지정하는 172.16.0.115 는 tkg-test의 IP입니다. as id로는 64515를 지정하겠습니다.
neighbor에 지정하는 172.16.0.71 IP는 Tanzu의 마스터 노드인 tkg-control-plane의 IP입니다. as id는 64512를 지정합니다.
bird.conf 파일을 수정했으면 다음 명령어로 bird를 재시작합니다.
$ systemctl restart bird
LoxiLB 배포
kubectl 사용이 가능한 인스턴스(이 포스트에서는 tkg-jumbobox)에 LoxiLB 배포를 위해서 필요한 매니페스트 파일들 (kube-loxilb.yaml, loxilb.yaml, loxilb-peer.yaml 을 다운로드합니다.
wget https://raw.githubusercontent.com/loxilb-io/kube-loxilb/main/manifest/in-cluster/kube-loxilb.yaml
wget https://raw.githubusercontent.com/loxilb-io/kube-loxilb/main/manifest/in-cluster/loxilb.yaml
wget https://raw.githubusercontent.com/loxilb-io/kube-loxilb/main/manifest/in-cluster/loxilb-peer.yml
kube-loxilb를 배포하기 전, kube-loxilb.yaml 파일을 수정합니다.
LoxiLB의 BGP를 설정하기 위해서, args 항목을 찾아 아래 예시와 같이 --setBGP를 64512로, --setRoles를 0.0.0.0으로, --extBGPPeers를 위에서 tkg-test 인스턴스에 설정했던 BGP 설정대로 172.16.0.115:64515를 지정합니다.
(--externalCIDR은 기본값 그대로 123.123.123.0/24 로 사용하겠습니다)
args:
- --externalCIDR=123.123.123.0/24
- --setBGP=64512
- --setRoles=0.0.0.0
- --extBGPPeers=172.16.0.115:64515
파일을 수정한 후, 다음 명령어로 kube-loxilb를 배포합니다.
$ kubectl apply -f kube-loxilb.yaml
serviceaccount/kube-loxilb created
clusterrole.rbac.authorization.k8s.io/kube-loxilb created
clusterrolebinding.rbac.authorization.k8s.io/kube-loxilb created
deployment.apps/kube-loxilb created
다음 명령어로 loxilb-peer를 배포합니다.
$ kubectl apply -f loxilb-peer.yml
daemonset.apps/loxilb-peer created
service/loxilb-peer-service created
마지막으로 loxilb를 배포하기 위해, loxilb.yaml 파일을 열고 command 항목을 찾아 --blacklist 옵션을 다음과 같이 수정합니다.
containers:
- name: loxilb-app
image: "ghcr.io/loxilb-io/loxilb:ocp-beta"
imagePullPolicy: Always
command: [ "/root/loxilb-io/loxilb/loxilb", "--egr-hooks", "--blacklist=ovs.|genev.|antrea.|ebs.|snapshot.|capa." ]
ports:
수정 내용을 저장한 후, 다음 명령어로 loxilb를 배포합니다.
$ kubectl apply -f loxilb.yaml
daemonset.apps/loxilb-lb created
service/loxilb-lb-service created
배포를 완료한 후, 다음 명령어로 각각 배포된 kube-loxilb, loxilb-lb, loxilb-peer 파드들을 확인할 수 있습니다. (loxilb-lb와 loxilb-peer 파드 갯수는 마스터 노드와 워커 노드 갯수에 따라 달라집니다)
$ kubectl get pods -A | grep loxi
kube-system kube-loxilb-65c444f696-64gst 1/1 Running 0 25h
kube-system loxilb-lb-tz8dl 1/1 Running 1 (25h ago) 26h
kube-system loxilb-peer-t94jj 1/1 Running 1 (25h ago) 26h
LoxiLB는 kube-loxilb 매니페스트 파일에 설정한 대로 자동으로 BGP를 구성하고 Peer를 검색합니다. loxilb-lb 파드에서는 BGP 구성을 확인할 수 있습니다. 다음 명령어는 LoxiLB BGP Peering 설정을 확인합니다. Peering이 정상적으로 맺어졌을 경우 State가 Establ로 표시됩니다.
$ kubectl exec -ti -n kube-system loxilb-lb-tz8dl -- gobgp --port 50052 neigh
Peer AS Up/Down State |#Received Accepted
172.16.0.115 64515 00:00:17 Establ | 0 0
172.16.0.206 64512 00:01:15 Establ | 0 0
172.16.0.206은 loxilb-peer 파드의 IP입니다. 그리고 172.16.0.115 IP와 AS 64515는 위에서 tkg-test에 설정한 BGP Peer입니다. 정상적으로 LoxiLB와 피어링되어 neighbor로 등록되었음을 확인할 수 있습니다.
테스트용 서비스 생성
이제 BGP 기능을 테스트하기 위해 LoadBalancer 타입 서비스를 생성해 보도록 하겠습니다. 생성할 서비스와 파드는 다음과 같습니다.
apiVersion: v1
kind: Service
metadata:
name: sctp-lb-onearm
annotations:
loxilb.io/lbmode: "onearm"
spec:
loadBalancerClass: loxilb.io/loxilb
selector:
what: sctp-onearm-test
ports:
- port: 56004
protocol: SCTP
targetPort: 9999
type: LoadBalancer
---
apiVersion: v1
kind: Pod
metadata:
name: sctp-onearm-test
labels:
what: sctp-onearm-test
spec:
containers:
- name: sctp-onearm-test
image: ghcr.io/loxilb-io/alpine-socat:latest
command: [ "sh", "-c"]
args:
- while true; do
socat -v -T2 sctp-l:9999,reuseaddr,fork system:"echo 'server1'; cat";
sleep 20;
done;
ports:
- containerPort: 9999
env:
- name: MY_POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
위 내용은 SCTP 프로토콜을 사용하는 파드와 서비스를 생성합니다. 위 내용을 sctp_onearm.yaml 파일에 저장한 다음, 아래 명령어로 파드와 서비스를 생성합니다.
$ kubectl apply -f sctp_onearm.yaml
service/sctp-lb-onearm created
pod/sctp-onearm-test created
다음 명령어를 입력하면 생성한 LoadBalancer 서비스가 external IP를 할당받았는지 확인 가능합니다.
$ kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 100.64.0.1 <none> 443/TCP 27d
sctp-lb-onearm LoadBalancer 100.70.19.233 llb-123.123.123.1 56004:31102/SCTP 29s
서비스 생성 후, 다음 명령어를 사용해서 LoxiLB의 BGP 설정에 LoadBalancer 서비스의 external IP에 대한 라우팅 정보가 추가되었음을 확인할 수 있습니다.
$ kubectl exec -ti -n kube-system loxilb-lb-tz8dl -- gobgp --port 50052 global rib
Network Next Hop AS_PATH Age Attrs
*> 123.123.123.1/32 0.0.0.0 {64512} 00:02:09 [{Origin: i} {LocalPref: 5000} {Med: 10}]
tkg-test 인스턴스에도 새로 추가된 라우팅 정보가 전파되었음을 확인할 수 있습니다.
$ ip route
default via 172.16.3.1 dev eth0 proto dhcp src 172.16.3.107 metric 100
123.123.123.1 via 172.16.0.71 dev eth1 proto bird metric 32
172.16.0.0/24 dev eth1 proto kernel scope link src 172.16.0.115
172.16.3.0/24 dev eth0 proto kernel scope link src 172.16.3.107
172.16.3.1 dev eth0 proto dhcp scope link src 172.16.3.107 metric 100
라우팅이 추가되었으므로, 이제 tkg-test 인스턴스에서도 LoadBalancer 서비스의 external IP를 사용해 서비스에 접근할 수 있습니다. tkg-test에서 다음 명령어를 입력했을 때 실행 결과로 server1이 표시된다면 정상적으로 서비스에 접근 성공한 것입니다.
$ socat -T10 - sctp:123.123.123.1:56004
server1
Comments