Helm安装完之后遇到的权限问题

如果照著手冊使用 helm init安裝完 Helm 之後,使用 helm list 指令,會看到這樣的錯誤:

1
2
$ helm list
Error: configmaps is forbidden: User "system:serviceaccount:kube-system:default" cannot list configmaps in the namespace "kube-system": Unknown user "system:serviceaccount:kube-system:default"

首先,在helm init前准备一个ServiceAccount

setup-helm-rbac.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: v1
kind: ServiceAccount
metadata:
creationTimestamp: 2019-03-24T06:14:51Z
name: tiller
namespace: kube-system
secrets:
- name: tiller-token-bbvwm
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: tiller-binding
subjects:
- kind: ServiceAccount
name: tiller
namespace: kube-system
roleRef:
kind: ClusterRole
name: cluster-admin
apiGroup: rbac.authorization.k8s.io

角色:Role,拥有资源的权限,可以看做是一个职业

账号:ServiceAccount,用户使用K8S API的入口

当您(真人用户)访问集群(例如使用kubectl命令)时,apiserver 会将您认证为一个特定的 User Account(目前通常是admin,除非您的系统管理员自定义了集群配置)。Pod 容器中的进程也可以与 apiserver 联系。 当它们在联系 apiserver 的时候,它们会被认证为一个特定的 Service Account(例如default)。

刪除原本的 Tiller

1
2
$ kubectl delete deployment tiller-deploy --namespace=kube-system
$ kubectl delete svc tiller-deploy --namespace=kube-system

重新初始化 Helm 並且指定要使用的 Service Account

1
$ helm init --service-account tiller

如果helm init时没指定账号,也可以用以下命令补上

1
$ kubectl patch deploy --namespace kube-system tiller-deploy -p '{"spec":{"template":{"spec":{"serviceAccount":"tiller"}}}}'
参考资料

Helm 部署在 GKE 上的權限問題

https://medium.com/smalltowntechblog/helm-tiller-%E9%83%A8%E7%BD%B2%E5%9C%A8-gke-%E4%B8%8A%E7%9A%84%E6%AC%8A%E9%99%90%E5%95%8F%E9%A1%8C-a016f703372e