kubernetesでvolumeをホスト上のディレクトリに指定してPod(rc)を起動したところ、該当ディレクトリにコンテナからアクセスするとPermission Deniedエラーとなる事象に遭遇。
ホスト側のマウント先ディレクトリの権限は777にしていたがダメだった。
原因は SELinux。
SELinuxとはセキュリティ管理モジュールで、SELinux はデフォルトでは、Kubernetes がその共有ディレクトリーにアクセスすることをブロックする。
ホスト上でSELinuxが動作しているかは以下のコマンドで確認できる。
getenforce
enforcing : SELinux機能、アクセス制御が有効
permissive : SElinuxは警告を出力するが、アクセス制限は無効
disabled : SElinux機能、アクセス制御が無効
SElinuxの無効化
/etc/selinux/config
の SELINUX=disabled
と編集して再起動すると無効化できる
SElinuxの一時的無効化
setenforce 0
コマンドでい時期的に無効化(permissive)に変更できる
setenforce 1
で再有効化
指定ディレクトリを許可
無効化はせず、コンテナ稼働ホスト(Minion)上で以下を実行すると、SELinuxは、指定したホストマウント先ディレクトリへの読み書きを許可する設定にできる。
sudo chcon -R -t svirt_sandbox_file_t <マウント先ディレクトリ>
参考)
https://access.redhat.com/documentation/ja/red-hat-enterprise-linux-atomic-host/7/getting-started-with-containers/chapter-6-get-started-provisioning-storage-in-kubernetes
http://rfs.jp/server/security/selinux01.html
http://kubernetes.io/docs/user-guide/security-context/