見出し画像

プログラマ探偵の事件簿:偶然の一致によるKubernetes上でWEBサーバー起動不能

思いもよらない偶然の一致によってDockerで問題なく動作するコンテナがKubernetes環境では、うまく動かない事件が起こった。その謎を解いた時の話である。

事件のはじまり

助手の猫がこの世を去って3ヶ月たった頃のことである。Kubernetesのクラスター環境を作った。この環境で試しにTWSNMP FCを起動してみようと思った。Dockerのコンテナ環境では問題なく動作しているので簡単に動くはずである。しかし、起動はできたがブラウザーからアクセスしても何も表示されない。白い画面だ!Kubernetesの設定ファイルに間違いがあるのか?

設定ファイルに間違いはない

Kubernetesの設定ファイルを何度も見直した。とは言っても

apiVersion: v1
kind: Pod
metadata:
  name: twsnmpfc
  labels: 
    svc2pod: twsnmpfc
spec:
  containers:
  - name: twsnmpfc
    image: twsnmp/twsnmpfc:latest
    ports:
    - name: http
      containerPort: 8080
    env:
      - name: TZ
        value: "Asia:Tokyo"
    volumeMounts:
    - name: twsnmpfc-storage
      mountPath: /datastore
  volumes:
  - name: twsnmpfc-storage
    emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: twsnmpfc
spec:
  type: NodePort
  selector:
    svc2pod: twsnmpfc
  ports:
  - port: 8080
    nodePort: 30080

これだけである。どこに間違いがあるのだろうか?

ログにヒントが

プログラム事件調査の基本であるログを調べてみることにした。天の猫が「ログを調べろ!」と言ったような気がしたからだ。
よくみると

2021-12-09T21:07:26.523 start webapi err=listen tcp: address :tcp://10.110.181.134:8080: too many colons in address

のようなログが記録されていた。WEBサーバーの起動に失敗していたのだ!これではブラウザーからアクセスできない。WEBサーバーの起動に失敗している理由は、指定したアドレスにコロン(:)が多いと言っている。

:tcp://10.110.181.134:8080

を指定したと言っている。しかし何故こんなアドレスを指定したのか?

指定したアドレスの元をたどれ

このアドレスがどこで指定したものか、ソースコードをさかのぼっていった。起動パラメータか環境変数で指定したポート番号にたどり着いた。

-port <ポート番号>

 TWSNMPFC_PORT=<ポート番号>
という環境変数

調査のために、起動時のパラメータをログに記録することにした。

2021/12/09 21:07:17 start twsnmpfc version=v1.7.0(8220514)
2021/12/09 21:07:17 config
2021/12/09 21:07:17 cpuprofile=''
2021/12/09 21:07:17 datastore='./datastore'
2021/12/09 21:07:17 host=''
2021/12/09 21:07:17 ip=''
2021/12/09 21:07:17 local='false'
2021/12/09 21:07:17 memprofile=''
2021/12/09 21:07:17 ping=''
2021/12/09 21:07:17 port='tcp://10.110.181.134:8080'
2021/12/09 21:07:17 restore=''
2021/12/09 21:07:17 tls='false'

たしかに、PORT番号に問題のアドレスが指定されている。しかし、Kubernetesの設定ファイルを見直しても、どちらも指定していない。はたして誰が設定したのか?

ポート番号を明示的に指定してみる

PORT番号の指定の問題であることがわかったので、試しにPORTを環境変数で明示的に設定してみた。

    env:
      - name: TZ
        value: "Asia:Tokyo"
      - name: TWSNMPFC_PORT
        value: "8080"

TWSNMPFC_PORTの部分を追加した。こうするだけで動いた。ますます、誰がTWSNMPFC_PORTを設定したのか謎が深まる。

Kubernetesが設定した環境変数と偶然一致

もう一度、Kubernetesの設定ファイルを見直してみた。何となくPODやサービスの名前がすべてtwsnmpfcであることが気になった。試しに全てtwsnmpfc2に変えて起動してみた。TWSNMPFC_PORTは指定しない最初の状態である。何とアクセスできた。
どうやら、Kubernetesが

サービス名の大文字_PORT

という環境変数を自動で設定しているようである。それもPORT番号だけではなくプロトコル+アドレス+PORT番号の文字列で!
素直な気持ちでPODやサービスの名前をtwsnmpfcにしたことで偶然、Kubernetesの設定した環境変数と一致していたのであった。

5年前に同じような事件があった

私だけかと思っていたら、

の人は同じような事件にあっていた。Kubernetesのドキュメントにも書いてあるとのことだ。

Kubernetesは謎の宝庫

Kubernetes環境の構築やコンテナの起動には様々な謎がある。プログラマー探偵が多いに活躍できる場のような気がする。天の猫の助けを借りて解決した他の事件の話も、そのうち書こうと思う。

開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。