KUBIC 안양 BIND 성능 문제 해결

뭐라 시작해야 할 지 모르겠다.

지난 3월부터 계속된 안양 고객 KUBIC 구축이 드디어 상용 서비스에 들어가기 직전이다.

3개월이 넘는 긴 여정을 이제야 마무리하게 되었다.

문제점 recap

KUBIC 구축 대상 팀은 BIND를 이용하여 DNS 서비스를 한다. 상용 부하를 주면서 고객이 사용하는 health check 프로그램이 dns query를 던졌을 때 하나라도 응답이 오지 않으면 실패로 간주한다.

고객이 정한 상용 서비스 투입을 위한 최소 rps(requests per second)값은 30,000이다. 즉, 30000 rps이상에서 실패가 없어야 KUBIC을 사용할 수 있다.

kubernetes 부하 분산 기능을 담당하는 kube-proxy의 iptables 모드가 incoming packet에 대한 SNAT으로 인해 source port exhaustion(원본 포트 고갈) 문제가 발생하여 상용 적용할 수가 없었다.

해결책

kubernetes 1.5부터 beta 기능으로 OnlyLocal 기능이 포함되었다. 아직 beta이긴 하지만 시험을 해 보았다.

svc_aaa.yml:

kind: Service
metadata:
  name: aaa
  annotations:
    service.beta.kubernetes.io/external-traffic: OnlyLocal
  namespace: default
  labels:
    app: aaa
spec:
  selector:
    app: aaa
  ports:
  - port: 53
    name: dns-udp-53
    targetPort: 53
    nodePort: 30053
    protocol: UDP
  - port: 53
    name: dns-tcp-53
    targetPort: 53
    nodePort: 30053
    protocol: TCP
  type: NodePort

kubectl create -f svc_aaa.yml 하고 서비스 상태를 보자.

kubectl get svc:

NAME         CLUSTER-IP    EXTERNAL-IP   PORT(S)                     AGE
aaa          10.24.15.76   <nodes>       53:30053/UDP,53:30053/TCP   3s

우리가 원하는 udp/tcp port 30053으로 listen하고 있는 것을 볼 수 있다.

이제 dns query를 하고 tcpdump로 결과를 보면 incoming SNAT을 하지 않는 것을 볼 수 있다.

dig @iia2 -p 30053 +short cnn.com:

151.101.193.67
151.101.65.67
151.101.1.67
151.101.129.67

tcpdump -i docker0 host 172.17.0.1:

15:30:19.012211 IP 10.0.24.51.57237 > 172.17.0.1.domain: 27422+ [1au] A? cnn.com. (36)
15:30:19.012611 IP 172.17.0.1.domain > 10.0.24.51.57237: 27422 4/4/8 A 151.101.65.67, A 151.101.129.67, A 151.101.1.67, A 151.101.193.67 (384)

위 tcpdump 결과를 보듯이 원본 IP:port(10.0.24.51은 dig 명령을 내린 서버의 IP)가 바뀌지 않는다.

실험은 성공적이었고, 바로 안양 KUBIC 서버에 위 내용을 적용하고 고객에게 상용 부하 적용을 요청하였다.

적용 결과

1개 POD 적용

먼저 POD 한 개로 부하 시험을 하였다. 10,000 rps이상 부하를 주어도 health check는 실패하지 않았다.

4개 POD 적용

POD를 4개로 scale up하였다. 23,000 rps까지 부하를 주었는데 역시 health check는 실패하지 않았다.

왜 23,000까지만 시험했는가?

현재의 DNS 부하가 많지 않아 L4에서 한 서버에 줄 수 있는 부하가 23,000까지밖에 되지 않는다고 한다.

DNS부하가 밤 10시 이후부터 많아지기 때문에 30,000이상을 주려면 그 때 해 보아야 한다고 한다.

30,000을 주지 않았으나 위 논리 상 결국 문제는 없어 보인다. 이전에는 6,000 - 7,000 정도에서 문제가 발생하였다.

나중에 30,000이상 부하를 주는 실험을 하면 결과를 알려 달라고 하였다.

에필로그

3개월 이상 지속된 이번 안양 KUBIC 프로젝트는 이번 주 마무리됩니다.

그 동안 함께 고생한 안양 이현우 책임님에게 감사드립니다. 이런 저런 대화에서 배운 것도 많았고, 기술적 대화의 충만함으로 길었던 본 프로젝트를 무사히 마무리할 수 있었던 것 같습니다.

본 프로젝트 일정이 많이 연장되었음에도 기다려 준 점에 대해서도 감사합니다.

다시 한번 강조하지만 KUBIC은 프로그램 이 아니라 프로세스 입니다.
(KUBIC is NOT a program BUT a process.)