Opensourcetechブログ

OpensourcetechによるNGINX/Kubernetes/Zabbix/Neo4j/Linuxなどオープンソース技術に関するブログです。

RKE2(Rancher Kubernetes Engine)の構築

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など他の構築方法を経験しておくことは大事かなと思いました。

Opensourcetech by Takahiro Kujirai