본문 바로가기

카테고리 없음

[Google Cloud] Google Study Jam : Managing Deployments Using Kubernetes Engine (2)

728x90
반응형
본 포스트는 2024년 Google Study Jam을 공부하면서 개인적으로 내용을 정리한 포스트 입니다.

 

Region 세팅

gcloud config set compute/zone "us-east4-b"
export ZONE=$(gcloud config get compute/zone)

gcloud config set compute/region "us-east4"
export REGION=$(gcloud config get compute/region)

 

 

Debugging Apps on Google Kubernetes Engine - Task 1. Infrastructure setup

Project ID 환경변수를 등록

export PROJECT_ID=Project ID

cluster를 확인한다.

gcloud container clusters list

 

클러스터 상태가 PROVISIONING으로 표시

  • RUNNING이 될 때까지 위의 명령을 다시 실행
  • central 클러스터 생성 확인

 

Navigation menu > Kubernetes Engine > Clusters에서 클러스터를 모니터링할 수 있다.

클러스터가 RUNNING이면 명령어를 입력해 클러스터의 자격 증명을 가져온다.

gcloud container clusters get-credentials central --zone $ZONE

 

만들어진 노드들을 확인한다.

kubectl get nodes

 

 

 

Debugging Apps on Google Kubernetes Engine - Task 2. Deploy application

repo를 클론하고 디렉토리를 변경

git clone https://github.com/xiangshen-dk/microservices-demo.git

cd microservices-demo

 

kubectl을 사용해 클러스터와 파드를 생성

kubectl apply -f release/kubernetes-manifests.yaml

kubectl get pods

 

애플리케이션의 external IP를 얻은 다음 테스트 한다.

export EXTERNAL_IP=$(kubectl get service frontend-external | awk 'BEGIN { cnt=0; } { cnt+=1; if (cnt > 1) print $4; }')

curl -o /dev/null -s -w "%{http_code}\n"  http://$EXTERNAL_IP

 

Kubernetes Engine > Workloads 페이지에서 파드들을 확인할 수 있다.

 

Gateways, Services & Ingress를 클릭해서 정상인지 확인

 

 

Debugging Apps on Google Kubernetes Engine - Task 3. Open the application

frontend-external의 엔드포인트를 클릭해서 제대로 배포되었는지 확인

 

Debugging Apps on Google Kubernetes Engine - Task 4. Create a logs-based metric

 

 

로그 기반 측정항목 개요  |  Cloud Logging  |  Google Cloud

이 페이지는 Cloud Translation API를 통해 번역되었습니다. 의견 보내기 로그 기반 측정항목 개요 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 페이지에서

cloud.google.com

 

Navigation menu > Logging > Log Explorer에서 다음 쿼리를 입력한다.

resource.type="k8s_container"
severity=ERROR
labels."k8s-pod/app": "recommendationservice"

Create Metric을 눌러 metric 을 생성한다.

  • name : Error_Rate_SLI

 

 

Debugging Apps on Google Kubernetes Engine - Task 5. Create an alerting policy

Navigation menu > Monitoring > Alerting > Create Policy 클릭

 

Select a metric 드롭다운 메뉴에서 Active를 체크 해제

 

filter by resource and metric name에서 Error_Rate를 입력

 

Kubernetes Container > Logs-Based Metric에서 logging/user/Error_Rate_SLI를 선택하고 Apply 클릭

 

Rolling windows function를 Rate로 세팅하고 Threshold value를 0.5로 한다.

Use notification channel을 비활성화 한다.

alert policy 이름을 Error Rate SLINext을 클릭한다.

알림을 검토하고 Create Policy를 클릭한다.

 

 

Navigation menu > Kubernetes Engine > Gateways,Services & Ingress 에서 loadgenerator-external 서비스에 Endpoint 링크를 클릭한다.

나오는 페이지에서 시뮬레이션을 진행한다.

  • Number of users to simulate : 300
  • Hatch rate : 30
  • Host : <Endpoint URL>

 

Start swarming 버튼을 클릭한다.

 

Failures 탭을 클릭하면 실패가 발생하기 시작하는 것을 볼 수 있다.

 

Navigation menu > Monitoring > Alerting에서 logging/user/Error_Rate_SLI와 관련된 incident를 볼 수 있다.

VIEW LOGS 링크를 클릭해서 Pod의 Error Log를 볼 수 있다.

 

쿼리에 severity=ERROR를 추가하면 서비스 Pods에 대한 모든 오류를 얻을 수 있다.

오류메시지를 클릭하고 Add field to summary line을 클릭하면 Error 메시지 요약이 summary field에 추가된다.

 

RecommendationService 서비스에 실제로 많은 오류가 존재하는 것을 알 수 있다.

 

이를 해결하기 위해 Navigation menu > Monitoring > Dashboards > GKE > Workloads > productcatalogservice를 보면 서비스가 지속적으로 충돌하고 재시작되는 것을 볼 수 있다.

컨테이너 로그를 접근해서 에러 요소를 찾는다.

 

접근방법1. LOGS 탭

 

접근방법2. Container logs 클릭

 

Cloud Shell에 다음 커맨드를 입력  

grep -nri 'successfully parsed product catalog json' src

 

Open Editor를 열고 "microservices-demo/src/productcatalogservice/server.go"에서 237 라인의 readCatalogFile를 보면 bool 변수가 reloadCatalog가 참인 경우 서비스가 호출될 때 마다 제품 카탈로그를 새로고침을 하는데 불필요해 보인다.

코드에서 reloadCatalog 변수를 검색하면 환경 변수 ENABLE_RELOAD에 의해 제어되고 상태에 대한 로그 메시지가 작성되는 것을 볼 수 있습니다.

 

쿼리에 다음을 추가하고 log를 확인

jsonPayload.message:"catalog reloading"

resource.type="k8s_container"
resource.labels.location="ZONE"
resource.labels.cluster_name="central"
resource.labels.namespace_name="default"
labels.k8s-pod/app="productcatalogservice"
jsonPayload.message:"catalog reloading"

 

이 시점에서 frontend 오류는 모든 요청에 대해 카탈로그를 로드하는 오버헤드로 인해 발생했다고 확신할 수 있다.

부하를 늘렸을 때 오버헤드로 인해 서비스가 실패하여 오류가 발생했다.

 

 

Debugging Apps on Google Kubernetes Engine - Task 6. Fix the issue and verify the result

코드와 로그에 표시된 내용을 기반으로 카탈로그 새로고침을 비활성화하여 문제를 해결할 수 있다.

ENABLE_RELOAD 환경 변수를 제거한다.

 

터미널을 열고 다음 커맨드를 입력한다.

grep -A1 -ni ENABLE_RELOAD release/kubernetes-manifests.yaml

다음 명령을 입력해서 ENABLE_RELOAD 관련 줄을 삭제한다.

sed -i -e '373,374d' release/kubernetes-manifests.yaml

 

yaml 파일을 apply 한다.

kubectl apply -f release/kubernetes-manifests.yaml

productcatalogservice만 구성된 것을 알 수 있다. 

Navigation menu > Kubernetes Engine > Workloads > productcatalogservice 페이지에서 충돌이 나는지 확인하고

Container logs 링크를 클릭해서 로그를 확인한다.

load generator로 가서 Reset Stats 버튼을 누르면 FAILURES 0%인것을 확인 할 수 있다.

728x90
반응형