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のオプション。

インストール済みのK3sの設定を変更したい場合

2023.11.28追記

サービス起動用のsystemdユニットファイルを修正する

対象ファイルは /etc/systemd/system/k3s.service
ファイル末尾にserverの起動コマンドの記載があるので、オプションを追加する。
こんな感じ。

ExecStart=/usr/local/bin/k3s \
    server \
      --write-kubeconfig-mode "0644"

ユニットファイルを更新したら、systemctl daemon-reload して systemctl restart する。
ちなみにインストール時にオプションしてる場合もユニットファイルに指定が記載される。

K3sの設定ファイルを作成・更新する

systemdのユニットファイルでの指定でなく、K3sの設定ファイルによる指定も可能。
インストール後の設定変更はこっちの方がわかりやすいかも。

設定ファイルは /etc/rancher/k3s/config.yaml で、デフォルト(初期状態)では無いはずなので新規に作成する。
内容は以下の通り。

write-kubeconfig-mode: "0644"

ファイルを作成・更新したら、systemctl restart k3sでリスタートすれば設定が反映される。
ファイルの書きっぷりについては以下のドキュメント参照。

docs: Configuration File