zaki work log

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

オフラインK3sクラスタでworkerノード追加

少し前に実施したシングルノード構成の「オフライン環境へのK3sインストール」に、workerノードを追加する。
環境は引き続きインターネット接続のないオフライン環境。

zaki-hmkc.hatenablog.com

手順はAir-Gap Installの通りで大丈夫。

docs.k3s.io

構成 (再掲)

  • ホストOS: Ubuntu 22.04.03 LTS
  • K3s: v1.29.2
  • プライベートコンテナレジストリ: ローカルのGitLab使用
  • ネットワークはcontrol planeと同じサブネットにいて、control planeともプライベートレジストリとも直接疎通がある構成 (インターネットには接続できない)

root@k3s-offline2:~# ip r
default via 172.29.0.1 dev eth0 proto static 
172.29.0.0/24 dev eth0 proto kernel scope link src 172.29.0.78

control planeは以下

root@k3s-offline1:~# ip r
default via 172.29.0.1 dev eth0 proto static 
10.42.0.0/24 dev cni0 proto kernel scope link src 10.42.0.1 
172.29.0.0/24 dev eth0 proto kernel scope link src 172.29.0.77 

イメージの準備

これはcontrol planeを構築したときのものをそのまま使用。

プライベートレジストリのリダイレクト設定

これはcontrol planeノード同様に各ノードで実施。
以下の内容の/etc/rancher/k3s/registries.yamlを作成する。

mirrors:
  docker.io:
    endpoint:
      - "https://gitlab.example.jp:25000"
    rewrite:
      "^rancher/(.*)": "zaki/images/$1"
configs:
  "gitlab.example.jp:25000":
    tls:
      insecure_skip_verify: true

インストールスクリプトの配置

これもcontrol plane構築のものをそのまま使用。
構築対象ノードのどこかに配置しておく。
workerの台数が多い場合はIPリーチするwebサーバーを立てるのが楽かもしれない。(が、今回はローカル配置で実施)

https://get.k3s.io

実行バイナリの配置

同じくcontrol plane構築の(ry
追加するノードの/usr/local/bin/k3sへ配置。

zaki@k3s-offline2:~$ sudo cp k3s /usr/local/bin/k3s 
zaki@k3s-offline2:~$ sudo chmod 755 /usr/local/bin/k3s
zaki@k3s-offline2:~$ k3s --version
k3s version v1.29.2+k3s1 (86f10213)
go version go1.21.7

トークン確認

クラスターへ参加するためのトークンをcontrol planeノードで確認。
ここはオンラインの場合の手順と同様。

root@k3s-offline1:~# cat /var/lib/rancher/k3s/server/token

内容をworkerノードで環境変数あたりにセットしておく。

インストール

イメージ、バイナリ、インストールスクリプトトークンの準備ができたら、以下のオプションを付与してインストールスクリプトを実行する。

  • INSTALL_K3S_SKIP_DOWNLOAD=true (ダウンロード処理をskip / control planeと同様)
  • K3S_URL=control planeのアドレス (構築済みcontrol planeを指定 / オンライン時の手順と同様)
  • K3S_TOKEN=上記で確認したトークン値 (クラスター参加用トークン / オンライン時の手順と同様)
zaki@k3s-offline2:~$ INSTALL_K3S_SKIP_DOWNLOAD=true K3S_URL=https://172.29.0.77:6443 K3S_TOKEN=${K3S_TOKEN} ./install.sh 
[INFO]  Skipping k3s download and verify
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-agent-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s-agent.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s-agent.service
[INFO]  systemd: Enabling k3s-agent unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s-agent.service → /etc/systemd/system/k3s-agent.service.
[INFO]  systemd: Starting k3s-agent

比較的すぐ完了し、get nodeでノードが追加されることを確認できる。

root@k3s-offline1:~# kubectl get node
NAME           STATUS   ROLES                  AGE   VERSION
k3s-offline1   Ready    control-plane,master   50d   v1.29.2+k3s1
k3s-offline2   Ready    <none>                 4s    v1.29.2+k3s1

root@k3s-offline1:~# kubectl get pod -A -o wide
NAMESPACE     NAME                                      READY   STATUS      RESTARTS       AGE    IP           NODE           NOMINATED NODE   READINESS GATES
kube-system   helm-install-traefik-crd-xsblz            0/1     Completed   0              50d    <none>       k3s-offline1   <none>           <none>
kube-system   helm-install-traefik-gvq48                0/1     Completed   1              50d    <none>       k3s-offline1   <none>           <none>
kube-system   svclb-sample-http-4cda7872-mdm9q          1/1     Running     6 (25h ago)    50d    10.42.0.58   k3s-offline1   <none>           <none>
kube-system   svclb-traefik-10a1b448-6h6c9              2/2     Running     12 (25h ago)   50d    10.42.0.55   k3s-offline1   <none>           <none>
kube-system   traefik-f4564c4f4-gg6mv                   1/1     Running     6 (25h ago)    50d    10.42.0.62   k3s-offline1   <none>           <none>
kube-system   coredns-6799fbcd5-vvxrq                   1/1     Running     4 (25h ago)    46d    10.42.0.59   k3s-offline1   <none>           <none>
kube-system   local-path-provisioner-6c86858495-qznr7   1/1     Running     12 (25h ago)   50d    10.42.0.61   k3s-offline1   <none>           <none>
kube-system   metrics-server-67c658944b-r655h           1/1     Running     12 (25h ago)   50d    10.42.0.60   k3s-offline1   <none>           <none>
sample-app    sample-http-5cd4944c69-6knfd              1/1     Running     2 (46d ago)    50d    10.42.0.56   k3s-offline1   <none>           <none>
sample-app    sample-http-5cd4944c69-l7xnb              1/1     Running     2 (46d ago)    50d    10.42.0.57   k3s-offline1   <none>           <none>
kube-system   svclb-traefik-10a1b448-8vhz9              2/2     Running     0              4m5s   10.42.1.3    k3s-offline2   <none>           <none>
kube-system   svclb-sample-http-4cda7872-f6jzs          1/1     Running     0              4m5s   10.42.1.2    k3s-offline2   <none>           <none>

「オフライン構築」と「workerノードの追加」をミックスした手順なので、それぞれ実施経験があれば簡単に構築できる。