본 포스트는 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 SLI 후 Next을 클릭한다.
알림을 검토하고 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%인것을 확인 할 수 있다.