LabHub
배우기 러닝패스 코스

Istio Service Mesh

Read what gets installed before installing it: profiles and mesh settings

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

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-ingressgatewayspec.minReplicas 값을 /root/ist-profiles/hpa-before-after.tsvbefore\t<값>after\t<값> 두 줄로 적으세요.
  5. minimal 프로파일에 네 가지 메시 설정을 더해 렌더하세요 — meshConfig.outboundTrafficPolicy.modeREGISTRY_ONLY, meshConfig.accessLogFile/dev/stdout, meshConfig.trustDomainlab.internal, meshConfig.defaultConfig.holdApplicationUntilProxyStartstrue 입니다. 렌더 결과에서 이름이 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.modeBLOCK_ALL 로 주기, (2) --set profile=sidecarless 로 없는 프로파일 부르기, (3) --profile=minimal 처럼 플래그 모양으로 프로파일 주기. 표준오류도 함께 담으세요.
  7. 네임스페이스 profile-lab 를 만들고, 그 안에 ProxyConfig ns-default 를 실제로 적용하세요 — spec.concurrency 는 2, spec.environmentVariablesISTIO_META_LAB_TIER: "gold" 를 둡니다. 매니페스트는 /root/ist-profiles/proxyconfig.yaml 에 두세요. 그다음 /root/ist-profiles/proxyconfig-negative.yamlns-negativeconcurrency: -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 에 저장하세요.

참고

기본 프로파일이 무엇을 만드는지 먼저 센다

/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-ingressgatewayspec.minReplicas 값을 /root/ist-profiles/hpa-before-after.tsvbefore\t<값>after\t<값> 두 줄로 적으세요.

--set profile= 은 묶음을 고르고 --set values.… 는 그 묶음 안의 값 하나를 바꿉니다. 렌더된 HPA 는 yq -N e 'select(.kind=="HorizontalPodAutoscaler")' 파일 로 꺼내 볼 수 있습니다. before 는 1단계에서 이미 뽑아 둔 파일에서 읽으면 됩니다.

메시 전역 설정은 ConfigMap 한 장으로 렌더된다

minimal 프로파일에 네 가지 메시 설정을 더해 렌더하세요 — meshConfig.outboundTrafficPolicy.modeREGISTRY_ONLY, meshConfig.accessLogFile/dev/stdout, meshConfig.trustDomainlab.internal, meshConfig.defaultConfig.holdApplicationUntilProxyStartstrue 입니다. 렌더 결과에서 이름이 istio 인 ConfigMap 오브젝트만 뽑아 /root/ist-profiles/mesh-cm.yaml 에 저장하고, 그 ConfigMap 의 data.mesh 문자열만 /root/ist-profiles/mesh.yaml 에 저장하세요.

MeshConfig 는 별도의 CRD 가 아니라 istio-system 의 ConfigMap istiomesh 키에 들어가는 YAML 덩어리입니다. yq -N e 'select(.kind=="ConfigMap" and .metadata.name=="istio")' - 로 오브젝트를, .data.mesh 로 문자열을 꺼냅니다.

렌더 단계에서 거절당하는 세 가지

세 번 일부러 틀려 보고 그 오류 문장을 /root/ist-profiles/rejected.txt 에 순서대로 모으세요 — (1) minimal 프로파일에 meshConfig.outboundTrafficPolicy.modeBLOCK_ALL 로 주기, (2) --set profile=sidecarless 로 없는 프로파일 부르기, (3) --profile=minimal 처럼 플래그 모양으로 프로파일 주기. 표준오류도 함께 담으세요.

세 번 모두 0 이 아닌 코드로 끝납니다. 명령 >> rejected.txt 2>&1 처럼 표준출력과 표준오류를 같은 파일에 이어 붙이면 됩니다. 셋은 서로 다른 층에서 걸립니다 — 값의 열거형, 파일 이름, 명령줄 문법입니다.

메시 전역 설정을 네임스페이스 하나만 덮어쓴다

네임스페이스 profile-lab 를 만들고, 그 안에 ProxyConfig ns-default 를 실제로 적용하세요 — spec.concurrency 는 2, spec.environmentVariablesISTIO_META_LAB_TIER: "gold" 를 둡니다. 매니페스트는 /root/ist-profiles/proxyconfig.yaml 에 두세요. 그다음 /root/ist-profiles/proxyconfig-negative.yamlns-negativeconcurrency: -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 에 저장하세요.

같은 프로파일을 여러 번 렌더하면 느려집니다 — 프로파일마다 한 번만 렌더해 임시 파일에 담아 두고 다시 쓰세요. 스크립트가 학생 산출물을 직접 고치면 채점기가 다시 돌릴 때 값이 달라지니 표준출력으로만 내보냅니다.