일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 스프링
- eof
- java
- ai
- restapi
- LangChain
- nodejs
- TCP
- Android
- Scanner
- 스프링부트
- 조건문
- Docker
- 프로그래머스
- mysql
- mongodb
- bufferdreader
- redis
- HTTP
- k8s
- Spring
- java11
- Apollo
- 백준알고리즘
- 서버
- 자바
- puppeteer
- MapReduce
- graphql
- Mongoose
- Today
- Total
자라나라 개발머리
[puppeteer/docker/k8s] 퍼펫티어 실행 에러 해결 본문
<실행 환경>
node:16-slim
puppeteer 13.5.0
k8s
에러 상황
내가 원했던 동작은 특정 페이지에서 스크롤을 내리는 동작이었다.
스크롤을 내리면 새로운 정보가 로딩되는 페이지인데, 특정 조건에 걸릴 때 까지 스크롤을 반복하는 동작을 구현했다.
로컬에선 잘 실행되는 코드가 k8s에 띄워서 실행하면 중간에 동작이 멈추고 무한 대기에 빠진다.
동작이 멈추는 시점은 동작할 때 마다 다른 시점에 발생한다.
로컬에서와 달리 페이지 동작 상태를 눈으로 확인할 수도 없으니, 현재 상태를 파악하기가 어려워 원인을 찾기도 어려웠다.
퍼펫티어가 문제인건지, 네트워크 상태가 문제인건지, 페이지가 문제인건지 무수한 경우의 수가 있으니 정말 갖가지 시도를 해본 것 같다.
에러 파악 과정
에러 원인 가정
짐작할 수 있는 에러 원인을 적은 후 이에 대해 테스트 해보았다.
1. 퍼펫티어 호환 문제(호환성 문제?)
2. 페이지 내 문제(의도치 않게 새 창이 떠서 스크롤이 불가능한 상황이거나 .. 등등)
3. 리소스 문제
에러 파악 시도
1. 퍼펫티어 호환 문제
가장 의심이 갔던 에러 원인이다.
기존에 node:16-alpine에서 glibc를 깔아서 동작이 되게끔 해결을 했었는데, 이 방법 때문에 퍼펫티어 호환 문제로 잘 동작이 안되는 걸까 싶었다.
에러 원인을 제거하기 위해서 node:16-alpine 이미지를 포기하고 node:16-slim 이미지를 사용했다.
하지만 해당 이미지를 사용해도 똑같이 무한 대기에 걸렸다. 퍼펫티어 호환의 문제는 아니었던 걸로!
2. 페이지 내 문제
페이지 내에 예상치 못한 상황이 생겨서 그런건가? 싶어서
waitForSelector를 활용해서 내가 원하는 태그가 뜰 때 까지 기다려봤다. 얘는 timeout 시간도 지정할 수 있다.
그래서 태그 종류와 timeout 시간을 이리저리 바꿔가며 테스트 해보았다.
그러다가 페이지 자체가 로딩이 안 되는건가? 싶어서 <html> 태그 자체를 넣고 동작을 시켜봤다.
await page.waitForSelector('html', { timeout: 30000 });
역시나 Timeout Error가 떴고, 페이지 로딩 자체가 안 됨을 파악했다.
3. 리소스 할당 문제
페이지 로딩이 안 되는 현상을 파악하고 나니, 네트워크 문제나, 리소스 할당 문제가 떠올랐다.
하지만 네트워크 문제라기엔 k8s에 올라가 있는 다른 컨테이너들이 정상 작동되고 있었기 때문에 리소스 할당 문제를 먼저 고려했다.
그래서 cpu, memory limit, request 값을 높였더니.....! 드디어..... 정상 작동한다!
에러 해결 방법
k8s yaml 파일 내 memory request 값을 높였다.
결국 에러 발생 원인은 memory limit과 request값이 퍼펫티어가 요구하는 수치보다 한참 낮아서 제대로 작동할 수 없었던 것이었다.
//example
apiVersion: v1
kind: Pod
spec:
containers:
resources:
limits:
cpu: //이 부분을 수정
memory: //이 부분을 수정
requests:
cpu: //이 부분을 수정
memory: //이 부분을 수정
나처럼 삽질 하시는 분이 없길 바라며 ,,,,,,,,,,,,,,,,,,,,,,,, 화이팅!
'etc.' 카테고리의 다른 글
[Redis] redis CRUD 명령어 모음 (0) | 2024.06.30 |
---|---|
[Redis] 분산 락(Distribution Lock) 개념, redlock 사용법 (0) | 2024.06.23 |
[puppeteer/docker] node:16-alpine 빌드 에러 (0) | 2024.03.04 |
[MySQL] MySQL UTF-8 깨짐 현상 해결법 (0) | 2023.05.29 |
Error launching Studio - Failed to load JVM DLL (0) | 2023.01.20 |