まくら
Argo-Workflows、dev-workspace、vcluster など、ユーザ(テナント)ごとに名前空間で分離し RBAC で権限を与える前提のツールが増えてきました。
そのようなツール、特に Argo-workflows で顕著なのですが「どの名前空間でも同じアクセス権限を ServiceAccount に与えたい」という状況が、しばしばあります。
そのような際に「ClusterRole を使えばいいじゃん」という案が出がちなのですが。個人的にはお勧めしていません。
使って悪い条件と理由
「強力過ぎる」
公式文書では ClusterRole が行える機能として下記を挙げています。
ClusterRolesはクラスター単位でスコープされているため、以下へのアクセスの許可もできます。
- クラスター単位でスコープされているリソースに(nodeなど)
- 非リソースエンドポイントに(/healthzなど)
- すべてのNamespaceに渡ってNamespaceに属するリソースに(Podなど)。 例えば、ClusterRoleを使用して特定のユーザーにkubectl get pods --all-namespacesの実行を許可できます。
「それらのリソースに対するパーミッションを与えなきゃいいじゃん」という反論はもっともなのですが、人はミスをする生き物であり、将来引き継がれるエンジニアが十分な知識を有しているとは限りません。
大人しく Role を使いましょう。
使って良い条件
逆説的に、 ClusterRoles が提供する機能を使わねばならない場合は、使って良い条件になります。
大抵、そのようなアプリケーションは下記いづれかになるでしょう。
- controller
- operator
- metrics collector
任された仕事内容にも依るかもしれませんが、これらを自作しデプロイする場面は、さほど多くないはずです。
「日々の保守業務では、基本的には Role しか使わない」を選択したほうが安全です。