今更ながらRancher k3sを試してみた

投稿者: | 5月 19, 2022

今更なながらRancher k3sを試してみた。結果としては構築はかなり楽。シングルノードだけではなくマルチノードでもできる。

作成方針としては、Kubernetesバージョンは、1.22系で、ロードバランサー(metallb)とCSIストレージ(longhorn)も構築する。

参考にしたドキュメントは以下

https://rancher.com/docs/k3s/latest/en/

用意するもの

以下のホスト(物理マシン、仮想マシン、Raspberry Piを)を1台以上用意する。複数ホストを使う場合は、Machine-IDが被っていないものを利用(仮想の場合は注意)。アプリを立ち上げる場合は、そこそこスペックがあった方がいい。

  • CPU 1つ以上
  • RAM 最低2GB以上
  • HDD最低10GB x1 以上。残りはコンテナストレージ向け
  • Ubuntu 20.04.4 amd64/arm64/armhf (Linuxであればなんでも動く。Raspberry piの場合は、Raspberry OSでも多分動く)
  • Metallbの使うIPアドレス範囲。ホストのIPアドレスと同じセグメントで16ぐらい。

2台以上用意した場合は、Workerノードとして利用。Masterノードは、Workerノードとしても動作。(3ノードをとして作るのであれば、4ノードではなく、3ノードでいい)

OSの設定

OSの制限は特になさそう。dockerなどのインストールも不要。

各ホストでHostsファイルを書いておく。

192.168.19.3 k3s-master.k8slab.internal k3s-master
192.168.19.4 k3s-worker1.k8slab.internal k3s-worker1
192.168.19.5 k3s-worker2.k8slab.internal k3s-worker2

Raspberry PIの場合は、/boot/cmdline.txt にcgroup_enable=cpuset を追加しておく必要があるらしい。

 

MasterあるいはSingleノードを作成

早速、Masterノードを作る。重要なのは以下の太字の行。それだけで構築が完了する。servicelbがk3sについているのだが、Metallbとバッティングしそうなので外した。また、jqとnfs-commonは、longhornで必要なので、事前に入れておく。

apt -y install jq nfs-common ; apt clean
curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL=v1.22 INSTALL_K3S_EXEC="--disable servicelb" sh -
kubectl completion bash > /etc/bash_completion.d/kubectl
mkdir -p ~/.kube
cp /etc/rancher/k3s/k3s.yaml ~/.kube/config

#Workerを追加する場合は、以下の内容をメモしておく。
cat /var/lib/rancher/k3s/server/node-token

 

Workerノードを追加する場合は、Workerノードで以下を実行

apt -y install jq nfs-common ; apt clean
curl -sfL https://get.k3s.io | INSTALL_K3S_CHANNEL=v1.22 K3S_URL=https://k3s-master:6443 K3S_TOKEN=<Masterノードのトークン> sh -

構築後の設定

以降の操作はMasterノードのみで行う。もうworkerノードを触ることはない。

ロードバランサーの作成

IPRANGEにロードバランサーが使うIPの範囲を記載

IPRANGE="192.168.19.16-192.168.19.32"
METALLBVER=0.12.1
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v${METALLBVER}/manifests/namespace.yaml
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v${METALLBVER}/manifests/metallb.yaml
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- ${IPRANGE}
EOF

CSIストレージ (longhorn)の作成

シングルノードだとlocal-hostpathが使えるがマルチノードだとlonghornが便利。もちろんシングルノードでも利用できる。

参考にしたドキュメントは以下

https://longhorn.io/docs/1.2.4/

kubectl patch storageclass local-path -p '{"metadata": {"annotations":{"storageclass.kubernetes.io/is-default-class":"false"}}}'
LONGHORNVER=1.2.4
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/v${LONGHORNVER}/deploy/longhorn.yaml

#CSI Snapshotを使いたい場合
SNAPSHOTTERVER=4.0.1
kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v${SNAPSHOTTERVER}/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v${SNAPSHOTTERVER}/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
kubectl create -f https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v${SNAPSHOTTERVER}/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
curl -OL https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v${SNAPSHOTTERVER}/deploy/kubernetes/snapshot-controller/rbac-snapshot-controller.yaml
sed -i -e "s/namespace: default/namespace: kube-system/g" rbac-snapshot-controller.yaml
kubectl create -f rbac-snapshot-controller.yaml
rm -rf rbac-snapshot-controller.yaml
curl -OL https://raw.githubusercontent.com/kubernetes-csi/external-snapshotter/v${SNAPSHOTTERVER}/deploy/kubernetes/snapshot-controller/setup-snapshot-controller.yaml
sed -i -e "s/namespace: default/namespace: kube-system/g" setup-snapshot-controller.yaml
kubectl create -f setup-snapshot-controller.yaml
rm setup-snapshot-controller.yaml
cat <<EOF | kubectl apply -f -
kind: VolumeSnapshotClass
apiVersion: snapshot.storage.k8s.io/v1
metadata:
annotations:
snapshot.storage.kubernetes.io/is-default-class: "true"
name: longhorn
driver: driver.longhorn.io
deletionPolicy: Delete
EOF

これで、Loadbalancerが使えて、共有ストレージを持ったコンテナ環境ができた。ダッシュボードの展開などは、Kubernetesと一緒。

まだ、追加設定が必要でした。https://www.blog.slow-fire.net/2022/05/13/longhorn%e3%81%aecsi%e3%82%b9%e3%83%8a%e3%83%83%e3%83%97%e3%82%b7%e3%83%a7%e3%83%83%e3%83%88/

消したい場合は、Masterノードの場合は、k3s-uninstall.sh Workerノードの場合は、k3s-agent-uninstall.shを実行することでアンインストールされる。

コメントを残す