KubernetesでX.509を利用してkubectl

KubernetesでX.509認証を利用してkubectlを利用する方法。
本記事ではopensslを利用してCSRの承認を行う。APIを利用する方法もあり、おそらくこちらの方が汎用性が高いが理解を深めるために以下を実施した（[Kubernetesでユーザを作成する（X509 Client Certs編）](https://qiita.com/knqyf263/items/aefb0ff139cfb6519e27)）。

# 前提
- kubeadmで構築したマスター上で作業
    - KubernetesのCAファイルがマスター上にあるため
- Version
    - kubeadm: v1.16.1
    - kubernets: v1.16.1

# 手順
- 手順概要
    - ユーザの秘密鍵作成
    - CSRを作成
    - CSRをKubernetesクラスタのCAで承認
    - ユーザに対してロールを割り当てる
    - 確認

## ユーザの秘密鍵作成

```
$ openssl genrsa -out paper2.key 2048
Generating RSA private key, 2048 bit long modulus (2 primes)
..+++++
...........................................................................+++++
e is 65537 (0x010001)
```

## CSRを作成

```
$ openssl req -new -key paper2.key -out paper2.csr -subj "/CN=paper2/O=app1/O=app2"
```

SubjectのCN(Common Name)がユーザ名として扱われ、O(Organization)がグループ名になる。
そのため`O=system:masters`も指定すると、system:mastersグループに所属するのでcluster-adminの権限を最初から付与された状態になる。後述するClusterRoleBindingの作業が不要になる。権限を細かく制御したい場合は安易にsystem:mastersグループにいれないこと。


## CSRをKubernetesクラスタのCAで承認

```
$ sudo openssl x509 -req -in paper2.csr  -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out paper2.crt -days 10000
Signature ok
subject=CN = paper2, O = app1, O = app2
Getting CA Private Key
```

kubeadmでは`/etc/kubernetes/pki/`にKubernetesのCA情報が配置されているので、それを利用している。

## kubectlの設定
kubectlのcontextを設定する。

まずはUserを設定。

```
$ kubectl config set-credentials paper2 --client-certificate=paper2.crt --client-key=paper2.key
User "paper2" set.
```

次にContextを設定。

```
$ kubectl config set-context paper2 --cluster=kubernetes --namespace=default --user=paper2
Context "paper2" created.
```

## ユーザに対してロールを割り当てる

以下ファイルを作成。

```paper2-clusterrolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  annotations:
    rbac.authorization.kubernetes.io/autoupdate: "true"
  name: cluster-admin-paper2
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: User
  name: paper2
```

適用する。

```
$ kubectl apply -f paper2-clusterrolebinding.yaml
clusterrolebinding.rbac.authorization.k8s.io/cluster-admin-paper2 created
```

## 確認
```
$ kubectl --context=paper2 get po -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-6bbf58546b-tmcmw   1/1     Running   1          8d
calico-node-47gls                          1/1     Running   4          22d
calico-node-lmdh6                          1/1     Running   4          22d
coredns-5644d7b6d9-97n62                   1/1     Running   1          8d
coredns-5644d7b6d9-zdtgt                   1/1     Running   1          8d
etcd-ip-172-31-20-245                      1/1     Running   4          22d
kube-apiserver-ip-172-31-20-245            1/1     Running   4          22d
kube-controller-manager-ip-172-31-20-245   1/1     Running   11         22d
kube-proxy-dqsp8                           1/1     Running   4          22d
kube-proxy-s4bcc                           1/1     Running   4          22d
kube-scheduler-ip-172-31-20-245            1/1     Running   12         145m
metrics-server-67684d476-rzctd             1/1     Running   1          8d
```

X.509を利用した認証でkubectlを利用することができました。