今更なながら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と一緒。
消したい場合は、Masterノードの場合は、k3s-uninstall.sh Workerノードの場合は、k3s-agent-uninstall.shを実行することでアンインストールされる。