문제

어느날 갑자기 api server가 죽어서 엄청 느려진 상태가 됬다.

파드를 내렸다가 올리면 정상적으로 작동하다 다시 느려지는 상태가 반복.

파드를 재시작할경우 정상적으로 작동하는것으로 보아 뭔가 쌓여서 문제가 되는것 같아

우선 네트워크부터 봤다.

처음시작할경우 netstat -antp로 보면 Est + Time_wait된 포트가 close_wait된 포트보다 많았으나

시간이 지날수록 close_wait된 포트가 많아지면서 서버가 응답이 느려지기 시작했다.

결론

Resttemplate으로 api서버에 요청을하는 서버에서 connection이 종료되지 않아서

CLOSE_WAIT이 쌓여 결국 서버가 멈추는 문제.

 

 

예측

  • Resttemplate이 작업을 처리하느라 close 요청을 못받는줄암.
  • 그래서 Resttemplate에서 응답을 받고 강제로 connection 을 종료 시켜주기로함.
    • Resttemplate는 직접 connection을 닫지않아도 자동으로 닫아준다고 했는데 안닫아지는건 뭔가 외부적인 이슈가 있을거라 판단
  • https://www.popit.kr/마이크로-서비스와-time_wait-문제/
    • 위 링크를 참조하여 EntityUtils로 닫아보려고 했지만 타입이 맞지 않아 에러로 닫아짐

해결

  • api서버에서 CLOSE 요청을 내려주질 않아서 Connection 을 종료할수 가 없는 상황.
  • 그래서 Resttemplate의 timeout 설정을 줘서 일정시간 없으면 요청을 종료하기로함.
  • 정상적으로 timeout 시간이 지나면 timeout으로 종료됨.

문제 2.

  • timeout줘서 요청을 종료하기로 했으나 api 서버에서 응답을 늦게내려줘서 모든 요청이 타임아웃 걸리는 상황.
  • api 서버를 확인해보니 포트 4만6천개정도가 사용중인 상태.

해결

  • 커넥션 새로 열때마다 새로운 포트를 생성하므로 커넥션풀을 만들어 사용하기로함.
  • 이미 커넥션풀이 있었으나 특정 요청은 커넥션풀이 적용되지 않았었음.
  • 그래서 적용되니 요청이 정상적으로 작동.

 

expected webhook response of admission.k8s.io/v1, Kind=AdmissionReview, got /, Kind=

 

  • 에러 내용

expected webhook response of admission.k8s.io/v1, Kind=AdmissionReview, got /, Kind=

 

  • 에러 원인

admission 의 webhook 응답이 기대한것과 다름.

나는 v1을 요청했으나 응답이 v1으로 오지 않았다는 것.

 

  • 해결

v1beta1은 따로 응답에 kind나 apiversion 을 기술하지 않아도 됬었는데

v1부터는 kind와 apiversion을 응답에 같이 넣어주면 된다.

 

	requestedAdmissionReview := v1.AdmissionReview{}
	responseAdmissionReview := v1.AdmissionReview{}

	if _, _, err := deserializer.Decode(body, nil, &requestedAdmissionReview); err != nil {
		level.Warn(a.logger).Log("msg", "Unable to deserialize request", "err", err)
		responseAdmissionReview.Response = toAdmissionResponseFailure("Unable to deserialize request", []error{err})
	} else {
		responseAdmissionReview.Response = admit(requestedAdmissionReview)
	}

	responseAdmissionReview.Response.UID = requestedAdmissionReview.Request.UID
	responseAdmissionReview.APIVersion = requestedAdmissionReview.APIVersion
	responseAdmissionReview.Kind = requestedAdmissionReview.Kind

	respBytes, err := json.Marshal(responseAdmissionReview)
  • 소스 출처 prometheus-operator github

 

 

동일한 객체의 httpclient를 사용할때

inputstream 을 close 안시키고 새로운 inputstream을 생성하려고하면 나는 에러.

 

list에 inputstream을 담아서 sequenceinputstream으로 list에서 뽑아서 사용하려고 했으나 이런 에러가남

 

 

해결방법

 

그냥 intpustream을 byte array로 변경시켜서 list에 담고

FileOutputStream output = FileUtils.openOutputStream(new FIle(xxxxxxxxx)); 로 outputstream 생성후

list foreach로 돌면서 write로 직접 byte array를 집어넣어줌.

output.close()로 stream 닫아주고

IOUtils.closeQuietly(output); closeable로 형변환해서 닫아준다.

 

 

 

 

jpa 인강을 보던중 똑같이 따라했건만 h2 db의 table이 초기화가 되지 않는 현상을 발견

버전을 보니 내 버전은 1.4.200이고 강사님껀 더 낮은버전이였다.

 

그래서 검색을 해봤다.

 

https://stackoverflow.com/questions/59364212/integrationtest-isolation-fails-in-springboot-2-2-2-release-error-dopping-table

 

IntegrationTest isolation fails in springboot 2.2.2.RELEASE (Error dopping tables after each SpringBootTest)

Our app is working in 2.0.4 release. After upgrade to 2.2.2.RELEASE we see integration tests failing. I suspect that there is some misconfiguration, and each integration test simply does not clean ...

stackoverflow.com

 

보니까 이미 깃헙에 패치가 다 되어있었다

근데 1.4.200버전엔 적용이 안되있어서 스택오버플로우에 나오는 깃헙주소로 들어가

따로 하이버네이트의 dialect 를 상속받은 커스텀 dialect 클래스를 만들어 프로퍼티에 추가시켜주니

잘작동하는걸 확인했다.

 

참고로 위의 스택오버플로우 주소에 있는 커스텀 dialect를 그대로 가져다쓰면 안되고 (전 안됬음)

깃헙에 수정된 소스를 보고 맞춰서 수정해줘야됨

퍼시스턴스.xml 파일에

javax.persistence.jdbc.url에 tcp를 안넣을경우 다중접속이 불가능함

 

1.webfulx랑 같이 키면 에러남

 

2.spring web 버전이 2.2.4일때 admin server랑 client버전은 2.0.1쓰면안되고 2.2.2써야됨

centos 7 버전 사용중인데 저런 에러가 떳을경우

 

sysctl net.ipv4.ip_forward

값이 0으로 되어있다면

sysctl -w net.ipv4.ip_forward=1

로 변경후 리붓

 

기존의 redis 타임아웃생기던 문제까지 해결됨

centos6.10 에서 docker로 redis만 설치하면 EXITED 127에러 뜨면서 설치가 안되는 증상

logs로 확인해보니 kernel too old 

그래서 centos 7버전대로 업데이트하니 제대로 설치되면서 잘켜짐 

+ Recent posts