클라우드 네이티브로의 전환이 확산되면서 애플리케이션을 상호 독립적인 최소 구성 요소로 쪼개는 마이크로서비스(microservices) 아키텍쳐가 각광받고 있는데요.
MSA는 애플리케이션의 확장이 쉽고 새로운 기능의 출시 기간을 단축시킬 수 있다는 장점이 있지만,
반면에 애플리케이션이 커지고 동일한 서비스의 여러 인스턴스가 동시에 실행되면 MSA간 통신이 복잡해 진다는 단점이 있습니다.
서비스 메쉬(Service Mesh)는 이러한 MSA의 트래픽 문제를 보완하기 위해 탄생한 기술로,
서비스 간의 네트워크 트래픽 관리에 초점을 맞춘 네트워킹 모델입니다.
서로 다른 애플리케이션이 얼마나 원활하게 상호작용하는지를 기록함으로써 커뮤니케이션을 최적화하고 애플리케이션 확장에 따른 다운 타임을 방지할 수 있습니다.
서비스 메쉬의 탄생 배경과 기능, 그리고 현재 오픈소스로 배포되어 있는 서비스 메쉬 솔루션에 대해 소개합니다.
Step1. Cloud Native Trail Map
Step2. Service Proxy, Discover, & Mesh
Step3. Service Mesh 솔루션
Step4. Service Mesh 구현화면 - Istio / linkerd
Step5. Multi-cluster (linkerd)
9. Service Mesh
9
• 일반적인 서비스들이 제공해야하는 서비스 검색,로드 밸런싱,
장애 복구, 메트릭 및 모니터링을 서비스 코드의 변경없이 유기
적으로 생성/결합하는 서비스 필요
• 추가적으로 속도제한 / 액세스제어 / 종단인증등의 연계된 서비
스를 관리/제어하는 기능이 필요
전 세계적으로 가장 큰 마이크로 서비스 응용 프로그램 중 하나를 작업 한 결과, 마이크로 서비
스는 확장이나 유연성, 보안 또는 신뢰성이 마법같이 이루어지는 것이 아니라는 것입니다.
실제, 모놀리식 제품보다 작동하기가 훨씬 어렵습니다.
구성 관리, 로그 처리, strace, tcpdump 등 우리가 익숙하고 익숙한 도구는 마이크로 서비스
에 적용 할 때 적용 불가능한 도구입니다.
한 번의 요청으로 수 백 개의 인스턴스가 있는 수백 개의 서비스에 액세스 할 수 있는 세상에서
tcpdump를 어디에서 실행할 수 있습니까? 어떤 로그를 읽습니까? 느린 경우 어떻게 그 이유
를 알아낼 수 있습니까?
이것이 새로운 기능인 Service Mesh 를 탄생시킨 이유입니다.
정의
• 애플리케이션을 독립적으로 배포가능한 환경으로 변경
• 가볍고, 다른 언어일수 있고, 다양한 팀에서 관리되는 경향
• 서비스 수가 증가하고, 관리가 어려워짐
• 더 이상 서비스가 단순화 되지 않음
• 보안 /네트워크 트래픽 제어/서비스 모니터에 대한 요건 증가
11. Service Mesh 구현기능
핵심 구현 기능
연결
서비스가 서로를 검색하고 대화
지능형 라우팅을 통해 서비스 / 엔드 포인트 간의 트래픽 및 API 호출 흐름을 제어
블루 / 그린, 카나리아 또는 롤링 업그레이드 등과 같은 배포 전략 구현 가능
“분산 마이크로 서비스의 전체 네트워크 동작에
대한 운영 제어 및 관찰 가능성을 제공"
보안
서비스 간의 보안 통신
통신을 허용하거나 거부하는 정책 수행 가능
모니터
분산 된 마이크로 서비스 시스템을 모니터
모니터링 및 추적 도구와 즉시 통합되어 서비스, 트래픽 흐름, API 지연 시간 및
추적 간의 종속성을 검색하고 시각화 함
정책 적용
서비스 간의 상호작용에 조직 정책/액세스 정책을 정의하고, 리소스의 분산을
관리함
정책변경을 매시를 통해서 구현함
필요성
제공기능
실현내용
• Service Discovery
• Load Balancing
• Dynamic Request Routing
• Circuit Breaking
• Retry and Timeout
• TLS
• Distributed Tracing
• metrics 수집
마이크로 서비스 확산 확산/배포 시
• 확장을 위한 핵심
• 서비스 통신을
안전하고 안정적으로
만들어야 하는 요청
제공기능
• 라우팅 규칙 추적
• 트래픽 경로 지시
• 패키지 경로 지시
• 가속화 및 수신 보장
연결
보안
모니터
정책
One Team 방식의 효율적 대응체계
• 개발자들이 서비스를 연결하는 대신 비즈니스 가치를 추가하는 일에
집중가능 .
• 분산된 요청 추적은 서비스와 함께 가시적인 인프라 계층을
형성하므로 문제를 손쉽게 인식하고 진단
• Service Mesh 는 장애가 발생한 서비스로부터 요청을 재 라우팅할
수 있기 때문에 다운타임 발생 시 애플리케이션 복구 능력이 향상
11
14. Service Mesh
Istio | 내부 Architecture Istio | 상세 설명
Istio
Lyft에서 처음 출시 한 Kubernetes 네이티브 솔루션이며 IBM, 구
글과 Lyft 후원인 오픈 플랫폼
•트래픽 관리 : 지능형 트래픽 라우팅 규칙, 흐름 제어 및 회로 차
단기, 시간 초과 및 재시도와 같은 서비스 수준 속성 관리. 이를 통
해 A / B 테스트, 카나리아 출시, 백분율 기반 트래픽 분할로 단계
적 출시를 쉽게 설정할 수있었습니다.
•보안 : 서비스 간의 안전한 통신 채널을 제공하고 인증, 권한 부
여 및 암호화를 대규모로 관리합니다.
•관찰 가능성 : 강력한 추적, 모니터링 및 로깅 기능은 깊은 통찰
력과 가시성을 제공합니다. 효율적인 문제 감지 및 해결에 도움이
됩니다. Istio에는 마이크로 서비스 모니터링을 지원하는 추가 인
프라 서비스도 있습니다.
Envoy 프록시는 plane끼리 상호 작용하는 유일한 Istio 구성 요소
Lyft가 C ++ 언어로 작성한 고성능 프록시로, 서비스 메시의 모든
서비스에 대한 모든 인바운드 및 아웃 바운드 트래픽을 중재
• Dynamic service discovery
• Load balancing
• TLS termination
• HTTP/2 and gRPC proxies
• Circuit breakers
• Health checks
• Staged rollouts with percentage-basedtraffic split
• Fault injection
• Rich metrics
• Istiod는 서비스 검색, 구성 및 인증서 관리를 제공
1. input yaml detected by galley
2. configuration converted to Istio format
3. Istio format passed to pilot
4. pilot convert it to envoy configuration
• Pilot – 사이드카 프록시, 트래픽 관리 기능 및 복원
• citadel - 서비스 및 최종 사용자 인증을 지원
• Galley - Istio 구성 유효성 검사, 수집, 처리 및 배포 구성 요소
• Kiali - Istio Dashboard
• Jaeger - tracing
• Prometheus + Grafana - metrics
• Entity - Virtual Service / Destination Rule
Gateway
• Canary Releases / Circuit Breakers
• 데이터 플레인은 사이드카 인 프록시 (엔보이)로 구성.
이러한 프록시는 마이크로 서비스 간의 모든 네트워크 통신을 중재 및
제어하고 모든 메시 트래픽에 대한 원격 분석을 수집.
• 컨트롤 플레인은 트래픽을 라우팅하도록 프록시를 구성/관리
15. Service Mesh
linkerd | 내부 Architecture linkerd | 상세 설명
linkerd
Buoyant의 Kubernetes 용으로 설계된 오픈 소스 경량 서비스 메시
Linkerd는 쿠버네티스용 Service Mesh이며, 코드를 변경할 필요없
이 런타임 디버깅, 관찰 가능성, 안정성 및 보안을 제공하여 서비스
를 보다 쉽고 안전하게 실행할 수 있음. (proxy는 rust로 작성)
UI, 데이터 플레인 및 컨트롤 플레인의 세 가지 구성 요소
Service mesh용으로 만들어진 보안이 강화된 초경량 proxy
• HTTP, HTTP / 2 및 임의 TCP 프로토콜을 위한 쉽고, 간단한
proxy
• HTTP 및 TCP 트래픽에 대한 자동 Prometheus 메트릭 전달
• 쉽고, 간단한 WebSocket 프록시.
• 대기 시간을 인식하는 자동 레이어 7로드 밸런싱.
• HTTP가 아닌 트래픽을 위한 layer-4 자동 부하 분산.
• 자동 TLS.
• On-demand 진단 TAP API.
• 데이터 플레인의 각 프록시 는 이 구성 요소를 사용하여 요청을
보낼 위치를 조회합니다. 경로 별 메트릭, 재시도 및 timeout등
을 위한 서비스 프로파일로 구성
• 이 구성 요소는 프록시에서 CSR 을 수락 하고 올바른 ID로 서명
된 인증서를 반환 하는 인증 기관 을 제공합니다 . Linkerd 프록
시 간의 연결에 사용되어 mTLS를 구현합니다.
• 인젝터는 포드가 생성 될 때마다 웹훅 요청을 수신 하는 승인 컨
트롤러 입니다.
• 새 서비스 프로필 을 저장하기 전에 유효성을 검사 하는 승인 컨
트롤러 .
• CLI 및 대시 보드에서 요청을 수신하여 요청과 응답을 실시간으
로 확인하여 애플리케이션에서 관찰 가능성을 제공
16. Service Mesh 솔루션비교
✓ Rate limiting - 초당 request thresholds를 구성하고, 예측 불가능한 트래픽이나 공격에 대한 방어
✓ Circuit Breaking - Connection Max & Pending 수에 따른 circuit break / Load balancing pool의 인스턴스의 상태에 기반하는 circuit break
42. Service Mesh
spec:
routes:
- name: GET /api/annotations
condition:
method: GET
pathRegex: /api/annotations
isRetryable: true ### ADD THIS LINE ###
Retry
spec:
routes:
- condition:
method: HEAD
pathRegex: /authors/[^/]*.json
name: HEAD /authors/{id}.json
timeout: 300ms
Timeout
linkerd구성
43. Service Mesh
kubectl -n emojivoto set env --all deploy OC_AGENT_HOST=collector.linkerd-jaeger:55678
linkerd구성
44.
45. Service Mesh
Linkerd mutlti-cluster | 내부 Architecture Multi-cluster | 상세 설명
Multi-cluster
• 통합 도메인의 신뢰성 - 클러스터 경계간의 통신
• 장애 도메인 분리 – 장애시 격리필요
• 이기종 네트워크 지원 - clouds/VPC/on-premises
datacenter간의 네트워크 통신지원
• 통합된 클러스터 간 통신 – 클러스터간 통신과 같은
observability, reliability, and security features가 요구
됨
• 클러스터간에 서비스 정보를 "미러링"하여 작동
• 서비스 미러 와 게이트웨이 라는 두 가지 구성 요소로 구현
1. 공유 신뢰 앵커를 사용하여 두 개의 클러스터에 Linkerd 를 설치
2. 클러스터를 준비
3. 클러스터를 연결
4. 데모를 설치
5. 가시성을 제어하려면 데모 서비스를 export
6. 클러스터의 보안을 확인
7. 소스 클러스터 ( west) 의 Pod 에서 대상 클러스터 ( east)로 트
래픽 분할
• Requirement I: Support Hierarchical Networks
• Requirement II: Maintain Independent State
• Requirement III: Have an Independent Control
Plane
• linkerd --context=east multicluster link --cluster-
name east | kubectl --context=west apply -f -