Help us understand the problem. What is going on with this article?

KubernetesでServiceAccountを追加する

/etc/kubernetes/admin.conf を~/.kube/configにコピーすれば使えてしまうのだが配った人全員がkubernetes-adminユーザーになってしまう。それでは何なので、ServiceAccountを作成する。
UserAccount / ServiceAccountがユーザー、
Role / ClusterRoleがロール、
RoleBinding / ClusterRoleBindingでユーザーとロールを紐づける。

といった感じになる。これを称してRBAC(Role-based access control)という。まぁよくあるタイプだよね。
Role/Bindingはnamespace別、Clusterがつくとクラスタ全体に響く設定になる。
とりあえず設定するを目的としているので、詳しくはググってくれ。死ぬほど出てくる。

TL;DR

ServiceAccount Tokenを利用したServiceAccountを作成してClusterRoleのedit権限を付けちゃいます。

ServiceAccountはpodなどのシステム用で、UserAccountは人につけるものだということが書いてあるが、とりあえずServiceAccountを追加してみる。

murata:~ $ kubectl version
Client Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.2", GitCommit:"c97fe5036ef3df2967d086711e6c0c405941e14b", GitTreeState:"clean", BuildDate:"2019-10-15T19:18:23Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"16", GitVersion:"v1.16.2", GitCommit:"c97fe5036ef3df2967d086711e6c0c405941e14b", GitTreeState:"clean", BuildDate:"2019-10-15T19:09:08Z", GoVersion:"go1.12.10", Compiler:"gc", Platform:"linux/amd64"}

ServiceAccount作成

murata:~ $ kubectl create serviceaccount derorisan
serviceaccount/derorisan created
murata:~ $ kubectl describe serviceaccount derorisan
Name:                derorisan
Namespace:           default
Labels:              <none>
Annotations:         <none>
Image pull secrets:  <none>
Mountable secrets:   derorisan-token-4xswb
Tokens:              derorisan-token-4xswb
Events:              <none>

Namespace defaultにdeorirsanアカウントが作成されました。

Token確認

describeのMountable secretsかTokenのところにあるのがsecretです。そこにTokenが記載されています。

murata:~ $ kubectl describe secret derorisan-token-4xswb
Name:         derorisan-token-4xswb
Namespace:    default
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: derorisan
              kubernetes.io/service-account.uid: d8e2d357-9b5d-4dfc-9035-ac25784dd35c

Type:  kubernetes.io/service-account-token

Data
====
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IkJFb1BFd1U0MFlIWDFoWXZ2RHE2OGFKUHZxNEdTaEh1d
udC9zZWNyZXQubmFtZSI6ImRlcm9yaXNhbi10b2tlbi00eHN3YiIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFj
WMiLCJzdWIiOiJzeXN0ZW06c2VydmljZWFjY291bnQ6ZGVmYXVsdDpkZXJvcmlzYW4ifQ.JX1o9pPOoI9HHq4
EVqrjTHJ9T1AYWDqc0at3wFFMkEUuAqaY1bkwTpJzwIkfhzgpGvf_30Pq9pHJhZaBSF6HXYEvlJiespa3Q3i9
ca.crt:     1025 bytes
namespace:  7 bytes

※tokenが長いので右端は切ってあります。

クライアントに設定

とりあえず先に認証だけ通るようにします。linuxユーザーをderoriユーザーに切り替えてやります。

~/.kube/configにclusterを設定します。(serverは $ kubectl describe configmap/cluster-info -n kube-public のserverセクションを見れば書いてあります。)
--insecure-skip-tls-verifyはいらないかも。

[derori@murata ~]$ kubectl config set-cluster test-sa --insecure-skip-tls-verify=true --server=https://172.16.203.33:6443
Cluster "test-sa" set.

configにderorisanユーザーの設定を追加します。

[derori@murata ~]$ kubectl config set-credentials derorisan --token=eyJhbGciOiJSUzI1NiIsImtpZ
User "derorisan" set.

※Tokenが長いので右端切っています。

test-saにはderorisanユーザーを使うように設定します。

[derori@murata ~]$ kubectl config set-context test-sa --cluster=test-sa --user=derorisan
Context "test-sa" created.

切り替えます。

[derori@murata ~]$ kubectl config use-context test-sa
Switched to context "test-sa".

全部~/.kube/configの中身をコマンドに書いてもらっただけです。

でpodを取得しようとしてみましょう。ユーザーは作ったけどroleはバインディングしていないのでエラーになります。

[derori@murata ~]$ kubectl get pod
Error from server (Forbidden): pods is forbidden: User "system:serviceaccount:default:derorisan" cannot list resource "pods" in API group "" in the namespace "default"

ClusterRoleのバインディング作成

既存のClusterRoleのeditにderorisanアカウントをtest-rolebindingという名前でバインディングします。(deororiユーザーから戻ります。)

murata:~ $ kubectl create clusterrolebinding test-rolebinding --clusterrole=edit --serviceaccount=default:derorisan
clusterrolebinding.rbac.authorization.k8s.io/test-rolebinding created
murata:~ $ kubectl describe clusterrolebinding test-rolebinding
Name:         test-rolebinding
Labels:       <none>
Annotations:  <none>
Role:
  Kind:  ClusterRole
  Name:  edit
Subjects:
  Kind            Name       Namespace
  ----            ----       ---------
  ServiceAccount  derorisan  default

アクセス確認

deroriユーザーにて。

[derori@murata ~]$ kubectl get pod
No resources found in default namespace.

おっとpodはなかった。

[derori@murata ~]$ kubectl get all
NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   90d

おkおk。ちなみにClusterRoleBindingであれば別のNamespaceも問題なくいじれます。

ServiceAccount削除

削除すればアクセスできなくなる。(secretだけ消しても別のTokenが復活します。

murata:~ $ kubectl delete sa derorisan
serviceaccount "derorisan" deleted
murata:~ $ kubectl get sa
NAME      SECRETS   AGE
default   1         90d
test-sa   1         54m
murata:~ $ kubectl get secret
NAME                  TYPE                                  DATA   AGE
default-token-tlqfr   kubernetes.io/service-account-token   3      90d
test-sa-token-9lj42   kubernetes.io/service-account-token   3      46m
[derori@murata ~]$ kubectl get all
error: You must be logged in to the server (Unauthorized)
error: You must be logged in to the server (Unauthorized)
error: You must be logged in to the server (Unauthorized)
error: You must be logged in to the server (Unauthorized)
error: You must be logged in to the server (Unauthorized)
error: You must be logged in to the server (Unauthorized)
error: You must be logged in to the server (Unauthorized)
error: You must be logged in to the server (Unauthorized)
error: You must be logged in to the server (Unauthorized)
error: You must be logged in to the server (Unauthorized)

おkです。

おまけ

既存のRoleBindingに作ったServiceAccountを追加することもできます。

murata:~ $ kubectl edit clusterrolebinding cluster-admin

一番下のsubjectsに追加します。

- kind: ServiceAccount
  name: derorisan
  namespace: default

こんな感じ

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  creationTimestamp: "2019-11-13T11:36:43Z"
  labels:
    kubernetes.io/bootstrapping: rbac-defaults
  name: cluster-admin
  resourceVersion: "13564650"
  selfLink: /apis/rbac.authorization.k8s.io/v1/clusterrolebindings/cluster-admin
  uid: dbc698e6-4aff-4b24-a2db-05fd1cf90d63
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- apiGroup: rbac.authorization.k8s.io
  kind: Group
  name: system:masters
- kind: ServiceAccount
  name: derorisan
  namespace: default

まとめ

k8sの認証/認可はいろいろな方法があって混乱しました。(覚えきれないまん)
とりあえずServiceAccountを使ってユーザーを作成してみました。
おそらくコンソールなどからのアクセスはServiceAccountではなくUserAccountでやるのが正解なのでしょうが、それはまた別の機会に。
UserAccountの追加はこちら https://qiita.com/murata-tomohide/items/15807a4740b1ea3b92da

参考 as below:

Managing Service Accounts
https://kubernetes.io/docs/reference/access-authn-authz/rbac/
Kubernetes道場 20日目 - Role / RoleBinding / ClusterRole / ClusterRoleBindingについて
KubernetesのService Accountについて調べてみた

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした