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
ということで、(通常ユーザーで運用する場合は)大人しく起動オプションを使って権限を指定しましょう。
起動オプションと環境変数の指定方法
例としてドキュメントに載っている「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