글로벌 IPv4가 고갈된 지금, 한국은 아직 IPv4가 일반적이지만 전세계적으로는 점차 IPv6를 사용하는 추세로 전환되고 있습니다.
IPv6 사용량이 증가할수록 IPv4로 서비스 중이었던 기존 서비스와 충돌이 생기는 건 당연한 일입니다. 사용자가 IPv6을 사용하겠다고 해서 기존 시스템들까지 전부 IPv6으로 전환되지는 않습니다. 그렇다고 기존 IPv4 서비스들을 한꺼번에 IPv6으로 마이그레이션 하는 작업은 비용적 측면으로도 불가능한 일입니다. 그것보다는 IPv6 유저가 이미 배포되어 있는 IPv4 서비스에 접근할 수 있도록 NAT64 같은 기능을 지원하는 쪽이 합리적인 선택일 것입니다.
이 포스트에서는 LoxiLB를 로드밸런서로 사용해서 IPv4를 사용하는 쿠버네티스와 IPv6을 사용하는 외부 사용자를 연결하는 방법에 대해 설명합니다. LoxiLB를 로드밸런서로 사용하기 위해서 LoadBalancerClass를 지정하여 k8s 서비스를 생성하고, LoxiLB의 NAT64 기능을 사용해 IPv6 - IPv4를 연결할 것입니다.
포스트에서 사용하는 토폴로지는 외부 IP를 IPv6으로 설정하는 등 몇 가지 사소한 차이점을 제외하면 이전 포스트에서 사용했던 토폴로지와 거의 동일합니다. 이전 포스트와 중복되는 설명들은 이 포스트에서 생략하고 서술했으므로, 이전 포스트를 한번 참고하는 쪽을 추천드립니다.
테스트 전 setup
토폴로지 구성을 위한 쿠버네티스 설치나 LoxiLB 클러스터 구성 등은 이전 포스트에서 설명한 대로 설치합니다. 이 링크에서 포스트에서 사용한 모든 설정 파일들을 다운로드할 수 있습니다.
한 가지 주의할 점은 이전 포스트에서 설치했던 loxi-ccm은 이번에 사용하지 않습니다. 대신 kube-loxilb를 설치해서 사용합니다.
kube-loxilb 설치
kube-loxilb는 LoadBalancerClass를 지원해서 쿠버네티스에서 LoxiLB를 로드밸런서로 사용할 수 있게 지원하는 애플리케이션입니다. 이 링크에서 자세한 설명을 확인할 수 있습니다.
kube-loxilb를 쿠버네티스에 배포하기 위해, 다음 명령어로 매니페스트 파일을 다운로드합니다.
$ wget https://github.com/loxilb-io/kube-loxilb/raw/main/manifest/kube-loxilb.yaml
다운로드한 kube-loxilb.yaml 파일에서 아래처럼 loxiURL을 찾아 LoxiLB의 IP (쿠버네티스와 통신 가능한 IP)로 바꿉니다. 이 포스트의 토폴로지에서 LoxiLB의 IP는 각각 192.168.59.101, 192.168.59.111 이므로 loxiURL은 다음과 같이 설정합니다.
args:
- --loxiURL=http://192.168.59.101:11111,http://192.168.59.111:11111
- --externalCIDR=3ffe::1/96
- --setBGP=true
- --setLBMode=2
loxiURL을 변경한 후 다음 명령어로 배포합니다.
$ sudo kubectl apply -f kube-loxilb.yaml
$ sudo kubectl get pods -n kube-system | grep loxi
kube-loxilb-5f586c8497-mjxfs 1/1 Running 0 25s
외부 라우터 설정
이 포스트에서는 외부 라우터로 bird BGP를 사용하고 있습니다. 설정 파일은 이 링크에서 확인할 수 있습니다. 설정 파일을 /etc/bird/bird6.conf 경로에 저장한 후 bird 서비스를 재시작합니다.
$ sudo apt-get install bird2 –yes
## Change bird.conf as needed
$ sudo systemctl restart bird6
BGP 연결 확인
LoxiLB Node(s):
$ sudo docker exec -it loxilb gobgp neigh
Peer AS Up/Down State |#Received Accepted
192.168.59.211 64512 01:58:21 Establ | 1 1
192.168.59.212 64512 01:58:22 Establ | 1 1
192.168.59.213 64512 01:58:21 Establ | 1 1
192.168.59.214 64512 01:58:14 Establ | 1 1
2001::2 65001 01:58:20 Establ | 0 0
External Router:
$ sudo birdc6
BIRD 1.6.8 ready.
bird> show protocols
name proto table state since info
kernel1 Kernel master up 14:31:20
device1 Device master up 14:31:20
llb1 BGP master up 14:43:10 Established
llb2 BGP master up 14:49:45 Established
bird>
nginx 서비스 생성
테스트를 위해서 nginx.yaml 을 사용해 쿠버네티스에 nginx 파드와 LoadBalancer 서비스를 하나 생성합니다.
$ sudo kubectl apply -f nginx.yaml
service/nginx-service created
deployment.apps/nginx-deployment created
생성된 서비스를 확인하면 external IP가 IPv6으로 할당되었음을 확인할 수 있습니다.
$ sudo kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
nginx-service LoadBalancer 10.233.38.172 3ffe::1 8765:31469/TCP 9s
LoxiLB 노드에서도 IPv6 “3ffe::1 8765" 에 대한 로드밸런서 룰이 생성되었음을 확인할 수 있습니다. 확인을 위해선 다음 명령어를 입력합니다.
$ sudo docker exec -it loxilb loxicmd get lb -o wide
| EXTERNAL IP | PORT | PROTOCOL | BLOCK | SELECT | MODE | ENDPOINT IP | TARGET PORT | WEIGHT | STATE |
|-------------|-------|----------|-------|--------|---------|----------------|-------------|--------|--------|
| 3ffe::1 | 8765 | tcp | 0 | rr | fullnat | 192.168.59.213 | 31478 | 5 | active |
| | | | | | | 192.168.59.214 | 31478 | 5 | active |
이때 현재 BGP 연결 상태를 확인하면 다음과 같습니다.
k8s LoadBalancer 서비스의 IPv6 주소는 gobgp_loxilb.yaml 파일에 정의된 정책대로 외부 라우터에 advertise 됩니다. external router의 route 테이블에서 이를 확인할 수 있습니다.
$ sudo ip -6 route
::1 dev lo proto kernel metric 256 pref medium
2001::/64 dev enp0s8 proto kernel metric 256 pref medium
3ffe::1 via 2001::150 dev enp0s8 proto bird metric 1024 pref medium
fe80::/64 dev enp0s3 proto kernel metric 100 pref medium
fe80::/64 dev enp0s8 proto kernel metric 101 pref medium
동작 확인
이제 외부에서 서비스의 IPv6 주소를 사용해서 nginx 서비스에 접근할 수 있습니다.
Comments