언제 추가 된 문서인지 모르겠으나, 오늘 cloudflare 관련 작업 중 이런 문서를 찾았습니다.
바로 고가용성입니다.
High Availability를 지원하기 전
이 전에는 하나의 tunnel token으로 cloudflared를 여러개 구동하면 두번째로 실행한 cloudflared는 에러가 발생 되었습니다.
따라서 모든 vm마다 서로 다른 cloudflare tunnel을 구현할 수 밖에 없었죠.
게다가 kubernetes나 docker swarm 처럼 클러스터링 되어 서비스를 제공하는 환경에서조차 cloudflared는 하나만 실행 가능했습니다.
현재 제가 kubernetes를 사용하고 있으므로, kubernetes 환경에서 예시를 들어보겠습니다.
만약 실수로 cloudflared가 실행중인 노드를 drain하지 않고 종료했다면, pod가 옮겨지는데 5분이 소요 됩니다.
그 때까지 kubernetes cluster 안에 cloudflare를 접근할 수가 없죠.
하나의 도메인을 여러 개의 cloudflared에 올릴수 있었던 것도 아니었으므로, 당시에는 cloudflared를 많이 올린다고 서비스가 고가용성이 보장되지 않았습니다.
예를 들어 설명하자면, cloudflared-A에는 cola16.app을, cloudflared-B pod에는 speed.cola16.app을 서비스 하고 있다고 가정했을 때,
cloudflared-A가 꺼지면 cola16.app에는 접속할 수가 없습니다.
그렇다고 cloudflared-A와 cloudflared-B에 cola16.app을 올릴수 있던 것도 아니죠.
High Availability 지원 이후
하지만, 이제는 kubernetes용 cloudflare tunnel을 만들고, pod를 모든 노드에 대해 daemonset으로 띄워버리면.. 노드 하나만이라도 살아있다면
kubernetes cluster 내의 모든 서비스에 접근이 가능합니다.
게다가 각 vm마다 tunnel을 만들어서 구성하는대신, “집” tunnel을 만들고 집의 모든 머신에 같은 token을 사용하는 cloudflared를 실행해도 됩니다.
기존에는 tunnel이 32개였는데, 고가용성을 적용하면서 9개로 줄어들었네요.
집의 모든 머신 통일, oracle cloud의 머신 모두 통일 했더니 굉장히 간소화 되었습니다.
kubernetes 뿐만 아니라, vm 환경에서도 엄청난 차이가 발생하게 되는 것이죠.
저는 cloudflared가 high availability를 지원하지 않았기 때문에, 가용성이 높은 public cloud의 loadbalancer와 vm을 이용하여 고가용성을 구현했었습니다.
이 설정들을 전부 cloudflared로 옮겨야 겠습니다.
마무리
오늘 하루 종일 이것만 설정하고 있습니다.
몇몇 tunnel 합치고, dns로 되어있던 것들을 cloudflare의 zero trust, tunnel을 이용하여 고가용성을 확보하도록 변경하고 있습니다.
기존에는 oracle cloud infrastructure의 nlb와 vm이 죽으면 kubernetes 전체에 접속이 안되었는데, 이제는 문제 없이 접속 가능하게 되었습니다.ㅎㅎ
답글 남기기