読者です 読者をやめる 読者になる 読者になる

nekop's blog

OpenShift / JBoss / WildFly / Infinispanの中の人 http://twitter.com/nekop

OpenShiftでCrashLoopしているPodのログを見る

この投稿はOpen PaaS Advent Calendar 2015の10日目の記事です。

OpenShiftでおもむろにnginxをデプロイしてみます。

$ oc new-app nginx # official "nginx" docker image on docker hub

oc get allしてみますが、CrashLoopBackOffという状態になっていて稼働していないようです。RESTARTSが3になっていて増加していってるようです。

$ oc get all
NAME            DOCKER REPO                 TAGS                           UPDATED
nginx           library/nginx               1.7.10,latest,1 + 19 more...   About a minute ago
NAME            TRIGGERS                    LATEST
nginx           ConfigChange, ImageChange   1
CONTROLLER      CONTAINER(S)                IMAGE(S)                                                                                SELECTOR                                              REPLICAS                           AGE
nginx-1         nginx                       library/nginx@sha256:0a8bad8dfc80e38ccdd09c41d4efd2547fa9d6d58d8706431952a2ef312e2034   app=nginx,deployment=nginx-1,deploymentconfig=nginx   1                                  1m
NAME            CLUSTER_IP                  EXTERNAL_IP                                                                             PORT(S)                                               SELECTOR                           AGE
nginx           172.30.126.189              <none>                                                                                  80/TCP,443/TCP                                        app=nginx,deploymentconfig=nginx   2m
NAME            READY                       STATUS                                                                                  RESTARTS                                              AGE
nginx-1-0khqs   0/1                         CrashLoopBackOff                                                                        3                                                     1m

back offというのは意図的に待っている状態で、この場合は再起動のインターバルを待っている状態です。docker pull待ちのDockerPullBackOffというのもあります。

oc logsでログを見てみましょう。

$ oc logs nginx-1-0khqs
Error from server: Internal error occurred: Pod "nginx-1-0khqs" in namespace "test": container "nginx" is in waiting state.

コンテナが現在稼働していないのでログが取れないと言われてしまいました。困りましたね。

このような場合、--previousというオプションを指定することで、前回のログを見ることができます。

$ oc logs --previous nginx-1-0khqs
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (13: Permission denied)
2015/12/15 05:08:11 [warn] 1#1: the "user" directive makes sense only if the master process runs with super-user privileges, ignored in /etc/nginx/nginx.conf:2
2015/12/15 05:08:11 [emerg] 1#1: open() "/var/log/nginx/error.log" failed (13: Permission denied)

Permission deniedですね。OpenShiftでPermission deniedが出ている場合は大抵USERが指定されているか、もしくはUSERを指定しておらずrootでの動作を前提としてしまっているイメージです。

OpenShiftではuser IDで権限を制御する部分があるので、USERによるユーザ名指定はデフォルトで禁止されており、動的にユーザIDが割り当たるようになっているため、上記のようなイメージはこのようなパーミッションエラーを引き起こします。詳しい説明はイメージガイドラインのSupport Arbitrary User IDsのところに記述されています。

ちなみにUSER、USER未指定rootの利用を許可する設定もできます。

oc logs --previousはKubernetes由来のもので、kubectl logs --previousというコマンドなのですが、どちらもぐぐってもほとんど情報が出てこないという謎の隠しコマンド状態です。なんででしょうね。レアポケモンの紹介でした。

追記: 初出時に「USERの指定がされているためエラーになった」旨で記載していましたが、実際にはnginxのイメージは「USERの指定がされていない、かつ実行時root前提のためエラーになった」というものだったので修正しました。