Istio 서비스 메시 · 깔기 전에 무엇이 깔릴지 읽는다 · 실습
깔기 전에 무엇이 깔릴지 읽는다 — 프로파일과 메시 설정
목표
istioctl manifest generate 로 네 가지 설치 프로파일을 클러스터 없이 렌더해 구성요소 차이를 표로 만들고, --set meshConfig.… 로 넣은 메시 전역 설정이 렌더된 ConfigMap istio 안에 실제로 나타나는지 확인한다. 마지막에는 네임스페이스 하나만 덮어쓰는 ProxyConfig 를 진짜 API 서버에 적용해 스키마가 무엇을 강제하는지 본다.
왜 중요한가
메시 도입에서 되돌리기가 가장 비싼 결정 두 가지가 프로파일과 메시 전역 설정이다. 프로파일은 무엇을 띄울지를 정하고(게이트웨이를 둘 것인가, 앰비언트로 갈 것인가), 메시 전역 설정은 모든 프록시의 기본값이 된다. outboundTrafficPolicy.mode 하나를 REGISTRY_ONLY 로 바꾸면 그 순간부터 등록되지 않은 바깥 주소로 나가는 모든 호출이 끊긴다. 그래서 이 값들은 깔기 전에 읽어야 한다. 다행히 istioctl 은 클러스터 없이도 설치 결과를 통째로 렌더해 준다 — 매니페스트는 그 자체로 읽을 수 있는 문서이고, 프로파일을 바꿔 가며 렌더해 비교하면 무엇이 늘고 주는지 한눈에 들어온다. 값을 잘못 쓰면 클러스터에 닿기도 전에 거절당한다는 것도 여기서 확인한다.
단계
1. /root/ist-profiles 를 만들고 istioctl manifest generate --set profile=default 의 출력을 /root/ist-profiles/default.yaml 에 저장하세요. 그다음 그 파일에 든 오브젝트를 종류별로 세어 /root/ist-profiles/default-kinds.tsv 에 <kind>\t<개수> 로, 종류 이름 오름차순으로 적으세요.
2. --set profile=minimal 렌더를 /root/ist-profiles/minimal.yaml 에 저장하세요. 그리고 default 에는 있는데 minimal 에는 없는 오브젝트를 /root/ist-profiles/minimal-missing.tsv 에 <kind>|<이름> 한 줄씩, 정렬해서 적으세요.
3. --set profile=demo 렌더를 /root/ist-profiles/demo.yaml 에 저장하고, demo 에만 있고 default 에는 없는 오브젝트를 /root/ist-profiles/demo-extra.tsv 에 <kind>|<이름> 으로 정렬해 적으세요.
4. default 프로파일을 그대로 쓰되 --set values.gateways.istio-ingressgateway.autoscaleMin=3 을 더해 렌더한 결과를 /root/ist-profiles/gw-scaled.yaml 에 저장하세요. 그리고 덮어쓰기 전과 후의 HorizontalPodAutoscaler istio-ingressgateway 의 spec.minReplicas 값을 /root/ist-profiles/hpa-before-after.tsv 에 before\t<값> 과 after\t<값> 두 줄로 적으세요.
5. minimal 프로파일에 네 가지 메시 설정을 더해 렌더하세요 — meshConfig.outboundTrafficPolicy.mode 는 REGISTRY_ONLY, meshConfig.accessLogFile 은 /dev/stdout, meshConfig.trustDomain 은 lab.internal, meshConfig.defaultConfig.holdApplicationUntilProxyStarts 는 true 입니다. 렌더 결과에서 이름이 istio 인 ConfigMap 오브젝트만 뽑아 /root/ist-profiles/mesh-cm.yaml 에 저장하고, 그 ConfigMap 의 data.mesh 문자열만 /root/ist-profiles/mesh.yaml 에 저장하세요.
6. 세 번 일부러 틀려 보고 그 오류 문장을 /root/ist-profiles/rejected.txt 에 순서대로 모으세요 — (1) minimal 프로파일에 meshConfig.outboundTrafficPolicy.mode 를 BLOCK_ALL 로 주기, (2) --set profile=sidecarless 로 없는 프로파일 부르기, (3) --profile=minimal 처럼 플래그 모양으로 프로파일 주기. 표준오류도 함께 담으세요.
7. 네임스페이스 profile-lab 를 만들고, 그 안에 ProxyConfig ns-default 를 실제로 적용하세요 — spec.concurrency 는 2, spec.environmentVariables 에 ISTIO_META_LAB_TIER: "gold" 를 둡니다. 매니페스트는 /root/ist-profiles/proxyconfig.yaml 에 두세요. 그다음 /root/ist-profiles/proxyconfig-negative.yaml 에 ns-negative 를 concurrency: -1 로 써서 서버 쪽 시험 적용으로 거절당하게 하고, 그 거절 문장을 /root/ist-profiles/proxyconfig-reject.txt 에 저장하세요.
8. /root/ist-profiles/profile-matrix.tsv 에 <프로파일>\t<kind>|<이름>\t<yes|no> 를 적으세요 — 프로파일은 default·demo·minimal·ambient 네 가지가 모두 나와야 하고, 컴포넌트는 Deployment|istiod·Deployment|istio-ingressgateway·Deployment|istio-egressgateway·DaemonSet|ztunnel·DaemonSet|istio-cni-node 다섯 가지가 모두 나와야 합니다(스무 줄). /root/ist-profiles/check-profiles.sh 는 이 표를 읽어 프로파일을 다시 렌더하고 맞으면 OK … 틀리면 MISMATCH … 를 표준출력에만 찍으며 한 줄이라도 틀리면 0 이 아닌 코드로 끝나야 합니다. 그 출력을 /root/ist-profiles/matrix-result.txt 에 저장하세요.
참고
--set profile=<이름>이 프로파일을 고릅니다.--profile=이라는 플래그는 1.24 에 없습니다.- 렌더 결과에서 오브젝트를 뽑을 때는
yq -N e '[.kind, .metadata.name] | join("|")' 파일이 편합니다. - MeshConfig 는 CRD 가 아니라 ConfigMap
istio의mesh키에 들어갑니다. - 흔한 실수: 렌더된 파일을 grep 으로만 세다 보면 문서 경계를 놓칩니다. yq 로 문서 단위로 세세요.
- 흔한 실수:
values.…와meshConfig.…를 섞어 씁니다. 앞쪽은 차트 값, 뒤쪽은 메시 설정입니다. - 참고: https://istio.io/v1.24/docs/setup/additional-setup/config-profiles/
- 참고: https://istio.io/v1.24/docs/reference/config/istio.mesh.v1alpha1/
단계 8개
- 기본 프로파일이 무엇을 만드는지 먼저 센다
- minimal 로 내리면 정확히 무엇이 사라지나
- demo 는 default 위에 무엇을 더 얹나
- 프로파일을 고르는 것과 값 하나를 덮어쓰는 것은 다른 손잡이다
- 메시 전역 설정은 ConfigMap 한 장으로 렌더된다
- 렌더 단계에서 거절당하는 세 가지
- 메시 전역 설정을 네임스페이스 하나만 덮어쓴다
- 네 프로파일의 구성요소 표를 만들고 스스로 검증하게 한다