레이블이 sleep인 게시물을 표시합니다. 모든 게시물 표시
레이블이 sleep인 게시물을 표시합니다. 모든 게시물 표시

k8s sandbox OCI runtime create failed 에러

# 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 생성 에러가 없다.

# 테스트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 생성시 사용자 컨테이너를 참조할 수 있는 시간을 주니 더이상 발생하지 않았다.

mac pmset 으로 전원 설정하기

# 맥 터미널에서 pmset 명령을 전원 관련 설정이 가능하다.
# -b 배터리 모드, -c 충전 모드, -a all
# 전원 관련 설정 현황 보기
pmset -g

# 스케쥴된 작업 보기
pmset -g sched

# 절전모드 3번(절전모드시 메모리내용 디스크에 모두 쓰기)
sudo pmset -a hibernatemode 3

# 화면 슬립모드 타이머 5분으로 설정
sudo pmset -a displaysleep 5

# 시스템 슬립모드 타이머 1분으로 설정
sudo pmset -a sleep 5

# 시스템 슬립모드 비활성화
sudo pmset -a sleep 0

# 화면만 슬립모드로 전환하기
pmset displaysleepnow

# 슬립모드로 전환하기
pmset sleepnow

# 슬립모드로 전환시 즉시 암호 적용하기
시스템 환경설정 -> 보안 및 개인정보 보호 -> 일반 -> 잠자기 또는 화면보호기 시작 -> 즉시 암호요구


# 화면 슬립모드는 alias 로 만들어 사용하면 좋다.
vi ~/.zshrc
alias sn='pmset displaysleepnow'

# 참고
https://en.wikipedia.org/wiki/Pmset

#####

맥북 덮개 sleep 모드 비활성화
# 맥북을 덮고 연결된 외부 모터니만 사용는 경우
# 맥북 덮개를 덮으면 자동 sleep 모드로 돼, 외부 모니터 화면이 안나온다.
# 그런데 전원을 연결하면 맥북을 덮은 상태에서도 외장 모니터를 사용할 수 있다.
# 항상 이렇게 전원을 연결해 충전하면서 사용해 왔다.

# 그런데 맥북을 100% 충전하면 배터리가 빵빵해지는등 수명에 좋지 않다.
# 이전 맥북도 항상 충전기를 연결해두고 사용해 배터리가 터질듯 부풀어 위험했다ㅠ

# 충전없이(배터리모드)에서 맥북 덮은 상태에서 외부 모니터를 사용위해선
# pmset 명령으로 sleep 모드를 비활성화하면 된다.
# 참고로 man pmset 에 설명된 sleep 0 은 효과 없고,
# 설명에 없는 disablesleep 셋팅을 사용해야 된다.
# -b 배터리 모드, -c 충전 모드, -a all
sudo pmset -a disablesleep 1

# sleep 모드 다시 활성화
sudo pmset -a disablesleep 0

# 전원 관리 상태 보기
# pmset -g