MicroK8sのクライアント環境セットアップ

nodeとして動いているマシン以外のマシンをMicroK8sのクライアント環境としてセットアップする。
より具体的にはtestuserというユーザでnodeとして動いていないマシンでkubectl経由でpodの情報を取得することをこの記事のゴールとする。

MicroK8sのクラスタセットアップについてはこの記事に書いてある通り。

  • VM2: master node
  • client-machine: クライアント環境をセットアップするマシン

RBACの設定

microk8sのRBACを有効にする。

VM2 $ microk8s enable rbac

次に、testuserを適当なroleにバインドする。

VM2 $ microk8s kubectl  create clusterrolebinding testuser --clusterrole=admin --user=testuser

認証方式の確認

api-serverのオプションを確認する。 microk8sの場合、$SNAP_DATA/args/kube-apiserverを見ればよい。

VM2 $ cat /var/snap/microk8s/current/args/kube-apiserver

確認したところ、--client-ca-fileが指定されていたので、X509 client certificatesが有効であることが分かった。

CSRの作成

csrの作成

client-machine $ openssl genrsa -out testuser.key 2048
client-machine $ openssl req -new -key testuser.key -out testuser.csr -subj "/CN=testuser"

master nodeのVMcsrをコピー

client-machine $ scp testuser.csr VM2:~/work

CSR(CertificateSigningRequest)を下記内容で作成する。(filename: testuser.csr.yaml)

apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
  name: testuser
spec:
  request: xxxxxx # cat testuser.csr | base64 | tr -d "\n"
  signerName: kubernetes.io/kube-apiserver-client
  expirationSeconds: 86400
  usages:
  - client auth
VM2 $ microk8s kubectl apply -f testuser.csr.yaml
VM2 $ microk8s kubectl certificate approve testuser

証明書の取得

作成された証明書とca.crtをclient-machineに置いてやる。

VM2 $ microk8s kubectl get csr testuser -o jsonpath='{.status.certificate}' | base64 -d > testuser.crt
VM2 $ scp testuser.crt client-machine:~/work
VM2 $ scp /var/snap/microk8s/current/certs/ca.crt client-machine:~/work

kubeconfigのセットアップ

client-machine $ kubectl config set-credentials testuser --client-key=testuser.key --client-certificate=testuser.crt --embed-certs=true
client-machine $ kubectl config set-cluster microk8s-cluster --server=https://VM2:16443 --certificate-authority=./ca.crt
client-machine $ kubectl config set-context microk8s --cluster=microk8s-cluster --user=testuser --namespace=default 
client-machine $ kubectl config use-context microk8s

動作検証

client-machine $ kubectl get pods -A
NAMESPACE     NAME                                     READY   STATUS    RESTARTS   AGE
kube-system   calico-kube-controllers-77bd7c5b-lm8w2   1/1     Running   0          8h
kube-system   coredns-864597b5fd-mp64v                 1/1     Running   0          8h
kube-system   calico-node-b84v4                        1/1     Running   0          8h
kube-system   calico-node-d2zjq                        1/1     Running   0          8h

参考