ICA — 이스티오 인증 어소시에이트 · 게이트웨이와 인그레스 · 실습
게이트웨이와 외부 서비스 연결하기
목표
Gateway 로 진입점을 선언하고 VirtualService 로 라우팅을 붙이는 분업을 익히고, ServiceEntry 와 Sidecar 로 메시의 경계를 넓혔다 좁혔다 해 봅니다.
왜 중요한가
인그레스는 메시에서 가장 사고가 잦은 지점입니다. 원인은 대개 셋 중 하나입니다. Gateway 의 hosts 와 VirtualService 의 hosts 가 겹치지 않거나, gateways 필드를 빠뜨려 규칙이 메시 내부에만 적용되거나, credentialName 이 가리키는 시크릿이 게이트웨이 파드와 다른 네임스페이스에 있는 경우입니다. 셋 다 apply 는 성공하고 트래픽만 조용히 실패하므로, 매니페스트를 읽는 눈이 유일한 방어선입니다.
ServiceEntry 와 Sidecar 는 정반대 방향의 도구입니다. 하나는 메시 밖 서비스를 안으로 데려와 정책과 관측을 붙이고, 다른 하나는 사이드카가 알아야 할 범위를 줄여 메모리를 아낍니다. 대규모 메시에서 Envoy 메모리 문제의 표준 처방이 Sidecar 리소스라는 사실은 시험에도 실무에도 나옵니다.
Kubernetes 기본 리소스는 실제로 apply 하고, Istio CRD 는 /root/ica-gateway/ 아래 파일로 작성합니다.
단계
1. 네임스페이스 ica-gateway 를 만들고 라벨 istio-injection=enabled 를 붙이세요.
2. 네임스페이스 ica-gateway 에 디플로이먼트 shop-api 를 2 레플리카(이미지 nginx:1.27-alpine, 파드 라벨 app=shop-api)로 배포하고, 같은 이름의 서비스 shop-api 를 포트 8080, 포트 이름 http 로 만드세요.
3. 네임스페이스 ica-gateway 에 시크릿 shop-tls 를 타입 kubernetes.io/tls 로 만드세요. 키는 tls.crt 와 tls.key 두 개이고, 값은 자리표시자 문자열이어도 됩니다.
4. /root/ica-gateway/gw-shop.yaml 에 Gateway shop-gateway 를 작성하세요. spec.selector 는 istio: ingressgateway 이고 servers 는 두 개입니다. 첫 번째는 포트 443 / 프로토콜 HTTPS / hosts shop.example.com / tls.mode: SIMPLE / tls.credentialName: shop-tls. 두 번째는 포트 15443 / 프로토콜 TLS / hosts legacy.example.com / tls.mode: PASSTHROUGH 이며 credentialName 을 두지 않습니다.
5. /root/ica-gateway/vs-shop.yaml 에 VirtualService 를 작성하세요. hosts 는 shop.example.com, gateways 는 shop-gateway, http 라우팅 대상은 shop-api.ica-gateway.svc.cluster.local 의 포트 8080 입니다.
6. /root/ica-gateway/se-payment.yaml 에 ServiceEntry external-pg 를 작성하세요. hosts 는 api.pgprovider.example, location 은 MESH_EXTERNAL, resolution 은 DNS, ports 는 번호 443 / 이름 https / 프로토콜 TLS 입니다.
7. /root/ica-gateway/sidecar-default.yaml 에 Sidecar 를 작성하세요. metadata.name 은 default, metadata.namespace 는 ica-gateway 이고 spec.egress[0].hosts 에는 정확히 세 항목만 둡니다. 자기 네임스페이스(./*), 컨트롤 플레인(istio-system/*), 그리고 6단계에서 등록한 외부 호스트(*/api.pgprovider.example).
참고
- 시크릿을 YAML 로 만들 때
stringData를 쓰면 base64 인코딩을 직접 하지 않아도 됩니다. kubectl create secret tls는 실제 인증서 파일을 요구하므로 이 환경에서는 매니페스트를 직접 쓰는 편이 빠릅니다.- 흔한 실수 1: PASSTHROUGH 서버의 프로토콜을
HTTPS로 적는 것. 종료하지 않는데 HTTP 를 파싱할 수는 없습니다. - 흔한 실수 2: VirtualService 에
gateways를 빠뜨리는 것. 그러면 그 규칙은 메시 내부 트래픽에만 적용되고 외부 진입에는 아무 영향이 없습니다. - Sidecar 의 egress hosts 형식은
네임스페이스/호스트입니다. 네임스페이스를 모르는 외부 호스트에는*/를 씁니다.
단계 7개
- 게이트웨이 실습 네임스페이스 만들기
- 게이트웨이가 보낼 백엔드 준비
- TLS 시크릿 만들기
- 두 가지 TLS 모드를 한 Gateway 에 담기
- VirtualService 를 게이트웨이에 바인딩
- 외부 결제 API 를 메시에 등록
- Sidecar 로 시야 좁히기