Envoy 내부 구조 · 설정 한 장이 프로세스가 되기까지 · 실습
배포 전에 거르고, 두 번째 프록시를 띄운다
목표
부트스트랩을 손으로 쓰고, 배포 전에 설정만 검사하고, 한 기계에 두 번째 Envoy 를 띄운다.
왜 중요한가
설정이 잘못된 프록시는 재시작하는 순간 드러난다. 그때는 이미 옛 프로세스가 내려간 뒤라 되돌릴 시간이 없다. --mode validate 는 포트를 잡지 않고 설정만 읽어 이 사고를 배포 전으로 옮겨 준다. 부트스트랩의 층 구조를 짚을 줄 알면 남이 쓴 설정도 몇 초 만에 읽히고, --base-id 와 관리 포트의 위험은 한 번 겪어 두지 않으면 반드시 운영에서 처음 만난다.
단계
1. /root/envd-boot/boot.yaml 에 부트스트랩을 쓰세요 — 관리 포트 9911, 리스너 이름 edge 가 127.0.0.1:10011, stat_prefix 는 edge, 클러스터 이름 origin 이 127.0.0.1:8081 입니다. envoy --mode validate -c /root/envd-boot/boot.yaml 을 돌려 그 출력과 종료 코드를 /root/envd-boot/01-validate.txt 에 저장하세요. 마지막 줄은 rc=0 이어야 합니다.
2. /root/envd-boot/boot.yaml 을 /root/envd-boot/boot-typo.yaml 로 복사한 뒤 HttpConnectionManager 를 HttpConnectionManger 로 한 글자 지우세요. envoy --mode validate 로 검사해 출력과 종료 코드를 /root/envd-boot/02-typo.txt 에 저장하세요 (마지막 줄은 rc=1).
3. /root/envd-boot/boot.yaml 에 node 를 더하세요 — id 는 edge-1, cluster 는 envd-edge 입니다. 업스트림을 8081 에 띄우고 Envoy 를 띄운 뒤, 관리 포트의 /config_dump 에서 부트스트랩 절의 node 만 뽑아 /root/envd-boot/03-node.json 에 저장하세요.
4. /root/envd-boot/boot.yaml 을 yq 로 읽어 다섯 값을 /root/envd-boot/04-layers.txt 에 열쇠=값 다섯 줄로 적으세요 — listener=(리스너 이름), filter=(네트워크 필터 이름), stat_prefix=, route_cluster=(라우트가 가리키는 클러스터), cluster_endpoint=(그 클러스터의 엔드포인트, 주소:포트 형식).
5. /root/envd-boot/boot.yaml 의 포트만 바꾼 사본 /root/envd-boot/boot-second.yaml 을 만드세요(관리 9912, 리스너 10012). 먼저 옵션 없이 띄워 실패를 확인하고, 그다음 --base-id 7 을 붙여 성공시키세요. /root/envd-boot/05-baseid.txt 에 without_base_id_rc=(0 이 아닌 값), 실패 이유가 담긴 줄, with_base_id_ready=(두 번째 Envoy 의 /ready 응답) 을 적으세요.
6. Envoy 를 --concurrency 1 --log-level info 로 다시 띄우고, 관리 포트의 /server_info 에서 command_line_options 만 뽑아 /root/envd-boot/06-cli.json 에 저장하세요. concurrency 가 1, log_level 이 info 여야 합니다.
7. 관리 포트에 /quitquitquit 를 POST 해 Envoy 를 끝내고, /root/envd-boot/07-quit.txt 에 after_quit=(그 뒤 /ready 의 HTTP 코드) 를 적으세요. 그다음 다시 띄우고 after_restart=(/ready 의 응답 문자열) 을 덧붙이세요. 마지막에는 Envoy 가 9911 에서 살아 있어야 합니다.
8. /root/envd-boot/08-report.md 에 validate_rc=, typo_rc=, second_envoy=, admin_bind= 네 줄을 적고(각각 1단계·2단계의 종료 코드, 두 번째 Envoy 에 필요했던 옵션 이름, 관리 포트를 묶어야 하는 주소), 그 아래 배운 것을 네 줄 이상으로 적으세요.
참고
- Envoy 를 띄울 때는
setsid --fork nohup envoy -c <파일> --log-level warn > <로그> 2>&1 </dev/null로 셸에서 완전히 떼어 놓으세요. 그냥&로 띄우면 다음 단계에서 이미 죽어 있습니다. - 다시 띄우기 전에는
pkill -x envoy로 정리하세요.pkill -f 'envoy -c'는 그 문자열이 든 셸 자신까지 죽입니다. - 기동을 기다릴 때는 고정
sleep대신/ready가 LIVE 를 돌려줄 때까지 도는 루프를 쓰세요. - 업스트림 흉내용 서버가 이미 이미지에 있습니다:
python3 /opt/lab/envoy/upstream.py <포트> ok. 최소 설정 본보기는/opt/lab/envoy/minimal.yaml에 있습니다. - 흔한 실수 —
envoy --mode validate ... | tee처럼 파이프를 걸면$?가 Envoy 의 종료 코드가 아니라 파이프 마지막 명령의 것이 됩니다.
단계 8개
- 배포하기 전에 설정만 먼저 검사한다
- 이름 한 글자를 틀리면 프로세스가 아예 뜨지 않는다
- 이 프록시가 누구인지 설정에 적는다
- 다섯 층을 경로로 짚어 본다
- 두 번째 Envoy 가 뜨지 않는다
- 명령줄 옵션이 어디에 남는지 확인한다
- 관리 포트는 죽이는 단추까지 들고 있다
- 배포 전 점검표로 정리한다