kubernetes上でRailsなどのRackアプリケーションでreadOnlyRootFilesystemをTrueにする

最近仕事でElasticAPMを導入しているのだけど、その際にelasticapmのgemがtmpディレクトリを利用する。kubernetesで動作させるアプリは可能な限りreadOnlyRootFilesystemということもあり、試していると下記のエラーに出くわした。

usr/local/lib/ruby/2.6.0/tmpdir.rb:35:in `tmpdir': could not find a temporary directory (ArgumentError)

理由は下記のブログが詳しい。

先のブログだと、Rubyにモンキーパッチを当ててるのだけど、うーむという感じで考えてみたら、普通にinit containerでsticky bit与えればええやんということに気づいた。

 volumes:
   - name: tmp
     emptyDir: {}
 initContainers:
   - name: setup-tmpdir
     command: ["sh", "-c", "chmod 1777 /tmp && ls -lda /tmp"]
     image: busybox:latest
     imagePullPolicy: IfNotPresent
     volumeMounts:
     - mountPath: /tmp
       name: tmp

こんな感じでmanifestを書くと、モンキーパッチを入れる必要がない。

個人的な思想信条なのだけど、アプリケーションのコードに環境に依存するようなコードを入れるのはこれからのインフラの局面を考えるとあまりベターではないように思う。アプリケーションレイヤーは分離して、アプリケーションはどのような環境でも動くという状態で記述するのがいいと思うので、モンキーパッチをせずに、アプリケーションとインフラの中間にk8sという環境があるわけだからそこで吸収するとシンプルに構成管理できるんじゃなかろうかと思う。