LabHub
배우기 러닝패스 코스

ICA — Istio認定アソシエイト

ゲートウェイと外部サービスを繋ぐ

LabHub 에서 이어서 보기

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

목표

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.crttls.key 두 개이고, 값은 자리표시자 문자열이어도 됩니다.
  4. /root/ica-gateway/gw-shop.yaml 에 Gateway shop-gateway 를 작성하세요. spec.selectoristio: 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 를 작성하세요. hostsshop.example.com, gatewaysshop-gateway, http 라우팅 대상은 shop-api.ica-gateway.svc.cluster.local 의 포트 8080 입니다.
  6. /root/ica-gateway/se-payment.yaml 에 ServiceEntry external-pg 를 작성하세요. hostsapi.pgprovider.example, locationMESH_EXTERNAL, resolutionDNS, ports 는 번호 443 / 이름 https / 프로토콜 TLS 입니다.
  7. /root/ica-gateway/sidecar-default.yaml 에 Sidecar 를 작성하세요. metadata.namedefault, metadata.namespaceica-gateway 이고 spec.egress[0].hosts 에는 정확히 세 항목만 둡니다. 자기 네임스페이스(./*), 컨트롤 플레인(istio-system/*), 그리고 6단계에서 등록한 외부 호스트(*/api.pgprovider.example).

참고

게이트웨이 실습 네임스페이스 만들기

네임스페이스 ica-gateway 를 만들고 라벨 istio-injection=enabled 를 붙이세요.

자동 주입 라벨까지 붙여야 다음 단계의 워크로드가 메시에 들어옵니다.

게이트웨이가 보낼 백엔드 준비

네임스페이스 ica-gateway 에 디플로이먼트 shop-api 를 2 레플리카(이미지 nginx:1.27-alpine, 파드 라벨 app=shop-api)로 배포하고, 같은 이름의 서비스 shop-api 를 포트 8080, 포트 이름 http 로 만드세요.

게이트웨이는 트래픽을 받기만 합니다. 실제로 응답할 워크로드와 그것을 묶는 서비스가 먼저 있어야 라우팅 대상이 생깁니다.

TLS 시크릿 만들기

네임스페이스 ica-gateway 에 시크릿 shop-tls 를 타입 kubernetes.io/tls 로 만드세요. 키는 tls.crttls.key 두 개이고, 값은 자리표시자 문자열이어도 됩니다.

타입이 중요합니다. credentialName 은 kubernetes.io/tls 타입의 시크릿만 인식하고, 그 안에는 tls.crt 와 tls.key 두 키가 있어야 합니다. 이 실습 환경에는 CA 가 없으니 자리표시자 문자열로 채워도 됩니다.

두 가지 TLS 모드를 한 Gateway 에 담기

/root/ica-gateway/gw-shop.yaml 에 Gateway shop-gateway 를 작성하세요. spec.selectoristio: 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 을 두지 않습니다.

TLS 를 종료하는 서버와 통과시키는 서버는 프로토콜 표기가 다릅니다. 종료하지 않는 쪽은 HTTP 를 파싱하지 않으므로 HTTPS 가 아니며, 인증서를 들 필요도 없습니다.

VirtualService 를 게이트웨이에 바인딩

/root/ica-gateway/vs-shop.yaml 에 VirtualService 를 작성하세요. hostsshop.example.com, gatewaysshop-gateway, http 라우팅 대상은 shop-api.ica-gateway.svc.cluster.local 의 포트 8080 입니다.

바인딩은 두 조건이 함께 맞아야 합니다. gateways 필드에 이름이 있어야 하고, hosts 가 Gateway 의 server hosts 와 겹쳐야 합니다. destination 에는 포트 번호도 적으세요.

외부 결제 API 를 메시에 등록

/root/ica-gateway/se-payment.yaml 에 ServiceEntry external-pg 를 작성하세요. hostsapi.pgprovider.example, locationMESH_EXTERNAL, resolutionDNS, ports 는 번호 443 / 이름 https / 프로토콜 TLS 입니다.

메시 밖의 서비스이므로 location 값이 정해져 있고, endpoints 를 적지 않았다면 이름을 어떻게 풀지 알려 줘야 합니다. 443 포트의 프로토콜은 TLS 입니다.

Sidecar 로 시야 좁히기

/root/ica-gateway/sidecar-default.yaml 에 Sidecar 를 작성하세요. metadata.namedefault, metadata.namespaceica-gateway 이고 spec.egress[0].hosts 에는 정확히 세 항목만 둡니다. 자기 네임스페이스(./*), 컨트롤 플레인(istio-system/*), 그리고 6단계에서 등록한 외부 호스트(*/api.pgprovider.example).

네임스페이스의 기본값이 되려면 이름이 정해져 있습니다. egress hosts 는 자기 네임스페이스, 컨트롤 플레인, 그리고 6단계에서 등록한 외부 호스트 딱 세 개만 남기세요. 외부 호스트는 네임스페이스 자리에 와일드카드를 씁니다.