OpenShift上のコンテナに対して、root権限でコマンドを実行する方法について紹介します。
- コンテナに対してコマンドを実行する方法
- root権限でコマンド実行する方法
- root権限でコマンド実行するユースケース
コンテナに対してコマンドを実行する方法
OpenShiftでコンテナに対してコマンドを実行する方法を紹介します。
コンテナに対してコマンドを実行するために、以下のコマンドを利用することがあります。podに接続してインタラクティブにコマンドを実行したり、ワンライナーのコマンドをコンテナで実行することができます。ただし、コンテナ実行ユーザーでの操作になりますので、実行ユーザーがrootでない場合はroot操作を行うことができません。
- oc rsh
- oc exec
これはシステムをセキュアに保つためですが、どうしてもroot権限で操作したいことがあったりします。本記事ではその方法について紹介します。
root権限でコマンド実行する方法
root権限でコマンド実行する方法について紹介します。以下のサポート問い合わせ履歴を参考にしました。
https://access.redhat.com/solutions/4539631
1. podが実行されているノードを確認する
$ oc get pods -o wide
2. container idを確認する
$ oc describe pod [pod名] | grep -I container
3. 手順1で確認したノードにログインし、コンテナのpidを確認する
$ pstree -p $(ps aux | awk “/[container id]/ {print \$2; exit}") conmon(1408224)-+-dockerregistry(1408236)-+-{dockerregistry}(1408282) | |-{dockerregistry}(1408283) | |-{dockerregistry}(1408284) | |-{dockerregistry}(1408285) | |-{dockerregistry}(1408286) | |-{dockerregistry}(1408287) | |-{dockerregistry}(1408288) | |-{dockerregistry}(1408289) | |-{dockerregistry}(1408318) | |-{dockerregistry}(1409115) | |-{dockerregistry}(1409558) | |-{dockerregistry}(1415043) | `-{dockerregistry}(1429776) `-{conmon}(1408226)
4. コンテナに接続する
$ nsenter -a -t 1408236
5. コマンドを実行する
以下のコマンドを確認すると、rootユーザーでコマンド実行していることが確認できます。
$ whoami
root権限でコマンド実行するユースケースと体験談
本記事で紹介した操作は、大体が障害時の問題切り分けで使われることを想定しています。何故ならば、コンテナのイミュータブルな性質を無視していて、根本解決になっていないからです。
先日、OpenShiftを操作していたらdocker registryが機能していないことに気づきました。突き詰めると、docker registry podの/registryのオーナーがroot:rootになっていたことが原因でした。権限不足でレジストリへのpush/pullができない状態だったのです。
/registryのオーナー権限をchmod
やchown
で変更すれば解決するのですが、oc rsh
コマンドで実行しようにも、コンテナ実行ユーザー(この時のユーザーは、1000170000でした)での操作になるのでchmod
やchown
コマンドが実行できませんでした。
本当に原因が合っているか確かめるため、かつ即時回復が求められていたため、一時的にroot権限でコマンドを実行して回復しました。このように、問題切り分けの時には有効だと思いますので是非ご活用ください。
以上です!