Envoy 내부 구조 · 이름 뒤에 서 있는 것들 · 실습
고장 난 업스트림을 넣고 클러스터를 관찰한다
목표
엔드포인트를 알아내는 방법과 성한지 판단하는 방법을 따로 세워 보고, 성한 것이 모자랄 때 Envoy 가 택하는 두 가지 길을 직접 만들어 본다.
왜 중요한가
프록시 운영에서 실제로 자주 보는 화면은 라우트 표가 아니라 클러스터 목록이다 — 어디에 서버가 몇 대이고 그중 몇 대가 성한가. 그 숫자를 읽을 줄 알면 503 신고의 절반은 그 자리에서 끝난다. 특히 패닉 모드는 한 번 눈으로 보지 않으면 운영에서 처음 만났을 때 '다 죽었는데 왜 계속 보내지' 에서 멈추게 된다. 우선순위 넘김도 마찬가지로, 설정만 읽어서는 언제 아래 단계가 트래픽을 받는지 감이 오지 않는다.
단계
1. 업스트림 넷을 띄우세요 — 8084·8086 는 ok, 8085·8087 는 fail 입니다. /root/envd-cluster/cluster.yaml 에 STATIC 클러스터 pool(엔드포인트 8084·8085·8086)과 /pool 라우트를 두고 띄우세요(관리 9941, 리스너 127.0.0.1:10041). /clusters 에서 pool:: 로 시작하는 줄만 골라 /root/envd-cluster/01-pool.txt 에 저장하세요.
2. STRICT_DNS 클러스터 bydns 를 더하세요 — 주소는 localhost, 포트는 8084 이고 dns_lookup_family 는 V4_ONLY 입니다. /bydns 라우트도 함께 두세요. /config_dump?resource=static_clusters 에서 클러스터마다 이름 타입 한 줄씩 뽑아 /root/envd-cluster/02-types.txt 에 저장하세요.
3. pool 에 능동 헬스 체크를 더하세요 — interval 1초, timeout 1초, 두 임계값 모두 1, http_health_check 의 경로는 /healthz 입니다. 잠시 뒤 /clusters 에서 pool 엔드포인트의 health_flags 줄만 골라 /root/envd-cluster/03-health.txt 에 저장하세요.
4. /pool 로 12번 요청해 어느 업스트림이 받았는지 세어, /root/envd-cluster/04-spread.txt 에 p8084=·p8085=·p8086=·total= 네 줄로 적으세요(값은 받은 횟수).
5. 클러스터 panic 을 더하세요 — 엔드포인트는 8085·8087 둘 다 fail 이고 같은 능동 헬스 체크를 겁니다. /panic 라우트도 두세요. 6번 요청한 뒤 /root/envd-cluster/05-panic.txt 에 codes=(받은 HTTP 코드들을 공백으로), lb_healthy_panic=(같은 이름의 통계 값), membership_healthy= 세 줄을 적으세요.
6. 클러스터 tiered 를 더하세요 — priority: 0 에 8085(fail), priority: 1 에 8086(ok) 를 두고 같은 능동 헬스 체크를 겁니다. /tiered 라우트도 두고 6번 요청해 /root/envd-cluster/06-priority.txt 에 served_by=(응답한 포트), count=(그 포트가 받은 횟수) 두 줄을 적으세요.
7. /root/envd-cluster/07-inventory.txt 에 클러스터마다 한 줄씩 이름 타입 엔드포인트수 성한수 네 값을 공백으로 띄워 적으세요(이름 순서로 정렬). 값은 눈으로 세지 말고 /config_dump 와 /stats 에서 뽑습니다.
8. /root/envd-cluster/08-report.md 에 healthy=(pool 의 성한 엔드포인트 수), total=(pool 의 전체 엔드포인트 수), panic_requests_sent=(패닉 모드에서 요청이 나갔으면 yes), failover_port=(6단계에서 실제로 응답한 포트) 네 줄을 적고, 그 아래 배운 것을 네 줄 이상 적으세요.
참고
- 업스트림은
python3 /opt/lab/envoy/upstream.py <포트> ok|fail로 띄웁니다.fail은 어떤 경로로 물어도 503 을 돌려주므로 헬스 체크도 함께 떨어집니다. - Envoy 를 띄울 때는
setsid --fork nohup envoy -c <파일> --log-level warn --concurrency 1 > <로그> 2>&1 </dev/null를 쓰고, 다시 띄우기 전에는pkill -x envoy로 정리하세요. - 헬스 체크 주기가 1초이므로 설정을 올린 직후에는 아직 판정이 없습니다. 고정
sleep대신 원하는 상태가/clusters나/stats에 나타날 때까지 도는 루프를 쓰세요. /clusters는 엔드포인트 하나에 스무 줄 넘게 내놓습니다.grep 'health_flags'처럼 필요한 줄만 골라 담으세요.- 흔한 실수 — 이상치 감지와 능동 헬스 체크를 같은 것으로 여기는 것. 이 실습은 능동 쪽입니다.
단계 8개
- 이름 하나에 주소 셋을 매단다
- 주소를 적는 대신 이름을 적는다
- 요청과 따로 주기적으로 찔러 본다
- 성하지 않은 곳에는 보내지 않는다
- 성한 곳이 하나도 없으면 어떻게 하나
- 위가 다 죽으면 아래로 넘어간다
- 네 클러스터의 목록을 만든다
- 클러스터 운영 메모를 남긴다