service mesh 마이크로서비스 아키텍처 개발부터 카나리 배포까지 전체 워크플로우 모범 사례 (하)¶
소개¶
이 장에서는 카나리 배포의 전체적인 상황을 소개하고, Guance을 활용하여 마이크로서비스의 메트릭, 트레이스, 로그를 관측합니다. Rancher에 대한 모든 작업은 k8s-solution-cluster 클러스터에서 수행하며, 별도로 반복 안내하지 않습니다.
카나리 배포¶
카나리 배포를 구현하기 위해 마이크로서비스를 배포할 Deployment에 app=reviews 레이블을 추가하여 마이크로서비스 이름을 구분합니다. 첫 번째 배포 버전에는 version=v1 레이블을, 두 번째 배포 버전에는 version=v2 레이블을 추가합니다. 이렇게 레이블을 기준으로 각 버전으로 유입되는 트래픽의 비율을 제어할 수 있습니다. 예를 들어 v2를 배포한 후 90%의 트래픽은 v1 버전으로, 10%의 트래픽은 v2 버전으로 보내고, 검증에 문제가 없으면 모든 트래픽을 v2 버전으로 전환한 후 v1 버전을 내립니다. 이렇게 전체 배포가 완료됩니다.
1단계: reviews 삭제¶
이전 편에서 Gitlab-CI 자동화 배포를 설명하기 위해 reviews의 세 가지 버전을 배포했습니다. 이번 작업 전에 세 가지 reviews 배포 버전을 삭제해야 합니다. 'Rancher'에 로그인하여 클러스터에서 '워크로드' -> 'Deployments'로 차례로 이동한 후 reviews-v1을 찾아 오른쪽에서 '삭제'를 선택합니다. 같은 방식으로 reviews-v2, reviews-v3도 삭제합니다.
2단계: reviews-v1 배포¶
'gitlab'에 로그인하여 bookinfo-views 프로젝트를 찾고, .gitlab-ci.yml 파일에서 APP_VERSION 값을 "v1"으로 수정한 후 커밋합니다. 'Rancher'에 로그인하여 클러스터에서 '워크로드' -> 'Deployments'로 차례로 이동하면 reviews-v1이 배포 완료된 것을 확인할 수 있습니다.
3단계: DestinationRule 생성¶
대상 주소를 정의하고, reviews Service의 서비스 디스커버리 시 subsets를 v1과 v2로 나누기 위해 다음 내용을 destination-rule-reviews.yaml 파일에 저장합니다. kubectl을 사용하여 이 리소스를 배포합니다.
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: reviews
namespace: prod
spec:
host: reviews
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
4단계: VirtualService 생성¶
v2를 배포하기 전에 먼저 모든 트래픽을 v1으로 전환합니다. 다음 내용을 virtual-service-reviews.yaml 파일에 저장합니다.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
namespace: prod
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
http://8.136.193.105:32156/productpage에 접속합니다.
5단계: reviews-v2 배포¶
'gitlab'에 로그인하여 bookinfo-views 프로젝트를 찾고, .gitlab-ci.yml 파일에서 APP_VERSION 값을 "v2"로 수정한 후 커밋합니다. 'Rancher'에 로그인하여 클러스터에서 '워크로드' -> 'Deployments'로 차례로 이동하면 reviews-v2가 배포 완료된 것을 확인할 수 있습니다. v2를 배포했지만 http://8.136.193.105:32156/productpage에 접속하면 reviews 마이크로서비스는 V1 버전으로만 요청을 보냅니다.
6단계: 10% 트래픽을 reviews-v2로 전환¶
virtual-service-reviews.yaml 파일을 다음과 같이 수정합니다.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
namespace: prod
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v1
weight: 90
- destination:
host: reviews
subset: v2
weight: 10
다시 배포합니다.
http://8.136.193.105:32156/productpage에 여러 번 접속하면 reviews 마이크로서비스의 v1 버전과 v2 버전이 각각 90%와 10%의 트래픽을 수신합니다.
7단계: reviews-v2 관측¶
1. APM¶
'Guance'에 로그인 -> 'APM' -> 오른쪽 상단의 토폴로지 차트. 환경 및 버전 구분 스위치를 켜면 reviews에 두 가지 버전이 있으며, reviews:test:v2가 ratings 서비스를 호출하는 것을 확인할 수 있습니다.
상단의 '트레이스'를 클릭하고, 리소스별 검색 기능을 사용하여 reviews.prod를 선택한 후 reviews 버전이 v2인 트레이스를 찾아 클릭합니다.
상세 페이지에서 플레임 그래프를 관측합니다. 트레이스 호출에 오류나 타임아웃 등의 문제가 있으면 명확하게 확인할 수 있습니다. 여기서 project, version, env 태그는 gitlab의 bookinfo-views 프로젝트에 있는 deployment.yaml 파일에 정의된 annotations입니다.
Span 목록에서 각 Span의 실행 시간을 확인합니다.
서비스 호출 관계에서 명확한 토폴로지 맵을 확인할 수 있습니다.
2 Istio Mesh 모니터링 대시보드¶
'Guance'에 로그인하여 '시나리오' -> '대시보드 생성'을 클릭하고 Istio Mesh 모니터링 대시보드를 선택합니다. 이 대시보드에서 reviews-v1과 reviews-v2의 호출 비율이 기본적으로 9:1인 것을 확인할 수 있습니다.
8단계: 배포 완료¶
reviews-v2 버전의 마이크로서비스가 정상적으로 검증된 후 모든 트래픽을 v2 버전으로 전환합니다. virtual-service-reviews.yaml 파일을 다음과 같이 수정합니다.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: reviews
namespace: prod
spec:
hosts:
- reviews
http:
- route:
- destination:
host: reviews
subset: v2
다시 배포합니다.
'참고' reviews-v2 버전에 문제가 있는 경우, 'Guance'에 로그인하여 이 장 마지막 절의 트레이스 타임아웃 분석을 참고하여 문제를 분석하고, 6단계를 참고하여 모든 트래픽을 reviews-v1으로 다시 전환한 후 문제가 수정되면 다시 배포합니다.
메트릭¶
Bookinfo를 배포할 때 사용자 정의 구성을 사용하여 Pod를 활성화할 때 annotations 구성에 measurement_name = "istio_prom"을 추가했습니다. 이것이 바로 메트릭을 istio_prom 메저먼트로 수집하는 설정입니다. 'Guance'에 로그인하여 '메트릭'에서 istio_prom 메저먼트를 확인합니다.
이러한 메트릭을 활용하여 프로젝트 필요에 따라 위에서 소개한 Istio Mesh 모니터링 대시보드와 유사한 대시보드를 생성할 수 있습니다.
트레이스¶
RUM¶
'Guance'에 로그인하여 'RUM'으로 이동한 후 devops-bookinfo 애플리케이션을 찾아 클릭합니다.
UV, PV, 세션 수, 방문한 페이지 등의 정보를 확인합니다.
'참고' 프론트엔드와 백엔드가 분리된 프로젝트의 경우 탐색기에서 백엔드 트레이스 및 로그와 연동할 수 있습니다. 자세한 작업 단계는 Kubernetes 애플리케이션의 RUM-APM-LOG 연동 분석을 참고하세요.
APM¶
'Guance'에 로그인하여 'APM'으로 이동합니다. APM을 통해 트레이스 데이터를 확인합니다.
로그¶
stdout¶
DataKit 배포 시 구성에 따라 기본적으로 /dev/stdout으로 출력되는 로그를 수집합니다. 'Guance'에 로그인하여 '로그'로 이동한 후 로그 정보를 확인합니다.
'참고' 더 많은 로그 수집 방식은 다음을 참고하세요.
Kubernetes 클러스터에서 로그 수집의 여러 가지 방법
트레이스 타임아웃 분석¶
Bookinfo 프로젝트에는 타임아웃을 시연하는 예제가 있습니다. jason 사용자로 로그인하면 ratings 서비스가 타임아웃됩니다. virtual-service-ratings-test-delay.yaml 파일을 다음과 같이 생성합니다.
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: ratings
namespace: prod
spec:
hosts:
- ratings
http:
- match:
- headers:
end-user:
exact: jason
fault:
delay:
percentage:
value: 100.0
fixedDelay: 7s
route:
- destination:
host: ratings
subset: v1
- route:
- destination:
host: ratings
subset: v1
리소스를 생성합니다.
jason으로 로그인합니다. 비밀번호는 비어 있습니다.
http://8.136.193.105:32156/productpage에 접속하면 ratings 서비스에 연결할 수 없습니다.
'Guance'에 로그인하여 'APM'으로 이동합니다. 타임아웃된 트레이스를 클릭합니다.
플레임 그래프를 관측하여 타임아웃 호출을 찾습니다.





























