Kubernetes環境でConcourseを稼働させていたら、 resource temporarily unavailable
のエラーでtaskを実行できなくなった。
{"timestamp":"xxx","level":"error","source":"guardian","message":"guardian.api.garden-server.run.failed","data":{"error":"runc exec: exit status 1: exec failed: container_linux.go:380: starting container process caused: process_linux.go:99: starting setns process caused: fork/exec /proc/self/exe: resource temporarily unavailable","handle":"xxx","session":"xxx"}}
状態と問題
Concourse Worker Podのプロセス状態を確認する。 [garden-init] <defunct>
のゾンビプロセスが増えていっていることが分かる。
# ps -ef UID PID PPID C STIME TTY TIME CMD root 1 0 1 07:55 ? 00:00:00 /opt/bitnami/concourse/bin/concourse worker root 19 1 3 07:55 ? 00:00:01 gdn server --bind-ip 127.0.0.1 --bind-port 7777 --depot /bitnami/concour root 143 0 0 07:55 pts/0 00:00:00 bash 4294967+ 182 1 0 07:55 ? 00:00:00 /tmp/garden-init 4294967+ 199 1 0 07:55 ? 00:00:00 [garden-init] <defunct> 4294967+ 215 1 0 07:55 ? 00:00:00 [garden-init] <defunct> root 240 1 0 07:55 ? 00:00:00 /tmp/garden-init 4294967+ 246 1 0 07:55 ? 00:00:00 /tmp/garden-init root 252 19 0 07:55 ? 00:00:00 /var/gdn/assets/linux/bin/runc --root /run/runc events a473be11-c3ec-480 root 266 19 0 07:55 ? 00:00:00 /var/gdn/assets/linux/bin/runc --root /run/runc events 49c8a50e-438b-465 4294967+ 331 1 0 07:55 ? 00:00:00 /tmp/garden-init 4294967+ 368 1 0 07:55 ? 00:00:00 [garden-init] <defunct> root 537 19 0 07:55 ? 00:00:00 /var/gdn/assets/linux/bin/runc --root /run/runc events fe3e1a65-c7f6-4c6 root 639 19 0 07:55 ? 00:00:00 /var/gdn/assets/linux/bin/runc --root /run/runc events bc649b86-2548-478 4294967+ 824 1 0 07:55 ? 00:00:00 [garden-init] <defunct> root 1126 143 0 07:56 pts/0 00:00:00 ps -ef
プロセス数が積み上がり異常に多くなっている。
# ps -ef | wc -l 4705
PID 1 問題
こちらで説明されている通り、コンテナ環境ではメインプロセスがPID 1で稼働することに起因している。
解消 - shareProcessNamespace
PID 1 問題を解消するために、 shareProcessNamespace
を有効化する。
ytt
でオーバーレイする。
#@overlay/match by=overlay.subset({"kind":"StatefulSet","metadata":{"name":"concourse-worker"}}) --- spec: template: spec: #@overlay/match missing_ok=True shareProcessNamespace: true
これにより、PID 1はpause
が動作し、concourse worker
は別PIDで起動するため、期待通りプロセスが随時停止され、ゾンビ化しなくなる。
# ps -ef UID PID PPID C STIME TTY TIME CMD 65535 1 0 0 May15 ? 00:00:00 /pause root 7 0 0 May15 ? 00:11:05 /opt/bitnami/concourse/bin/concourse worker root 25 7 0 May15 ? 00:08:57 gdn server --bind-ip 127.0.0.1 --bind-port 7777 --depot /bitnami/concour root 1394 1 0 00:22 ? 00:00:00 /tmp/garden-init root 1400 25 0 00:22 ? 00:00:00 /var/gdn/assets/linux/bin/runc --root /run/runc events df7951f6-5204-442 root 1480 1 0 00:22 ? 00:00:00 /tmp/garden-init root 1486 25 0 00:22 ? 00:00:00 /var/gdn/assets/linux/bin/runc --root /run/runc events 5ac33201-d960-443 ... 4294967+ 31143 1 0 00:19 ? 00:00:00 /tmp/garden-init root 31159 25 0 00:19 ? 00:00:00 /var/gdn/assets/linux/bin/runc --root /run/runc events e7db819d-9718-4d9
まとめ - Concourse on Docker/Kubernetes環境でのゾンビプロセス対応 (resource temporarily unavailable, [garden-init] )
Docker/Kubernetes環境で発生するPID 1問題によるゾンビプロセス化に対し、 shareProcessNamespace
を有効化することで問題解消した。