kubernetesでユーザーアカウト作成してみた。
k8sの2つのアカウント
-
user account
- kubernetesの管理対象ではない。
- クラスタレベルでNamespaceの影響を受けない。
-
service account
- kubernetesの管理対象
- namespaceに紐づくリソース
ユーザーアカウント作成してみた
- Podの作成
- 秘密鍵の作成
- CSR(Certificate Signing Request)の作成
- CSRの登録
- CSRの承認
- kubeconfigで設定
- ロールの作成
Podの作成
ユーザー作成後、作成したユーザーでPodを参照するため先にPodだけ作成しておきます。
apiVersion: v1
kind: Pod
metadata:
name: zenn
spec:
containers:
- name: zenn
image: nginx
$ kubectl apply -f pod.yaml
pod/zenn created
秘密鍵の作成
2048ビットで秘密鍵の作成する。
$ openssl genrsa -out zenn.key 2048
Generating RSA private key, 2048 bit long modulus
....+++
............................................+++
e is 65537 (0x10001)
CSRの作成
zenn.keyを元にCSRzenn.csrを作成する。
$ openssl req -new -key zenn.key -out zenn.csr -subj "/CN=zenn"
CSRの登録
Base64でエンコードする。
$ cat zenn.csr | base64 | tr -d "\n"
LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZEQ0NBVHdDQVFBd0R6RU5NQ
CSRを登録するcsr.yamlを作成して、エンコードしたCSRをyamlのrequestに記載する。
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: zenn
spec:
request: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURSBSRVFVRVNULS0tLS0KTUlJQ1ZEQ0NBVHdDQVFBd0R6RU5NQ
signerName: kubernetes.io/kube-apiserver-client
usages:
- client auth
manifestの反映をする。
$ kubectl apply -f csr.yaml
certificatesigningrequest.certificates.k8s.io/zenn created
作成したCSRを確認する。
CSRを承認してないのでPendingであることがわかる。
$ kubectl get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
zenn 3m34s kubernetes.io/kube-apiserver-client minikube-user <none> Pending
CSRの承認
CSRを承認する。
$ kubectl certificate approve zenn
certificatesigningrequest.certificates.k8s.io/zenn approved
確認するとステータスが承認されたことがわかる。
$ kubectl get csr
NAME AGE SIGNERNAME REQUESTOR REQUESTEDDURATION CONDITION
zenn 5m42s kubernetes.io/kube-apiserver-client minikube-user <none> Approved,Issued
証明書zenn.crtを取得する。
kubectl get csr zenn -o jsonpath='{.status.certificate}'| base64 -d > zenn.crt
kubeconfig
kubeconfigにユーザー情報を設定する。
ユーザーを追加する。
$ kubectl config set-credentials zenn --client-key=zenn.key --client-certificate=zenn.crt --embed-certs=true
User "zenn" set.
コンテキストを作成する。
$ kubectl config set-context zenn --cluster=minikube --user=zenn
Context "zenn" created.
kubectl config viewで設定を確認する。
context作成前後の比較
現在使用してるユーザーの確認をする。
$ kubectl config current-context
minikube
contextを変更し、使用するユーザーを変更する。
$ kubectl config use-context zenn
Switched to context "zenn".
$ kubectl config current-context
zenn
変更したユーザーでpodを確認する。
$ kubectl get pod
Error from server (Forbidden): pods is forbidden: User "zenn" cannot list resource "pods" in API group "" in the namespace "default"
権限がない(forbidden)と返答されてるので
zenn(ユーザー)にpodの参照権限を付与していく。
Error from server (Forbidden): pods is forbidden: User "zenn" cannot list resource "pods"
ロールの作成
今はzennのユーザーが使用されてるので、minikubeのユーザーに変更してからロールを作成していく。
※zennのユーザーだとロール作成権限がないため。
$ kubectl config use-context minikube
Switched to context "minikube".
$ kubectl config current-context
minikube
今回作成するロールはクラスターロールというのを作成していく。
※ロールが何かわからない方はRBACについてで説明してるので見てみてください。
下記manifestを作成する。
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: zenn
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: zenn
subjects:
- kind: User
name: zenn
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: zenn
apiGroup: rbac.authorization.k8s.io
作成したmanifestをapplyする。
$ kubectl apply -f zenn.yaml
clusterrole.rbac.authorization.k8s.io/zenn created
clusterrolebinding.rbac.authorization.k8s.io/zenn created
Roleを作成したら、ユーザー切り替えてPodを確認する。
$ kubectl config use-context zenn
Switched to context "zenn".
$ kubectl get pod
NAME READY STATUS RESTARTS AGE
zenn 1/1 Running 0 16m
Discussion