Istio
Service-Mesh 적용을 위한 컴포넌트입니다. Istio는 배포된 수많은 서비스(애플리케이션)들을 쉽게 관리하고 자동화 할 수 있게 해주는 네트워크 레이어에서 동작하는 컴포넌트입니다. 투라코에서는 마이크로서비스 아키텍처에 대해 설계 초기부터 적용할 수 있도록 컴포넌트로 제공하고 있습니다.
본 챕터에서는 Turaco에서 제공하는 Istio 컴포넌트를 활용하는 방법을 설명합니다.
Turaco 에서는 아키텍처 설계 시, 최초에 어떤 네트워크 레이어를 사용할지 선택 할 수 있습니다.

⓵ '아키텍처 생성'버튼을 선택하면 그림과 같이 Nginx Ingress Controller 또는 Istio를 선택하는 옵션이 나타납니다.
'Istio' 버튼을 선택하면 전체 아키텍처에 Istio 네트워킹 레이어를 사용할 수 있게 됩니다.
아키텍처 생성 시, 네트워크 타입은 추후 변경할 수 없습니다. 설계전 어떤 타입을 사용할 것인지 충분히 검토 후 선택해야 합니다.
⓶ istio 컴포넌트를 선택하면 Turaco 디자이너 화면으로 진입하며 istio 컴포넌트를 선택할 수 있습니다.
Istio는 3개의 주요 컴포넌트로 구성되어 있습니다.

| 컴포넌트 이름 | 설명 |
|---|---|
| Gateway | 클러스터 외부에서 발생하는 트래픽으로부터 클러스터에 대한 액세스를 보호하고 제어하는 역할 수행 |
| VirtualService | 들어온 트래픽을 라우팅하는 역할 수행 |
| DestinationRule | VirtualService가 라우팅한 트래픽을 어떻게 보낼 것인지 결정하는 역할 수행 |
Gateway
Istio의 Gateway는 트래픽을 최초로 수신하는 컴포넌트이며 트래픽 수신을 위한 서버 및 호스트 등을 설정할 수 있습니다. Turaco에서는 몇가지 설정만으로 간단하게 Gateway 설정을 진행할 수 있습니다.
이름 및 속성 설정
⓷ 컴포넌트 리스트에서 Gateway 컴포넌트를 선택하고 드래그하여 디자이너 영역으로 드롭합니다.
최초 Gateway에 대한 속성을 입력하는 화면이 나타납니다.
원하는 컴포넌트 이름과 설명을 추가합니다.

동일한 아키텍처내에서 컴포넌트 이름을 중복해서 사용할 수 없습니다.
서비스 및 서버 설정
⓸ 서버 설정 ⓹ 호스트 설정
컴포넌트 이름과 설명을 추가하고 디자이너 화면의 Gateway 컴포넌트를 클릭하면 상세 속성 설정창이 오른쪽에 표시됩니다.
상세 속성창에서 "+ADD" 버튼을 클릭하면 게이트웨이가 수신할 서비스를 설정하는 포트 설정창이 나타납니다.
트래픽을 받을 호스트 이름을 입력합니다.
호스트 이름은 1개 이상 추가할 수 있습니다.
기본값은 '*' (Wildcard)로 모든 호스트 이름과 매핑됩니다.
⓺ Istio 프록시 인젝션
클러스터내에 배포되는 모든 파드에 Envoy를 사이드카 패턴으로 주입할지를 결정합니다.
이 옵션을 선택하게 되면 배포되는 모든 애플리케이션에 Envoy 프록시가 기본적으로 추가되어 배포됩니다.
프록시는 기본적으로 네임스페이스 단위로 배포됩니다.

VirtualService
Gateway가 수신한 트래픽을 서비스로 라우팅하는 컴포넌트이며 쿠버네티스의 Service 리소스가 트래픽의 목적지가 됩니다. 또한 라우팅 규칙에 따라서 원하는 서비스로 트래픽을 전달할 수 있습니다.
이름 및 속성 설정
⓵ 컴포넌트 리스트에서 Gateway 컴포넌트를 선택하고 드래그하여 디자이너 영역으로 드롭합니다.
디자이너 화면에 컴포넌트가 배치되고 최초 VirtualService에 대한 속성을 입력하는 화면이 나타나며 원하는 컴포넌트 이름 및 설명을 추가합니다.
VirtualService는 라우팅 규칙에 따라 트래픽을 라우팅하기 때문에 어떤 Gateway로부터 트래픽을 받을지 디자이너 화면에서 설정을 해야 합니다.

연결 설정

⓶ VirtualService는 라우팅 규칙에 따라 트래픽을 라우팅하기 때문에 어떤 Gateway로부터 트래픽을 받을지 디자이너 화면에서 설정을 해야 합니다.
VirtualService가 처리할 트래픽을 어떤 Gateway에서 받을지 각 컴포넌트간 연결을 설정합니다.
⓷ VirtualService의 필수적인 정보가 입력되지 않으면 'Required'라는 경고가 컴포넌트 상단에 나타납니다.
이 경우는 필요한 정보가 모두 입력되지 않은 상태이기 때문에 경고가 나타난 컴포넌트에 대한 속성을 올바르게 설정해야 합니다.
⓸ 디자이너 화면에서 해당 VirtualService에서 처리할 트래픽 수신용 Gateway와 연결하면 그림에서와 같이 연결된 Gateway 이름이 표시됩니다. 현재 설정중인 VirtualService는 설정된 Gateway로부터 트래픽을 수신한다는 의미입니다.
⓹ 마찬가지로 VirtualService도 트래픽 처리를 위해 Host를 지정할 수 있습니다.
*를 입력하여 모든 도메인에 대해 처리를 할수 있고, FQDN 방식의 도메인으로 설정할 수 있습니다. 또한 '+ADD'버튼을 선택하여 Host를 추가할 수 있습니다.
모든 데이터가 입력되었다면 이제 VirtualService가 트래픽을 보낼 대상(백엔드 서비스 또는 프론트엔드 서비스)을 추가해야 합니다.

Gateway와 VirtualService를 연결하고 정상적으로 모든 값을 입력한 상태이더라도 아직 VirtualService 컴포넌트 상단의 'Required' 경고는 트래픽을 보낼 대상 서비스가 아직 설정되지 않았기 때문에 사라지지 않습니다.
서비스 연결 및 추가 설정
⓺ 트래픽을 수신할 애플리케이션을 디자이너에 추가 후 속성을 설정합니다. 여기서는 Springboot 컴포넌트를 사용했습니다.
(Springboot 컴포넌트에 대한 설정값은 여기를 참고하세요.)
이후, VirtualService와 추가한 Springboot 컴포넌트를 디자이너 화면에서 연결합니다.
⓻ 연결 후, VirtualService 컴포넌트를 선택하여 속성창을 확인하면 이전에 보이지 않던 아래의 메뉴들이 나타납니다.

여기까지 데이터가 입력되면 기본 트래픽 라우팅은 완료되었으며 컴포넌트 상단에 표시되던 'Required' 경고도 사라지게 됩니다. 계속 경고창이 표시된 상태로 남아 있으면 경고가 표시된 컴포넌트의 속성값을 다시 검토하시기 바랍니다.
마지막으로 VirtualService가 전달하는 트래픽을 상세 제어할 수 있는 DestinationRule을 설정하는 절차만 남아있습니다.
DestinationRule
지금까지 트래픽의 흐름을 정의했다면, 어떻게 트래픽을 보낼 것인지를 설정해야 합니다. DestinationRule은 트래픽에 대한 속성 및 규칙을 설정합니다.
DestinationRule 컴포넌트를 통해 추가할 수 있는 규칙은 아래와 같이 7가지가 있습니다. 각 규칙에 대한 설명은 아래 표를 참고하세요.
| 이름 | 설명 |
|---|---|
| Round Robin | DestinationRule에 trafficPolicy를 따로 지정하지 않은 경우 기본값으로 Round Robin이 적용됩니다. (명시적으로 지정해도 됨) |
| Random | 정상적으로 동작중인 서비스(host)중 무작위로 선택해서 트래픽을 전달합니다. |
| Least Request | 정상적으로 동작중인 서비스 중, 현재 처리량이 가장 작은 서비스를 선택 후 트래픽을 전달합니다. |
| Passthrough | 로드 밸런싱을 수행하지 않고 호출자가 요청한 원래 IP주소로 트래픽을 라우팅합니다. |
| Circuit Breaker | 장애가 발생한 서비스를 전달 대상 서비스에서 제외하고 주기적으로 정상 여부를 체크 후, 정상 상태로 돌아오면 다시 트래픽을 전달합니다. |
| Rate Limiting | 설정값을 통해 Connection Pool을 조절하여 연결을 제어합니다. (동시 연결 수 및 타임아웃 등) |
| Stickey Sesstion | HTTP Cookie 값에 따라 항상 동일한 서비스와 연결되도록 합니다. Cookie에 저장되는 헤더 값은 코드 레벨에서 구현되어져야 합니다. |
속성 설정 및 대상 서비스 연결
⓵ 컴포넌트 리스트 화면에서 DestinationRule 컴포넌트를 선택 후 디자이너 화면으로 배치합니다.
⓶ 선택된 DestinationRule 컴포넌트에 대한 이름과 설명을 입력 후 '확인'을 선택합니다.
⓷ 디자이너 화면에 추가된 컴포넌트를 트래픽을 전달할 대상 서비스(VirtualService와 연결된 서비스)와 연결합니다.
연결 작업이 완료되면 DestinationRule은 트래픽 라우팅 대상 서비스와 연동되어 동작하게 됩니다.

상세 규칙 설정
DestinationRule은 7가지 항목에 대해 설정할 수 있습니다.
⓸ 컴포넌트 아이콘을 클릭 후 속성창을 표시합니다. 속성창에서 상세 규칙 항목 아이콘을 클릭합니다.
⓹ 아이콘을 클릭하면 설정할 수 있는 DestinationRule 규칙이 표시되고 원하는 규칙을 선택합니다.
⓺ 규칙을 선택하면 해당 규칙에 대한 템플릿이 자동 추가됩니다.

설정할 수 있는 규칙중 컴포넌트 속성창에서 다음 규칙은 중복으로 설정할 수 없습니다.
- Round Robin
- Random
- Least Request
- Passthrough