Istio 심화 — 왜 그렇게 흐르는가 · 클러스터 이름 규칙과 서브셋 · 실습
서브셋을 클러스터로 세우고 이름으로 추적한다
목표
DestinationRule 에서 클러스터 이름을 규칙으로 도출하고, 그 이름 그대로 Envoy 를 구성해 서브셋별 라우팅·통계 이름·없는 서브셋의 503 을 직접 확인한다.
왜 중요한가
Istio 장애 조사의 절반은 proxy-config clusters 와 통계를 읽는 일이다. 클러스터 이름은 규칙으로 만들어지므로 규칙을 알면 이름만 보고 서비스·포트·서브셋을 알아볼 수 있고, '서브셋이 없다', '엔드포인트가 비었다', '통계 이름이 바뀌었다' 를 몇 초 만에 가를 수 있다.
단계
1. /root/ist2-name/dr.yaml 에 DestinationRule 을 쓰세요 — 이름 reviews, 네임스페이스 default, host 는 reviews.default.svc.cluster.local, 서브셋 v1(라벨 version: v1)과 v2(라벨 version: v2). istioctl validate -f /root/ist2-name/dr.yaml 의 출력과 종료 코드를 /root/ist2-name/01-validate.txt 에 담으세요(마지막 줄 rc=0).
2. 서비스 reviews 는 포트 9080 을 씁니다. /root/ist2-name/dr.yaml 로 사이드카들이 갖게 될 클러스터 이름 네 개를 /root/ist2-name/02-names.txt 에 한 줄에 하나씩 적으세요 — 다른 파드가 reviews 로 나갈 때 쓰는 것 셋(서브셋 없는 것 하나와 서브셋마다 하나), 그리고 reviews 파드 자신이 들어오는 요청을 앱으로 넘길 때 쓰는 것 하나.
3. /root/ist2-name/name.yaml 에 Envoy 설정을 쓰세요 — 관리 포트 9983, 리스너 127.0.0.1:10083(HTTP), route_config 이름 9080, 모든 경로를 outbound|9080|v1|reviews.default.svc.cluster.local 로 보냅니다. 클러스터는 나가는 쪽 셋 — outbound|9080||reviews.default.svc.cluster.local(엔드포인트 127.0.0.1:8103 과 127.0.0.1:8104 둘), outbound|9080|v1|reviews.default.svc.cluster.local(8103 만), outbound|9080|v2|reviews.default.svc.cluster.local(8104 만). 업스트림 둘을 8103·8104 에 ok 로 띄우고 Envoy 를 띄운 뒤, curl localhost:10083/ 결과를 /root/ist2-name/03-v1.txt 에 status= 와 body= 두 줄로 적으세요.
4. /root/ist2-name/name.yaml 을 /root/ist2-name/split.yaml 로 복사하고, 라우트를 가중치 라우트로 바꾸세요 — outbound|9080|v1|reviews.default.svc.cluster.local 75, outbound|9080|v2|reviews.default.svc.cluster.local 25. Envoy 를 split.yaml 로 --concurrency 1 을 붙여 다시 띄운 뒤 curl localhost:10083/ 를 정확히 40 번 보내 응답 본문으로 어느 서브셋에 갔는지 세고, /root/ist2-name/04-split.txt 에 v1=, v2=, total= 세 줄로 적으세요.
5. /root/ist2-name/split.yaml 의 outbound|9080|v2|reviews.default.svc.cluster.local 클러스터에 alt_stat_name: outbound_9080_v2_reviews 를 더하고(다른 것은 그대로) 다시 띄운 뒤 요청을 20 번 이상 보내세요. 관리 포트의 /stats 에서 두 줄을 그대로 옮겨 /root/ist2-name/05-stats.txt 에 저장하세요 — v1 클러스터의 upstream_rq_200 줄, 그리고 v2 클러스터의 upstream_rq_200 줄(이제 바뀐 이름으로 나옵니다).
6. /root/ist2-name/split.yaml 을 /root/ist2-name/missing.yaml 로 복사하고 두 가지를 바꾸세요 — route_config 에 validate_clusters: false 를 더하고, 기존 라우트 앞에 경로 접두사 /v3 를 outbound|9080|v3|reviews.default.svc.cluster.local 로 보내는 라우트를 더합니다(이 클러스터는 만들지 않습니다). 그리고 missing.yaml 에서 validate_clusters: false 줄만 뺀 사본 /root/ist2-name/missing-strict.yaml 도 만드세요. missing.yaml 로 띄운 뒤 curl localhost:10083/v3 를 한 번 보내고 /root/ist2-name/06-missing.txt 에 세 줄을 적으세요 — status=(HTTP 코드), no_cluster=(통계 http.outbound_0.0.0.0_9080.no_cluster 의 값), strict_rc=(missing-strict.yaml 을 envoy --mode validate 한 종료 코드).
7. 떠 있는 Envoy 의 localhost:9983/clusters 에서 reviews 의 세 클러스터가 각각 엔드포인트를 몇 개 가졌는지 세어 /root/ist2-name/07-endpoints.txt 에 <클러스터 이름> <개수> 꼴로 세 줄 적으세요.
8. /root/ist2-name/08-report.md 에 default_cluster=, inbound_cluster=, v2_stat_name=, missing_subset_code= 네 줄을 적고(각각 서브셋 없는 나가는 쪽 클러스터 이름, 들어오는 쪽 클러스터 이름, 5단계에서 바꾼 v2 의 통계 이름, 6단계에서 받은 HTTP 코드), 그 아래 - 로 시작하는 설명을 네 줄 이상 적으세요.
참고
- 이 파드에는 진짜 istiod 도 진짜 사이드카도 없습니다. 그래서
istioctl proxy-config로 실제 생성물을 볼 수 없고, 번역 규칙을 알고 손으로 등가 Envoy 설정을 만들어 동작을 확인합니다. 같은 규칙이 운영 클러스터의proxy-config출력에 그대로 보입니다. - 분배를 세는 4단계부터는 Envoy 를
--concurrency 1로 띄우세요. 워커가 여럿이면 가중치 실험이 더 흔들립니다. /stats와/clusters의 줄에는|가 들어 있습니다.grep에서는\|로 이스케이프하거나grep -F를 쓰세요.- Envoy 를 띄울 때는
setsid --fork nohup envoy -c <파일> --log-level warn > <로그> 2>&1 </dev/null로 셸에서 완전히 떼어 놓으세요. 다시 띄우기 전에는pkill -x envoy로 정리합니다 (pkill -f 'envoy -c'는 그 문자열이 든 셸 자신까지 죽입니다). - 업스트림 흉내용 서버가 이미지에 있습니다:
python3 /opt/lab/envoy/upstream.py <포트> ok|fail|slow. 응답 본문은<모드>:<포트> <경로>입니다. - 설정을 고친 뒤에는 띄우기 전에
envoy --mode validate -c <파일>로 먼저 거르세요. 클러스터 이름에|가 들어가므로 YAML 에서는 반드시 따옴표로 감쌉니다.
8단계
- 서브셋 둘을 가진 DestinationRule 을 쓴다
- 규칙으로 클러스터 이름 네 개를 도출한다
- 그 이름 그대로 Envoy 를 세워 v1 로 보낸다
- 서브셋 가중치를 마흔 번 세어 본다
- 통계 이름은 클러스터 이름이다 — alt_stat_name 으로 바꾼다
- 없는 서브셋을 가리키면 503 이 된다
- 서브셋은 같은 서비스 엔드포인트의 부분집합이다
- 이름을 읽는 법으로 정리한다