安装之前先读懂会装进什么——配置档与网格设置
한국어 원문으로 표시합니다.
목표
istioctl manifest generate 로 네 가지 설치 프로파일을 클러스터 없이 렌더해 구성요소 차이를 표로 만들고, --set meshConfig.… 로 넣은 메시 전역 설정이 렌더된 ConfigMap istio 안에 실제로 나타나는지 확인한다. 마지막에는 네임스페이스 하나만 덮어쓰는 ProxyConfig 를 진짜 API 서버에 적용해 스키마가 무엇을 강제하는지 본다.
왜 중요한가
메시 도입에서 되돌리기가 가장 비싼 결정 두 가지가 프로파일과 메시 전역 설정이다. 프로파일은 무엇을 띄울지를 정하고(게이트웨이를 둘 것인가, 앰비언트로 갈 것인가), 메시 전역 설정은 모든 프록시의 기본값이 된다. outboundTrafficPolicy.mode 하나를 REGISTRY_ONLY 로 바꾸면 그 순간부터 등록되지 않은 바깥 주소로 나가는 모든 호출이 끊긴다. 그래서 이 값들은 깔기 전에 읽어야 한다. 다행히 istioctl 은 클러스터 없이도 설치 결과를 통째로 렌더해 준다 — 매니페스트는 그 자체로 읽을 수 있는 문서이고, 프로파일을 바꿔 가며 렌더해 비교하면 무엇이 늘고 주는지 한눈에 들어온다. 값을 잘못 쓰면 클러스터에 닿기도 전에 거절당한다는 것도 여기서 확인한다.
단계
/root/ist-profiles를 만들고istioctl manifest generate --set profile=default의 출력을/root/ist-profiles/default.yaml에 저장하세요. 그다음 그 파일에 든 오브젝트를 종류별로 세어/root/ist-profiles/default-kinds.tsv에<kind>\t<개수>로, 종류 이름 오름차순으로 적으세요.--set profile=minimal렌더를/root/ist-profiles/minimal.yaml에 저장하세요. 그리고 default 에는 있는데 minimal 에는 없는 오브젝트를/root/ist-profiles/minimal-missing.tsv에<kind>|<이름>한 줄씩, 정렬해서 적으세요.--set profile=demo렌더를/root/ist-profiles/demo.yaml에 저장하고, demo 에만 있고 default 에는 없는 오브젝트를/root/ist-profiles/demo-extra.tsv에<kind>|<이름>으로 정렬해 적으세요.- default 프로파일을 그대로 쓰되
--set values.gateways.istio-ingressgateway.autoscaleMin=3을 더해 렌더한 결과를/root/ist-profiles/gw-scaled.yaml에 저장하세요. 그리고 덮어쓰기 전과 후의HorizontalPodAutoscaleristio-ingressgateway의spec.minReplicas값을/root/ist-profiles/hpa-before-after.tsv에before\t<값>과after\t<값>두 줄로 적으세요. - 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에 저장하세요. - 세 번 일부러 틀려 보고 그 오류 문장을
/root/ist-profiles/rejected.txt에 순서대로 모으세요 — (1) minimal 프로파일에meshConfig.outboundTrafficPolicy.mode를BLOCK_ALL로 주기, (2)--set profile=sidecarless로 없는 프로파일 부르기, (3)--profile=minimal처럼 플래그 모양으로 프로파일 주기. 표준오류도 함께 담으세요. - 네임스페이스
profile-lab를 만들고, 그 안에ProxyConfigns-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에 저장하세요. /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/
기본 프로파일이 무엇을 만드는지 먼저 센다
/root/ist-profiles 를 만들고 istioctl manifest generate --set profile=default 의 출력을 /root/ist-profiles/default.yaml 에 저장하세요. 그다음 그 파일에 든 오브젝트를 종류별로 세어 /root/ist-profiles/default-kinds.tsv 에 <kind>\t<개수> 로, 종류 이름 오름차순으로 적으세요.
렌더 결과는 여러 문서가 이어 붙은 YAML 입니다. yq -N e '.kind' 파일 로 문서마다 kind 를 뽑을 수 있고, 거기에 sort 와 uniq -c 를 이어 붙이면 개수가 나옵니다. 칸 구분은 탭입니다.
minimal 로 내리면 정확히 무엇이 사라지나
--set profile=minimal 렌더를 /root/ist-profiles/minimal.yaml 에 저장하세요. 그리고 default 에는 있는데 minimal 에는 없는 오브젝트를 /root/ist-profiles/minimal-missing.tsv 에 <kind>|<이름> 한 줄씩, 정렬해서 적으세요.
두 파일에서 [.kind, .metadata.name] | join("|") 를 뽑아 각각 sort -u 로 정리한 뒤 comm 으로 비교하면 한 쪽에만 있는 줄이 나옵니다. 사라지는 것은 한 컴포넌트에 딸린 오브젝트 묶음입니다.
demo 는 default 위에 무엇을 더 얹나
--set profile=demo 렌더를 /root/ist-profiles/demo.yaml 에 저장하고, demo 에만 있고 default 에는 없는 오브젝트를 /root/ist-profiles/demo-extra.tsv 에 <kind>|<이름> 으로 정렬해 적으세요.
2단계와 같은 방법인데 방향이 반대입니다. comm 은 -23 과 -13 이 서로 반대쪽만 남깁니다. demo 가 더 얹는 것은 나가는 트래픽을 한 곳으로 모으는 컴포넌트입니다.
프로파일을 고르는 것과 값 하나를 덮어쓰는 것은 다른 손잡이다
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<값> 두 줄로 적으세요.
--set profile= 은 묶음을 고르고 --set values.… 는 그 묶음 안의 값 하나를 바꿉니다. 렌더된 HPA 는 yq -N e 'select(.kind=="HorizontalPodAutoscaler")' 파일 로 꺼내 볼 수 있습니다. before 는 1단계에서 이미 뽑아 둔 파일에서 읽으면 됩니다.
메시 전역 설정은 ConfigMap 한 장으로 렌더된다
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 에 저장하세요.
MeshConfig 는 별도의 CRD 가 아니라 istio-system 의 ConfigMap istio 안 mesh 키에 들어가는 YAML 덩어리입니다. yq -N e 'select(.kind=="ConfigMap" and .metadata.name=="istio")' - 로 오브젝트를, .data.mesh 로 문자열을 꺼냅니다.
렌더 단계에서 거절당하는 세 가지
세 번 일부러 틀려 보고 그 오류 문장을 /root/ist-profiles/rejected.txt 에 순서대로 모으세요 — (1) minimal 프로파일에 meshConfig.outboundTrafficPolicy.mode 를 BLOCK_ALL 로 주기, (2) --set profile=sidecarless 로 없는 프로파일 부르기, (3) --profile=minimal 처럼 플래그 모양으로 프로파일 주기. 표준오류도 함께 담으세요.
세 번 모두 0 이 아닌 코드로 끝납니다. 명령 >> rejected.txt 2>&1 처럼 표준출력과 표준오류를 같은 파일에 이어 붙이면 됩니다. 셋은 서로 다른 층에서 걸립니다 — 값의 열거형, 파일 이름, 명령줄 문법입니다.
메시 전역 설정을 네임스페이스 하나만 덮어쓴다
네임스페이스 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 에 저장하세요.
ProxyConfig 는 networking.istio.io/v1beta1 의 CRD 로, MeshConfig 의 defaultConfig 를 네임스페이스나 워크로드 단위로 덮어씁니다. 적용하지 않고 API 서버에게 물어만 보려면 kubectl apply --dry-run=server 를 씁니다. 음수 검사는 istioctl 이 아니라 CRD 스키마가 합니다.
네 프로파일의 구성요소 표를 만들고 스스로 검증하게 한다
/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 에 저장하세요.
같은 프로파일을 여러 번 렌더하면 느려집니다 — 프로파일마다 한 번만 렌더해 임시 파일에 담아 두고 다시 쓰세요. 스크립트가 학생 산출물을 직접 고치면 채점기가 다시 돌릴 때 값이 달라지니 표준출력으로만 내보냅니다.