지난 글에서 소개한 EKS Blueprints for Terraform의 패턴 중 하나로 istio를 실습해보기로 했다. 왜 istio냐 라는 질문엔 채용 공고, 꽤 규모 있고 잘하는 회사들의 기술 스택에서 꼭 눈에 보이기 때문이다(eks blueprints 패턴 중 하나라는 점으로도 검증). 그럼 istio가 무엇이길래? 깊게 알아보진 않았다. 내가 알고 있는 배경지식은:
•
서비스 메쉬 구현 중 하나이다.
◦
목적 중 하나로 mTLS를 구성하기 위함이라고 알고 있다(feat. CKS)
•
Envoy로 만들었다.
◦
nginx의 대안으로, dynamic config L7 proxy를 위해 사용해봤다(결국 도입되진 않았지만).
우선은 blueprint로 간단하게 설치해 볼 수 있으니 눈으로 보면서 무엇인지 습득해 나간다.
비용 최적(소?)화
blueprint에서 사용하는 eks 모듈의 인자 값은 모두 변수로 노출되지 않는다. 따라서 변경해주어야 하는데 그냥 apply 하는거 보다 비용을 줄이려는 목적으로 몇 군데 수정해봤다:
•
2개의 AZs; 실질적인 비용이 줄진 않지만 적은 개수가 덜 헷갈린다. 가용성 대비
•
single NAT(이미 되어 있다)
•
노드그룹 min/max/desired 개수
•
인스턴스 타입; t4g 사용하려 했으나 예제 앱 이미지가 x86만 지원하여 t3 사용
버그 수정
json: cannot unmarshal object into Go value of type []*kubernetes.RegistryEndpoint
오류 팝업은 없다. ingress/egressgateway가 없다곤 하지만 아직 무엇이 문젠진 알 수 없다.
실습
•
네임스페이스에 배포된 파드 사이드카로 istio proxy가 설치될 수 있도록 레이블을 붙인다
k label namespace sample istio-injection=enabled
•
샘플 앱으로 요청하여 결과를 확인한다.
~ $ curl -v helloworld.sample:5000/hello
* Trying 172.20.203.41:5000...
* Connected to helloworld.sample (172.20.203.41) port 5000
> GET /hello HTTP/1.1
> Host: helloworld.sample:5000
> User-Agent: curl/8.4.0
> Accept: */*
>
< HTTP/1.1 200 OK
< server: envoy
< date: Tue, 28 Nov 2023 07:46:55 GMT
< content-type: text/html; charset=utf-8
< content-length: 58
< x-envoy-upstream-service-time: 173
<
Hello version: v1, instance: helloworld-v1-b6c45f55-7t9nt
* Connection #0 to host helloworld.sample left intact
~ $
Bash
복사
응답의 server가 envoy임을, envoy proxy가 응답했음을 확인한다. 물론 파드를 띄우면 istio의 init 그리고 proxy 컨테이너가 생기는 것도 확인할 수 있다. 끝? istio 문서의 더 풍성한 예시를 실습해봐야겠다(역시 찍먹은 날먹이다). istio가 무엇이고 어떤 목적으로 사용할 수 있는지 알아보고 목표를 정하고 학습해봐야겠다. blueprint 쪽은 그것 자체가 목적이 아니기에 아주 간단한 예시를 써 둔 것 같다. 아주 단편적이지만 그래도 몇 가지 습득한 점이 있다:
•
istiod 노드 하나를 띄우기 위한 최소 스펙과 처리할 수 있는 cap이 있다.
When namespace isolation is enabled, a single Istiod instance can support 1000 services, 2000 sidecars with 1 vCPU and 1.5 GB of memory.
You can increase the number of Istiod instances to reduce the amount of time it takes for the configuration to reach all proxies.
https://istio.io/latest/docs/ops/deployment/performance-and-scalability/
•
네임스페이스 단위로 istio(envoy) proxy 사용 여부를 결정할 수 있다.
•
kiali로 가시성을 확보하기 위해 jaeger, prometheus, grafana가 필요하다.