zaki work log

作業ログやら生活ログやらなんやら

[K3s / Kubernetes] KUBECONFIGを通常ユーザーでも読めるように起動オプションを指定する

TL;DR

結論を先に書くとK3sデプロイ時に、以下のように--write-kubeconfig-modeオプションでモードを付与すればOK

curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644

K3sのKUBECONFIGファイル

K3sを特にオプションなしでデプロイした場合、KUBECONFIGファイルは/etc/rancher/k3s/k3s.yamlが使われる。
このファイルは以下の通り、デフォルトではrootのみが読み込み可能。

$ ls -l /etc/rancher/k3s/k3s.yaml
-rw------- 1 root root 2957 Jan  9 14:14 /etc/rancher/k3s/k3s.yaml

よって通常ユーザーだとK3sをデプロイしたホストでkubectlを実行しても以下の通り権限エラーとなる。

$ kubectl get node
WARN[0000] Unable to read /etc/rancher/k3s/k3s.yaml, please start server with --write-kubeconfig-mode to modify kube config permissions 
error: error loading config file "/etc/rancher/k3s/k3s.yaml": open /etc/rancher/k3s/k3s.yaml: permission denied

エラーメッセージに表示されているように、--write-kubeconfig-modeオプションを使うのが正解だけど、読み取り権限ということでchmodパーミッションを変更してみると…

$ sudo chmod 644 /etc/rancher/k3s/k3s.yaml
$ kubectl get node
NAME               STATUS   ROLES                  AGE     VERSION
oci-ap-a1-ubuntu   Ready    control-plane,master   3d16h   v1.25.4+k3s1

この通り使用可能になる。。。
ように見えるけど、実はこのファイル、K3sのサービス起動時に状態が復元(再作成)されるため、リスタートしたりOSリブートしたりするとchmodで変更した内容が無くなり、通常ユーザーは再び読み取り不可になる。

$ ls -l /etc/rancher/k3s/k3s.yaml
-rw-r--r-- 1 root root 2957 Jan  9 14:14 /etc/rancher/k3s/k3s.yaml
$ sudo systemctl restart k3s.service
$ ls -l /etc/rancher/k3s/k3s.yaml
-rw------- 1 root root 2957 Jan 12 00:04 /etc/rancher/k3s/k3s.yaml

ということで、(通常ユーザーで運用する場合は)大人しく起動オプションを使って権限を指定しましょう。

起動オプションと環境変数の指定方法

docs.k3s.io

例としてドキュメントに載っている「flannelを使わずトークンでserverを登録する」は以下。(全て同じ処理)

curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="--flannel-backend none --token 12345" sh -s -
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --flannel-backend none" K3S_TOKEN=12345 sh -s -
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server" sh -s - --flannel-backend none
curl -sfL https://get.k3s.io | K3S_TOKEN=12345 sh -s - server --flannel-backend none
curl -sfL https://get.k3s.io | sh -s - --flannel-backend none --token 12345

起動オプションと環境変数一覧

server(コントロールプレーン)とagent(ワーカー)でそれぞれオプションがある。
本記事で紹介したKUBECONFIGのモードはserverのオプション。