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)
理由は下記のブログが詳しい。
koukiblog
Entry is not found - koukiblog
たぶんweb系の話題
先のブログだと、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という環境があるわけだからそこで吸収するとシンプルに構成管理できるんじゃなかろうかと思う。