Minikubeでリソースへのアクセスを試みたときに403エラーが返される場合、RBAC(ロールベースアクセス制御)設定によってアクセス権限が拒否されています。このエラーは開発環境でも本番環境でも発生し、適切な権限設定で解決します。
よくある原因
デフォルトのServiceAccountに必要な権限がない
Minikubeではデフォルトでdefault ServiceAccountが使用されますが、このアカウントには最小限の権限しか持っていません。Podやその他のリソースに対して読み取り・書き込み操作を行おうとすると、デフォルトServiceAccountに対応する権限がないため403エラーが発生します。
RoleBindingまたはClusterRoleBindingが設定されていない
Roleを作成しても、そのRoleをServiceAccountに紐付けるRoleBindingが存在しないと権限は有効になりません。ServiceAccountとRoleの結合関係が欠落している場合、403エラーで操作が拒否されます。
Minikubeのアドオン(ダッシュボードなど)に必要な権限が付与されていない
Minikubeに含まれるダッシュボードやメトリクス取得機能などのアドオンは、クラスタ内で特定のリソースにアクセスする必要があります。アドオンが有効化されていない、または不完全な権限設定で実行されている場合、ダッシュボードやメトリクス取得時に403エラーが発生します。
解決手順
ステップ1:現在の権限を確認する
kubectl auth can-iコマンドを使用して、現在のユーザーがリソースに対して特定の操作を実行できるかを確認します。
# デフォルトのdefault ServiceAccountで確認
kubectl auth can-i get pods --as=system:serviceaccount:default:default
# 特定の操作が許可されているか確認
kubectl auth can-i create deployments --as=system:serviceaccount:default:default
# 詳細な理由を表示
kubectl auth can-i get pods --as=system:serviceaccount:default:default -v=9
このコマンドでnoと返される場合、権限がないことが確定します。
ステップ2:必要な権限を持つRoleを作成する
アクセスしたいリソースに対するRoleを作成します。例えば、Podの読み取りと作成が必要な場合:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
namespace: default
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["create", "update", "patch", "delete"]
このYAMLをrole.yamlとして保存し、以下のコマンドで適用します:
kubectl apply -f role.yaml
ステップ3:RoleBindingを作成してServiceAccountに権限を付与する
作成したRoleをdefault ServiceAccountに紐付けます:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: pod-reader
subjects:
- kind: ServiceAccount
name: default
namespace: default
このYAMLをrolebinding.yamlとして保存し、適用します:
kubectl apply -f rolebinding.yaml
ステップ4:権限付与後の動作を確認する
RoleBindingを適用した後、再度権限確認を実行します:
kubectl auth can-i get pods --as=system:serviceaccount:default:default
このコマンドでyesと返されれば、権限が正常に付与されています。
ステップ5:Minikubeのアドオンを有効化する
ダッシュボードやメトリクス関連の403エラーが発生している場合、アドオンを有効化します:
# ダッシュボードを有効化
minikube addons enable dashboard
# メトリクスサーバーを有効化(メトリクス取得エラーの場合)
minikube addons enable metrics-server
# 有効化されているアドオンを確認
minikube addons list
アドオン有効化後、以下のコマンドでダッシュボードにアクセスできます:
minikube dashboard
それでも解決しない場合
権限確認とRoleBinding設定を実施しても403エラーが継続する場合は、以下の対応を検討してください。
ClusterRoleを使用する必要がないか確認します。特定のnamespaceに限定されず、全クラスタでのアクセスが必要な場合は、RoleとRoleBindingではなくClusterRoleとClusterRoleBindingを使用する必要があります。
# クラスタレベルの権限を確認
kubectl auth can-i get nodes --as=system:serviceaccount:default:default
Minikubeのキャッシュをリセットし、新規にクラスタを構築することで権限設定を初期化することも有効です:
minikube delete
minikube start
また、kubectl describe rolebinding <name>でRoleBinding設定を確認し、roleRefとsubjectsが正しく指定されているか検証してください。YAML形式の誤りやnamespace指定の誤りが権限付与失敗の原因になることがあります。
免責事項:本記事の内容は、執筆時点の公開情報をもとに作成したものです。ソフトウェアの仕様は予告なく変更されることがあります。最新の情報は各ツールの公式サポートページをご確認ください。本記事の情報を利用した結果生じたいかなる損害についても、著者および運営者は責任を負いかねます。