📝 BLOG.IK.AM

@making's memo
(🗃 Categories 🏷 Tags)

KubernetesのRBACでNamespace毎に専用ServiceAccountを作成

🗃 {Dev/CaaS/Kubernetes/RBAC}

🏷 Kubernetes 🏷 RBAC

🗓 Updated at 2018-02-15T03:50:31+09:00 by Toshiaki Maki  🗓 Created at 2018-02-15T02:59:14+09:00 by Toshiaki Maki  {✒️️ Edit  ⏰ History}


Kubernetesインストール後、Adminアカウントをみんなで共有する運用はありえないので、最低限Namespace毎に権限を絞る方法をメモ。

以下、RBACが有効になっていること前提。

GKEの場合、“Legacy Authorization”をDisabledにする必要がある。
rbac on gke

bobyというServiceAccountblogというNamespaceでのみ開発できるようにするケースで説明。(自分の環境向けにはbodyblogを読みかえれば良い。)

Namespace作成。

kubectl create namespace blog

ServiceAccountを作成すると同時にこのServiceAccountRoleBindingを作成。BindするRoleまたはClusterRoleはここでは雑にClusterRoleeditにする。(もう少し絞りたい場合はドキュメント参照)

上記を実現するため、次のコマンドでblog-boby.ymlを作成する。

cat <<EOF > blog-boby.yml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: boby-sa
  namespace: blog
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: boby-rb
  namespace: blog
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: edit
subjects:
- kind: ServiceAccount
  name: boby-sa
EOF

設定する。

kubectl apply -f blog-boby.yml

このServiceAccount用のconfigファイルを生成するヘルパースクリプトとして、zlabjp/kubernetes-scriptsで提供されているcreate-kubeconfigを使います。

curl -LJOs https://github.com/zlabjp/kubernetes-scripts/raw/master/create-kubeconfig && chmod +x create-kubeconfig && sudo mv create-kubeconfig /usr/local/bin/

config作成。

create-kubeconfig boby-sa -n blog > config

環境変数KUBECONFIGにこのファイルパスを指定して動作確認。

$ KUBECONFIG=config kubectl get pod
No resources found.

$ KUBECONFIG=config kubectl auth can-i create pod
yes

$ KUBECONFIG=config kubectl get pod -n kube-system
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:blog:boby-sa" cannot list pods in the namespace "kube-system": Unknown user "system:serviceaccount:blog:boby-sa"

$ KUBECONFIG=config kubectl auth can-i create pod -n kube-system
no - Unknown user "system:serviceaccount:blog:boby-sa"

Unable to connect to the server: x509: certificate is valid for kubernetes, kubernetes.default, kubernetes.default.svc, kubernetes.default.svc.cluster.local, not localhostというようなエラーが出る場合は、

configファイルのcertificate-authority-data: ...の行を削除して、insecure-skip-tls-verify: trueに変える。
つまり次のようにする。

# ...
clusters:
- cluster:
    insecure-skip-tls-verify: true
    server: https://your-master-ip-or-host:8443
  name: foobar
# ...

動作確認できたら、このファイルを開発者に渡し、~/.kube/configにコピーしてもらう。

cp config ~/.kube/config

複数のNamespaceにBindしたい場合は、RoleBindingを複数定義する。

ServiceAccountおよびRoleBindingを削除したい場合は、

kubectl delete -f blog-boby.yml

CFCR (Cloud Foundry Container Runtime) 0.14.0ではOpenID Connect対応が入るはずなので、
リリースされたらUAAとの連携を行う。