LabHub
学习 学习路径 课程

Istio 심화 — 왜 그렇게 흐르는가 · pilot-agent 가 Envoy 에게 넘기는 것 · 实验

부트스트랩을 만들어 보고 뜨지 않는 두 경우를 가른다

在 LabHub 中继续学习

목표

주입 산출물에서 pilot-agent 의 재료를 뽑고, istiod 식 부트스트랩을 손으로 써서 거르고, 사이드카가 뜨지 않는 두 경우(설정 거절과 설정 서버 부재)를 직접 만들어 가른다.

왜 중요한가

사이드카 장애의 절반은 두 증상으로 온다 — 컨테이너가 CrashLoop 이거나, 떠 있는데 Ready 가 아니거나. 앞의 것은 부트스트랩이 틀린 것이고 뒤의 것은 istiod 에서 설정을 못 받은 것이다. 부트스트랩이 무엇으로 만들어지는지 알면 로그 한 줄과 관리 포트 한 번으로 둘을 가를 수 있다.

단계

1. /root/ist2-boot 에서 istioctl kube-inject/opt/lab/fixtures/istio/inject-target.yaml 에 사이드카를 넣어 /root/ist2-boot/inject.yaml 로 저장하세요(주입 설정 세 파일을 모두 넘깁니다). 그다음 istio-proxy 컨테이너의 args 를 읽어 /root/ist2-boot/01-args.txt 에 네 줄을 적으세요 — role=(두 번째 인자), domain=(--domain 다음 인자 그대로), proxy_log_level=(--proxyLogLevel= 의 값), component_log_level=(--proxyComponentLogLevel= 의 값).
2. /root/ist2-boot/inject.yamlistio-proxy 환경 변수에서 일곱 개를 골라 /root/ist2-boot/02-env.txt이름=값 으로 적으세요 — CA_ADDR, PILOT_CERT_PROVIDER, ISTIO_META_CLUSTER_ID, TRUST_DOMAIN, ISTIO_META_WORKLOAD_NAMEvalue 를 그대로, POD_NAMESPACE, SERVICE_ACCOUNT 는 값이 파드에서 오므로 fieldRef:<fieldPath> 꼴(예: fieldRef:metadata.name)로 적습니다.
3. /opt/istio/mesh-config.yaml 을 읽어 /root/ist2-boot/03-mesh.txt 에 네 줄을 적으세요 — discovery_address=(defaultConfig.discoveryAddress), root_namespace=, trust_domain=, 그리고 ca_addr_same= 에는 그 discoveryAddress 가 2단계의 CA_ADDR 과 글자 그대로 같으면 yes, 아니면 no.
4. /root/ist2-boot/bootstrap.yaml 에 부트스트랩을 쓰세요 — 관리 포트 9982; node.id 는 네 칸 sidecar, 10.0.0.7, payments-6d5f9.default, default.svc.cluster.local 을 이 순서로 물결표(~)로 이은 것, node.clusterpayments.default, node.metadata 에는 CLUSTER_ID·MESH_ID·NAMESPACE·WORKLOAD_NAME 네 열쇠(값은 2단계의 ISTIO_META_ 변수와 네임스페이스 default); dynamic_resources 는 ADS(gRPC)로 cds_config·lds_config 를 받고 initial_fetch_timeout: 0s; ADS 가 가리키는 정적 클러스터 이름은 xds-grpc, STRICT_DNS 로 3단계의 discovery_address 를 가리키며 HTTP/2 를 씁니다. envoy --mode validate 의 출력과 종료 코드를 /root/ist2-boot/04-validate.txt 에 담으세요(마지막 줄 rc=0).
5. /root/ist2-boot/bootstrap.yaml/root/ist2-boot/boot-typo.yaml 로 복사한 뒤 ADS 쪽(ads_configcluster_name)만 istiod-xds 로 바꾸세요(정적 클러스터 이름 xds-grpc 는 그대로). envoy --mode validate 로 검사해 출력과 종료 코드를 /root/ist2-boot/05-typo.txt 에 담으세요(마지막 줄 rc= 로).
6. /root/ist2-boot/bootstrap.yaml 로 Envoy 를 띄우세요(이 파드에는 istiod 가 없습니다). 관리 포트의 /config_dump 에서 부트스트랩의 nodeid·cluster·metadata 세 필드만 뽑아 /root/ist2-boot/06-node.json 에 저장하고, /root/ist2-boot/06-ready.txt 에 세 줄을 적으세요 — ready_code=(/ready 의 HTTP 코드), ready_body=(그 본문), connected_state=(통계 control_plane.connected_state 의 값).
7. /root/ist2-boot/inject.yaml 에서 신원의 재료를 찾아 /root/ist2-boot/07-identity.txt 에 다섯 줄을 적으세요 — token_volume=(serviceAccountToken 을 투영하는 볼륨 이름), token_audience=(그 토큰의 audience), token_mount=(그 볼륨이 istio-proxy 에 붙는 경로), ca_configmap=(볼륨 istiod-ca-cert 가 읽는 ConfigMap 이름), ca_mount=(istiod-ca-certistio-proxy 에 붙는 경로).
8. /root/ist2-boot/08-report.mdxds_address=, xds_cluster=, typo_rc=, ready_without_istiod= 네 줄을 적고(각각 xDS 를 받는 주소, ADS 가 가리켜야 하는 정적 클러스터 이름, 5단계의 종료 코드, 6단계에서 본 /ready 본문), 그 아래 - 로 시작하는 설명을 네 줄 이상 적으세요.

참고

8个步骤

  1. 프록시 컨테이너는 Envoy 가 아니라 pilot-agent 를 띄운다
  2. 환경 변수가 프록시의 이름표와 주소록이 된다
  3. 메시 설정의 기본값과 CA 주소를 대조한다
  4. istiod 식 부트스트랩을 손으로 써서 거른다
  5. 클러스터 이름 한 글자가 CrashLoop 을 만든다
  6. istiod 에 닿지 못한 프록시는 준비되지 않는다
  7. 신원은 두 볼륨에서 시작한다
  8. 사이드카가 뜨지 않을 때의 점검표로 정리한다