designetwork

ネットワークを軸としたIT技術メモ

Concourse on Docker/Kubernetes環境でのゾンビプロセス対応 (resource temporarily unavailable, [garden-init] <defunct>)

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で稼働することに起因している。

text.superbrothers.dev

解消 - 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 を有効化することで問題解消した。