# k8s cronjob 수행으로 jobs -> pod 생성시 가끔 pod warning 이 발생한다.
# pod 내 container command(작업)는 정상적으로 수행되지만 아래와 같은 에러가 간혹 발생한다.
# 그런데 같은 클러스터에서 수행되는 다른 cronjob 은 에러가 발생하지 않는다.
# 참고로 kubernetes 버전은 1.15.5 이다.
# describe 로 pod Event 를 보면
kubectl describe pod ysoftman-pod-xxx(가칭)
... 생략 ...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 3m54s default-scheduler Successfully assigned ysoftman-xxx/ysoftman-pod-xxx to ysoftman-worker-1
Normal Pulling 3m51s kubelet,ysoftman-worker-1 Pulling image "ysoftman-test:test"
Normal Pulled 3m51s kubelet,ysoftman-worker-1 Successfully pulled image "ysoftman-test:test"
Normal Created 3m51s kubelet,ysoftman-worker-1 Created container ysoftman-pod
Normal Started 3m51s kubelet,ysoftman-worker-1 Started container ysoftman-pod
Normal SandboxChanged 3m50s kubelet,ysoftman-worker-1 Pod sandbox changed, it will be killed and re-created.
Warning FiledCreatePodSandBox 3m50s kubelet,ysoftman-worker-1 Failed created pod sandbox... rpc error: code = Unknown desc = failed to start sandbox container for pod "ysoftman-pod-xxx": Error response from daemon:
OCI runtime create failed: container_linux.go:367: starting container process caused process_linux.go:495: container init caused: Running hook #0:: error running hook: exit status 1,stdout: , stderr: time="xxx" level=fatal msg="no such file or directory": unknown
# 또는
OCI runtime create failed: container_linux.go:349: starting container process caused "process_linux.go:319: getting the final child's pid from pipe caused \"EOF\"": unknown
# 위와 같은 이슈가 moby(docker 에서 만든 컨테이너 open source)에
# https://github.com/moby/moby/issues/40835 로 등록되어 있고 아직 리졸브되지 않았다.
# sandbox는 gke(goole kubernetes engin)가 pod내에서 실행되는 컨테이너가 보안의 위협이 되지 않도록 k8s 가 생성해 관리하는 컨테이너라고 한다.
# 에러 메시지(getting the final child's pid from pipe caused \"EOF\"": unknown. )의 뜻을 보면
# OCI(Open Container Initiative)를 준수하는 runC(OCI 를 따르는 컨테이너 런타임)이 pod->container 생성시
# 어떤 이유로 pid 를 할당받지 못하는건데, moby 이슈에 제기된 원인을 보면 크게 다음과 같다.
# 1. cpu, memory 리소스 부족 -> 노드별로 cpu, mem 상태는 넉넉한것으로 보인다.
# 2. 커널 파라메터 max pid, namespace 수 늘리기 -> 요것도 아직 그리 부족해 보이진 않고, 커널 파라메터까지 수정하는 경우는 거의 없어야 할것 같다.
# 테스트1
# 1번을 보면 현재 ysoftman-pod 의 cpu, mem 사용량은 크지 않은것 같고,
# 혹시 잦은 pod 생성 에 따른 문제는 아니진 해서 테스트로 1분 간격으로 실행하는 크론잡을 돌려 봤다.
# 하루동안 돌려봤지만, interval 1분이라 빨리 재현될줄 알았는데 pod 내 sandbox 생성 에러가 없다.
# 테스트에 사용한 크론잡 manifesto https://github.com/ysoftman/test_code/blob/master/k8s/ysoftman-cronjob-test.yaml
# 테스트2
# pod -> container 도 잘 수행되지만, sandbox 생성시 사용자의 컨테이너를 찾을 수 없어 발생할 수 있을것 같다.
# ysoftman-pod 의 컨테이너 커맨드가 빨리 끝나서 sandbox 컨테이너 생성시 참고하는 ysoftman-pod 컨테이너가 없어
# no such file or directory 또는 다른 에러(pid EOF 로 찾을 수 없다등)이 발생하는 것 같아
# 다음과 같이 1초내로 빨리 종료되는 크론잡 컨테이너를 설정했다.
... 생략 ...
containers:
- name: ysoftman-cronjob-test
image: busybox
imagePullPolicy: Always
command:
- /bin/sh
- -c
- date; echo "wait for 0s"; i=1; while [ $i -le 1 ]; do echo $i; sleep 1; i=$((i+1)); done; echo "job completed\!"
resources:
# 위와 같이 설장하고 1분마다 크론잡이 실행되면, 100%는 아니지만 에러가 재현됐다.
# 실제 ysoftman-pod 는 사용자 업데이트를 가져오는 잡으로 대부분 업데이트 내용이 없어서 1~2초내로 바로 종료되는 컨테이너였다.
# 해결방법
# ysoftman-pod container 에 sleep 10초 주어 sandbox 생성시 사용자 컨테이너를 참조할 수 있는 시간을 주니 더이상 발생하지 않았다.
comments:
댓글 쓰기