kubernetes BIND DNS 성능 시험 - 계속되는 문제
안양에서 이현우 부장님과 함께 BIND 컨테이너 성능 시험을 했다. PORCH은 어느 정도 마무리가 되었는데(솔라리스용 BIND 앱 배포도 완료함), KUBIC은 아직 실전 투입을 하지 못하고 있다.
계속된 문제
BIND 컨테이너에 실제 트래픽에 투입하면, probing하는 쪽에서 100% 응답이 오지 않는 문제로 인해 실전에 투입하지 못하고 있는 상황이다. 컨테이너 하나가 받을 수 있는 적정 requests per second(rps)가 1000 정도 인 것으로 파악되었다. 이 정도의 수치로는 KUBIC을 상용에 적용할 의미가 없다.
실험 내용
오늘 나는 두가지 실험을 하였다. 두 실험 모두 kube-proxy를 끄고(끄지 않으면, kube-proxy가 계속 iptables를 건드리므로) 수동으로 iptables 규칙을 추가하여 성능을 보는 실험이다.
kube-proxy를 끄고 수동으로 iptables 규칙 추가 (statistic 모듈의 nth 모드 사용)
KUBIC으로 ares-k29 minion에 4개의 BIND container 구동
iptables 규칙 청소 후 kube-proxy 종료:
kube-proxy –cleanup-iptables
kube-proxy가 만든 iptables 규칙 삭제 (iptables -F && iptables -F -t nat)
iptables 규칙 추가:
-A PREROUTING -i eth3 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode nth --every 4 --packet 0 -j DNAT --to-destination 10.100.13.2:53 -A PREROUTING -i eth3 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 10.100.13.3:53 -A PREROUTING -i eth3 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 10.100.13.4:53 -A PREROUTING -i eth3 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode nth --every 1 --packet 0 -j DNAT --to-destination 10.100.13.5:53 -A PREROUTING -i eth3:1 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode nth --every 4 --packet 0 -j DNAT --to-destination 10.100.13.2:53 -A PREROUTING -i eth3:1 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode nth --every 3 --packet 0 -j DNAT --to-destination 10.100.13.3:53 -A PREROUTING -i eth3:1 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 10.100.13.4:53 -A PREROUTING -i eth3:1 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode nth --every 1 --packet 0 -j DNAT --to-destination 10.100.13.5:53
실전 투입 (가중치를 높여가며, probing이 100% 완벽한 지 실험)
성능 문제 없음 확인
kube-proxy를 끄고 수동으로 iptables 규칙 추가 (statistic 모듈의 random 모드 사용)
KUBIC으로 ares-k29 머신에 4개의 BIND container 구동
kube-proxy 종료 (systemctl stop kube-proxy, kube-proxy를 종료해도 컨테이너에는 영향을 주지 않는다.)
kube-proxy가 만든 iptables 규칙 삭제 (iptables -F && iptables -F -t nat)
iptables 규칙 추가:
-A PREROUTING -i eth3 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode random --probability 0.25000000000 -j DNAT --to-destination 10.100.13.2:53 -A PREROUTING -i eth3 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode random --probability 0.33332999982 -j DNAT --to-destination 10.100.13.3:53 -A PREROUTING -i eth3 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode random --probability 0.50000000000 -j DNAT --to-destination 10.100.13.4:53 -A PREROUTING -i eth3 -p udp -m udp --dport 53 -m state --state NEW -j DNAT --to-destination 10.100.13.5:53 -A PREROUTING -i eth3:1 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode random --probability 0.25000000000 -j DNAT --to-destination 10.100.13.2:53 -A PREROUTING -i eth3:1 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode random --probability 0.33332999982 -j DNAT --to-destination 10.100.13.3:53 -A PREROUTING -i eth3:1 -p udp -m udp --dport 53 -m state --state NEW -m statistic --mode random --probability 0.50000000000 -j DNAT --to-destination 10.100.13.4:53 -A PREROUTING -i eth3:1 -p udp -m udp --dport 53 -m state --state NEW -j DNAT --to-destination 10.100.13.5:53
실전 투입 (가중치를 높여가며, probing이 100% 완벽한 지 실험)
성능 문제 없음 확인
실험 결과
위 실험으로 다음과 같은 결론이 나온다.
- kubernetes가 만든 컨테이너에서도 iptables statistic 확장 모듈의 nth/random 모드 수동 적용 시 성능에 전혀 문제가 없음이 확인되었다.
- 위 1번 결과로 인해 성능 문제는 flannel 문제가 아닌 것으로 판명되었다. flannel문제라면 위 실험에서도 성능에 문제가 발생해야 한다. (위 실험에서 서비스를 중지한 것은 kube-proxy 뿐이다.)
그러나 kube-proxy가 만드는 iptables 규칙 적용 시에는 여전히 성능 문제가 발생하므로 남은 과제는 kube-proxy가 만드는 iptables 규칙에 어떤 문제가 있는 지 파악이 필요하다.