LinuCエヴァンジェリスト・Open Source Summit Japanボランティアリーダーの鯨井貴博@opensourcetechです。
はじめに
今回は、RKE2によるkubernetesクラスターの構築をしてみます。
RKE2とは
RKE2とは、Rancherの次世代Kubernetes Engineです。
https://docs.rke2.io/
RKE1との違いでいうと、
RKE1ではDockerがCRI(Container Runtime Interface)ランタイムとなっていましたが、RKE2ではcontainerdとなりました。
RKE2構築の前提条件
前提条件は以下に載っており、
今回はUbuntu22.04をOSとして使っています。
インストーラーでUbuntu Server(minimized)を選択しています。
https://docs.rke2.io/install/requirements
構成としては、
Kubernetes ClusterのMaster Node(RKE2だとServer Nodeと呼ぶ)が1台、
Worker Node(RKE2だとAgent Nodeと呼ぶが2台としています。
Server NodeにはCPU 2cores・メモリー4GB、Agent NodeはCPUは2cores・メモリー2GBとしました。
Server Nodeの構築
以下の手順(Quick Start)に従って構築していきます。
https://docs.rke2.io/install/quickstart
実施する内容はとても簡単です。
- rootになる
- インストールスクリプトの実施
- RKE2プログラム(rke2-server)の起動
kubeuser@rke2-1:~$ sudo su - root@rke2-1:~# curl -sfL https://get.rke2.io | sh - [INFO] finding release for channel stable [INFO] using v1.26.12+rke2r1 as release [INFO] downloading checksums at https://github.com/rancher/rke2/releases/download/v1.26.12+rke2r1/sha256sum-amd64.txt [INFO] downloading tarball at https://github.com/rancher/rke2/releases/download/v1.26.12+rke2r1/rke2.linux-amd64.tar.gz [INFO] verifying tarball [INFO] unpacking tarball file to /usr/local root@rke2-1:~# systemctl status rke2-server ● rke2-server.service - Rancher Kubernetes Engine v2 (server) Loaded: loaded (/usr/local/lib/systemd/system/rke2-server.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: https://github.com/rancher/rke2#readme root@rke2-1:~# systemctl enable rke2-server Created symlink /etc/systemd/system/multi-user.target.wants/rke2- server.service → /usr/local/lib/systemd/system/rke2-server.service. root@rke2-1:~# systemctl start rke2-server root@rke2-1:~# systemctl status rke2-server ● rke2-server.service - Rancher Kubernetes Engine v2 (server) Loaded: loaded (/usr/local/lib/systemd/system/rke2-server.service; enabled; vendor preset: enabled) Active: active (running) since Wed 2024-01-17 09:16:14 UTC; 11s ago Docs: https://github.com/rancher/rke2#readme Process: 2076 ExecStartPre=/bin/sh -xc ! /usr/bin/systemctl is-enabled --quiet nm-cloud-setup.service (code=exited, status=0/SUCCESS) Process: 2078 ExecStartPre=/sbin/modprobe br_netfilter (code=exited, status=0/SUCCESS) Process: 2080 ExecStartPre=/sbin/modprobe overlay (code=exited, status=0/SUCCESS) Main PID: 2091 (rke2) Tasks: 107 Memory: 1.8G CGroup: /system.slice/rke2-server.service ├─2091 /usr/local/bin/rke2 server ├─2111 containerd -c /var/lib/rancher/rke2/agent/etc/containerd/config.toml -a /run/k3s/containerd/containerd.sock --state /run/k3s/conta> ├─2182 kubelet --volume-plugin-dir=/var/lib/kubelet/volumeplugins --file-check-frequency=5s --sync-frequency=30s --address=0.0.0.0 --anon> ├─2287 /var/lib/rancher/rke2/data/v1.26.12-rke2r1-3a06874196a9/bin/containerd-shim-runc-v2 -namespace k8s.io -id 0ee30077b542097bd4155f22> ├─2382 /var/lib/rancher/rke2/data/v1.26.12-rke2r1-3a06874196a9/bin/containerd-shim-runc-v2 -namespace k8s.io -id fb2ea99b1b96b510a5cad89b> ├─2503 /var/lib/rancher/rke2/data/v1.26.12-rke2r1-3a06874196a9/bin/containerd-shim-runc-v2 -namespace k8s.io -id cb1fd91a663b27f0ddc99060> ├─2507 /var/lib/rancher/rke2/data/v1.26.12-rke2r1-3a06874196a9/bin/containerd-shim-runc-v2 -namespace k8s.io -id 923f119bc02283713d8990d5> ├─2735 /var/lib/rancher/rke2/data/v1.26.12-rke2r1-3a06874196a9/bin/containerd-shim-runc-v2 -namespace k8s.io -id f03148584e0631bcb9c87ee2> └─2902 /var/lib/rancher/rke2/data/v1.26.12-rke2r1-3a06874196a9/bin/containerd-shim-runc-v2 -namespace k8s.io -id 7e8b8ad2d50c713a4100bccc> Jan 17 09:16:16 rke2-1 rke2[2091]: time="2024-01-17T09:16:16Z" level=info msg="Running kube-proxy --cluster-cidr=10.42.0.0/16 --conntrack-max-per-core> Jan 17 09:16:16 rke2-1 rke2[2091]: time="2024-01-17T09:16:16Z" level=error msg="error syncing 'kube-system/rke2-canal': handler helm-controller-chart-> Jan 17 09:16:16 rke2-1 rke2[2091]: time="2024-01-17T09:16:16Z" level=info msg="Reconciling snapshot ConfigMap data" Jan 17 09:16:17 rke2-1 rke2[2091]: time="2024-01-17T09:16:17Z" level=info msg="Labels and annotations have been set successfully on node: rke2-1" Jan 17 09:16:17 rke2-1 rke2[2091]: time="2024-01-17T09:16:17Z" level=error msg="error syncing 'kube-system/rke2-coredns': handler helm-controller-char> Jan 17 09:16:17 rke2-1 rke2[2091]: time="2024-01-17T09:16:17Z" level=error msg="error syncing 'kube-system/rke2-metrics-server': handler helm-controll> Jan 17 09:16:17 rke2-1 rke2[2091]: time="2024-01-17T09:16:17Z" level=error msg="error syncing 'kube-system/rke2-ingress-nginx': handler helm-controlle> Jan 17 09:16:18 rke2-1 rke2[2091]: time="2024-01-17T09:16:18Z" level=error msg="error syncing 'kube-system/rke2-snapshot-controller-crd': handler helm> Jan 17 09:16:20 rke2-1 rke2[2091]: time="2024-01-17T09:16:20Z" level=error msg="error syncing 'kube-system/rke2-snapshot-controller': handler helm-con> Jan 17 09:16:20 rke2-1 rke2[2091]: time="2024-01-17T09:16:20Z" level=error msg="error syncing 'kube-system/rke2-snapshot-validation-webhook': handler >
なお、kubectlコマンドはインストールされているのですが、
PATHを通るなど一手間必要になります。
root@rke2-1:~# kubectl get nodes Command 'kubectl' not found, but can be installed with: snap install kubectl
kubectlは "/var/lib/rancher/rke2/bin/kubectl"、
認証に使用するコンフィグは "/etc/rancher/rke2/rke2.yaml"にあります。
確認の為にkubectlを実施してみます。
root@rke2-1:~# /var/lib/rancher/rke2/bin/kubectl get nodes --kubeconfig /etc/rancher/rke2/rke2.yaml NAME STATUS ROLES AGE VERSION rke2-1 Ready control-plane,etcd,master 3m32s v1.26.12+rke2r1 root@rke2-1:~# /var/lib/rancher/rke2/bin/kubectl get pods --all-namespaces --kubeconfig /etc/rancher/rke2/rke2.yaml NAMESPACE NAME READY STATUS RESTARTS AGE kube-system cloud-controller-manager-rke2-1 1/1 Running 0 3m4s kube-system etcd-rke2-1 1/1 Running 0 3m3s kube-system helm-install-rke2-canal-rzrkd 0/1 Completed 0 3m48s kube-system helm-install-rke2-coredns-m5psq 0/1 Completed 0 3m48s kube-system helm-install-rke2-ingress-nginx-b859h 0/1 Completed 0 3m48s kube-system helm-install-rke2-metrics-server-rjkv8 0/1 Completed 0 3m48s kube-system helm-install-rke2-snapshot-controller-bg22h 0/1 Completed 1 3m48s kube-system helm-install-rke2-snapshot-controller-crd-qchjk 0/1 Completed 0 3m48s kube-system helm-install-rke2-snapshot-validation-webhook-4p9fk 0/1 Completed 0 3m48s kube-system kube-apiserver-rke2-1 1/1 Running 0 3m25s kube-system kube-controller-manager-rke2-1 1/1 Running 0 3m9s kube-system kube-proxy-rke2-1 1/1 Running 0 3m38s kube-system kube-scheduler-rke2-1 1/1 Running 0 3m7s kube-system rke2-canal-n4nlz 2/2 Running 0 3m19s kube-system rke2-coredns-rke2-coredns-565dfc7d75-bpldb 1/1 Running 0 3m20s kube-system rke2-coredns-rke2-coredns-autoscaler-6c48c95bf9-fcn8b 1/1 Running 0 3m20s kube-system rke2-ingress-nginx-controller-5wbsf 1/1 Running 0 2m5s kube-system rke2-metrics-server-c9c78bd66-ndtkb 1/1 Running 0 2m29s kube-system rke2-snapshot-controller-6f7bbb497d-9r2bs 1/1 Running 0 2m21s kube-system rke2-snapshot-validation-webhook-65b5675d5c-tgcvr 1/1 Running 0 2m27s
確かに、バージョン"v1.26.12+rke2r1"のkubernetesが起動しています。
このままだとコマンド実行が面倒なので、
kubectlのパス・認証設定ファイルを環境変数として登録しておきます。
※再起動時にも自動で読み込むようにしておきます。
root@rke2-1:~# export KUBECONFIG=/etc/rancher/rke2/rke2.yaml PATH=$PATH:/var/lib/rancher/rke2/bin root@rke2-1:~# vi .bashrc root@rke2-1:~# kubectl get nodes NAME STATUS ROLES AGE VERSION rke2-1 Ready control-plane,etcd,master 26m v1.26.12+rke2r1
Agent Nodeの構築
Agent Nodeも同様にインストールスクリプトなどを実施すればOKです。
なお、Server Nodeと連携するためにServer NodeのIPアドレスとトークン情報が必要になるので確認しておきます。
root@rke2-1:~# cat /var/lib/rancher/rke2/server/node-token K10131232ba739cf6b7644d5589c1bc80c097e99ad48b072d5e6c8e115b3ab697df::server:17dc88051d1b1887ffd7df8218dec969
では、スクリプトの実施など。
kubeuser@rke2-2:~$ sudo su - [sudo] password for kubeuser: root@rke2-2:~# curl -sfL https://get.rke2.io | INSTALL_RKE2_TYPE="agent" sh - [INFO] finding release for channel stable [INFO] using v1.26.12+rke2r1 as release [INFO] downloading checksums at https://github.com/rancher/rke2/releases/download/v1.26.12+rke2r1/sha256sum-amd64.txt [INFO] downloading tarball at https://github.com/rancher/rke2/releases/download/v1.26.12+rke2r1/rke2.linux-amd64.tar.gz [INFO] verifying tarball [INFO] unpacking tarball file to /usr/local root@rke2-2:~# systemctl enable rke2-agent.service Created symlink /etc/systemd/system/multi-user.target.wants/rke2-agent.service → /usr/local/lib/systemd/system/rke2-agent.service. root@rke2-2:~# systemctl status rke2-agent ● rke2-agent.service - Rancher Kubernetes Engine v2 (agent) Loaded: loaded (/usr/local/lib/systemd/system/rke2-agent.service; enabled; vendor preset: enabled) Active: inactive (dead) Docs: https://github.com/rancher/rke2#readme root@rke2-2:~# mkdir -p /etc/rancher/rke2/ root@rke2-2:~# vim /etc/rancher/rke2/config.yaml root@rke2-2:~# cat /etc/rancher/rke2/config.yaml server: https://192.168.1.63:9345 token: K10131232ba739cf6b7644d5589c1bc80c097e99ad48b072d5e6c8e115b3ab697df::server:17dc88051d1b1887ffd7df8218dec969 root@rke2-2:~# systemctl start rke2-agent
もう一台のAgent Nodeも同様に構築します。
すると以下のようにRKE2によるKubernetes Clusterの完成です。
root@rke2-1:~# kubectl get nodes NAME STATUS ROLES AGE VERSION rke2-1 Ready control-plane,etcd,master 26m v1.26.12+rke2r1 rke2-2 Ready <none> 17m v1.26.12+rke2r1 rke2-3 Ready <none> 13m v1.26.12+rke2r1
おわりに
今回はRKE2によるKuberneter Cluster構築をやってみましたが、
とても楽であるというのが印象です。
以前kubeadmを使う構築をしましたが、
- 実施コマンドがかなり少なくてよい
- 構築にかかる時間もかなり短い
というのがうれしいですね。
DualStack(IPv4 & IPv6)のkubernetesクラスター構築(v1.26.00・ubuntu22.04)
逆にいうと 楽に構築できる = インストールの詳細が不明 となるので、
Kubernetes環境のトラブルシュートやカスタマイズの為に一度kubeadmなど他の構築方法を経験しておくことは大事かなと思いました。