👨‍💻

kubernetesでユーザーアカウト作成してみた。

2022/03/12に公開

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