RKE2 离线安装教程

概述

RKE2 是 Rancher 的下一代 Kubernetes 发行版,其中 RKE2 内置嵌入式容器运行时 containerd,k8s 的系统组件(例如:Apiserver、etcd 等)由 kubelet 管理的静态 pod 启动。RKE2 官方提供了一键安装启动的脚本,但是这个安装过程需要全程联网拉取镜像。对于某些企业级环境可能是全程离线的状态,RKE2 提供了两种离线安装的方法。本文会介绍这两种安装方法。

环境

Env Version
Ubuntu 22.04
RKE2 v1.27.3+rke2r1

先决条件

  • 已初始化节点
  • 本地已部署好 Harbor 镜像仓库

文件说明

首先进入到 RKE2 的 release 页面获取相关离线介质文件。其中我们能看到每一个包都会有 tar.gz 和 tar.zst 是两种压缩格式,这两者内容是一样的,但是与 gzip 相比,Zstandard 支持更好的压缩比和更快的解压缩速度,所以包会小一些。

这里以 amd64 架构为例,主要文件说明如下:

文件 说明
rke2-images.linux-amd64.tar.zst / gz k8s + canal 镜像
rke2-images.linux-amd64.txt k8s + canal 镜像列表
rke2-images-calico.linux-amd64.tar.zst / gz calico 镜像
rke2-images-calico.linux-amd64.txt calico 镜像列表
rke2-images-canal.linux-amd64.tar.zst / gz canal 镜像
rke2-images-canal.linux-amd64.txt canal 镜像列表
rke2-images-cilium.linux-amd64.tar.zst / gz cilium 镜像
rke2-images-cilium.linux-amd64.txt cilium 镜像列表
rke2-images-core.linux-amd64.tar.zst / gz k8s 镜像
rke2-images-core.linux-amd64.txt k8s 镜像列表
rke2.linux-amd64 / rke2.linux-amd64.tar.gz rke2 二进制文件

根据这个规律,我们可以有以下几种组合:

  1. canal CNI:rke2-images 或者 rke2-images-core + rke2-images-canal
  2. calico CNI:rke2-images-core + rke2-images-calico
  3. cilium CNI:rke2-images-core + rke2-images-cilium

其中 rke2 二进制文件是一定要下载的。

基于镜像仓库的离线安装方法

这种方法只需要将镜像导入到本地的私有镜像仓库中,例如 Harbor 镜像仓库,后续创建节点都可以使用这个镜像仓库下载镜像。

导入镜像

首先根据我们需要安装的 CNI选择对应的镜像包,这里以 canal 为例,我们直接下载 rke2-images.linux-amd64.tar.zstrke2-images.linux-amd64.txt 两个文件。

1
2
wget https://github.com/rancher/rke2/releases/download/v1.27.3%2Brke2r1/rke2-images.linux-amd64.txt
wget https://github.com/rancher/rke2/releases/download/v1.27.3%2Brke2r1/rke2-images.linux-amd64.tar.zst

选择一个带有 Docker 环境的主机,并且能够访问到 Harbor 镜像仓库,将刚刚下载的镜像通过 Docker 命令导入进来。

1
docker load -i rke2-images.linux-amd64.tar.zst

查看镜像列表:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cat rke2-images.linux-amd64.txt 
docker.io/rancher/rke2-runtime:v1.27.3-rke2r1
docker.io/rancher/hardened-kubernetes:v1.27.3-rke2r1-build20230614
docker.io/rancher/hardened-coredns:v1.10.1-build20230607
docker.io/rancher/hardened-cluster-autoscaler:v1.8.6-build20230609
docker.io/rancher/hardened-dns-node-cache:1.22.20-build20230607
docker.io/rancher/hardened-etcd:v3.5.7-k3s1-build20230609
docker.io/rancher/hardened-k8s-metrics-server:v0.6.3-build20230607
docker.io/rancher/klipper-helm:v0.8.0-build20230510
docker.io/rancher/klipper-lb:v0.4.4
docker.io/rancher/mirrored-pause:3.6
docker.io/rancher/mirrored-ingress-nginx-kube-webhook-certgen:v20230312-helm-chart-4.5.2-28-g66a760794
docker.io/rancher/nginx-ingress-controller:nginx-1.6.4-hardened5
docker.io/rancher/rke2-cloud-provider:v1.26.3-build20230608
docker.io/rancher/mirrored-sig-storage-snapshot-controller:v6.2.1
docker.io/rancher/mirrored-sig-storage-snapshot-validation-webhook:v6.2.1
docker.io/rancher/hardened-calico:v3.25.1-build20230607
docker.io/rancher/hardened-flannel:v0.22.0-build20230612

根据这个镜像列表中命名的格式,我们可以通过如下脚本实现一键上传到本地镜像仓库中:

1
2
3
4
5
6
7
8
9
10
HARBOR_URL=harbor.zerchin.xyz

## login
docker login $HARBOR_URL

for i in `cat rke2-images.linux-amd64.txt | awk -F 'docker.io/' '{print $2}'`
do
docker tag $i $HARBOR_URL/$i
docker push $HARBOR_URL/$i
done

如果这个 Docker 主机可以同时访问外网和本地 Harbor 镜像仓库,可以用下面这个脚本一键上传:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#!/bin/bash
HARBOR_URL=harbor.zerchin.xyz
RKE2_VERSION=v1.27.3+rke2r1
DEL_IMG=${DEL_IMG:-true}

## login
docker login $HARBOR_URL

wget https://github.com/rancher/rke2/releases/download/${RKE2_VERSION}/rke2-images.linux-amd64.txt
wget https://github.com/rancher/rke2/releases/download/${RKE2_VERSION}/rke2-images.linux-amd64.tar.zst

docker load -i rke2-images.linux-amd64.tar.zst

for i in `cat rke2-images.linux-amd64.txt | awk -F 'docker.io/' '{print $2}'`
do
docker tag $i $HARBOR_URL/$i
docker push $HARBOR_URL/$i
done

## custom cluster
RKE2_TAG=$(echo $RKE2_VERSION | sed 's/\+/\-/' )
docker pull rancher/system-agent-installer-rke2:$RKE2_TAG
docker tag rancher/system-agent-installer-rke2:$RKE2_TAG $HARBOR_URL/rancher/system-agent-installer-rke2:$RKE2_TAG
docker push $HARBOR_URL/rancher/system-agent-installer-rke2:$RKE2_TAG
docker rmi rancher/system-agent-installer-rke2:$RKE2_TAG
docker rmi $HARBOR_URL/rancher/system-agent-installer-rke2:$RKE2_TAG

if [[ $DEL_IMG == true ]]
then
for i in `cat rke2-images.linux-amd64.txt | awk -F 'docker.io/' '{print $2}'`
do
docker rmi $i
docker rmi $HARBOR_URL/$i
done

rm -f rke2-images.linux-amd64.txt rke2-images.linux-amd64.tar.zst
fi

rke2 二进制文件下载

下载 rke2 二进制文件和 install 脚本,并传到所有节点上:

1
2
3
4
5
mkdir /root/rke2-artifacts
cd /root/rke2-artifacts
wget https://github.com/rancher/rke2/releases/download/v1.27.3%2Brke2r1/rke2.linux-amd64.tar.gz
wget https://github.com/rancher/rke2/releases/download/v1.27.3%2Brke2r1/sha256sum-amd64.txt
curl -sfL https://get.rke2.io --output install.sh

Server 节点安装

安装 rke2 工具,通过 INSTALL_RKE2_ARTIFACT_PATH环境变量指定 rke2 二进制文件路径:

1
2
cd /root/rke2-artifacts
INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-artifacts sh install.sh

配置私有镜像仓库地址

如果只需要 RKE2 系统组件的镜像使用本地镜像仓库,可以这么配置:

1
2
3
4
5
6
mkdir -p /etc/rancher/rke2

cat << EOF > /etc/rancher/rke2/config.yaml
system-default-registry: harbor.zerchin.xyz
token: customtoken123456
EOF

如果镜像仓库需要认证或者非权威证书,需要添加这个文件:

1
2
3
4
5
6
7
8
9
10
configs:
"harbor.zerchin.xyz":
auth:
username: xxxxxx
password: xxxxxx
tls:
cert_file: # 证书
key_file: # 密钥
ca_file: # CA证书
insecure_skip_verify: # 是否跳过证书检查

如果希望后续所有的 docker.io 镜像都是使用本地镜像仓库,可以这么配置:

1
2
3
4
5
mirrors:
docker.io:
endpoint:
- "harbor.zerchin.xyz"
EOF

启动 rke2-server

1
2
systemctl enable rke2-server
systemctl start rke2-server

等待 rke2-server服务启动成功即可,如果服务启动失败,可以执行这个命令查看日志:

1
journalctl -xef -u rke2-server

Agent 安装

安装 rke2 工具,通过 INSTALL_RKE2_ARTIFACT_PATH环境变量指定 rke2 二进制文件路径,同时通过INSTALL_RKE2_TYPE指定当前节点为 agent 节点:

1
2
cd /root/rke2-artifacts
INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-artifacts INSTALL_RKE2_TYPE="agent" sh install.sh

配置私有镜像仓库地址

与 Server 节点配置基本一致,唯一多的配置是需要通过server参数指定 Server 节点:

1
2
3
4
5
6
7
mkdir -p /etc/rancher/rke2

cat << EOF > /etc/rancher/rke2/config.yaml
system-default-registry: harbor.zerchin.xyz
token: customtoken123456
server: https://<server>:9345
EOF

启动 rke2-agent

1
2
systemctl enable rke2-agent
systemctl start rke2-agent

基于Tallball的离线安装方法

如果本地没有私有镜像仓库,或者只是想临时启动一个 RKE2 集群,可以使用这种方法进行安装。但是这个方法需要在每个节点上都上传离线镜像包。

下载离线介质包

在所有节点上都下载下面这些离线镜像介质包。

1
2
3
4
5
6
RKE2_VERSION=v1.27.3+rke2r1
mkdir /root/rke2-artifacts && cd /root/rke2-artifacts/
wget https://github.com/rancher/rke2/releases/download/${RKE2_VERSION}/rke2-images.linux-amd64.tar.zst
wget https://github.com/rancher/rke2/releases/download/${RKE2_VERSION}/rke2.linux-amd64.tar.gz
wget https://github.com/rancher/rke2/releases/download/${RKE2_VERSION}/sha256sum-amd64.txt
curl -sfL https://get.rke2.io --output install.sh

Server 节点安装

配置token:

1
2
3
4
5
mkdir -p /etc/rancher/rke2

cat << EOF > /etc/rancher/rke2/config.yaml
token: customtoken123456
EOF

启动 rke2-server

1
2
systemctl enable rke2-server
systemctl start rke2-server

等待 rke2-server服务启动成功即可,如果服务启动失败,可以执行这个命令查看日志:

1
journalctl -xef -u rke2-server

Agent 节点安装

配置 token 和 server 参数:

1
2
3
4
5
6
mkdir -p /etc/rancher/rke2

cat << EOF > /etc/rancher/rke2/config.yaml
token: customtoken123456
server: https://<server>:9345
EOF

启动 rke2-server

1
2
systemctl enable rke2-agent
systemctl start rke2-agent

tips

使用 Tallball 方式安装的 RKE2 集群,当我们修改 rke2 的config.yaml文件里的参数时,在重启 rke2 服务时会看到这段日志:

1
level=info msg="Importing images from /var/lib/rancher/rke2/agent/images/rke2-images.linux-amd64.tar.zst"

原因是由于 RKE2 的默认扫描机制,会在每次启动 rke2 服务时,扫描 /var/lib/rancher/rke2/agent/images/ 这个路径下的镜像文件加载镜像。当使用 Tallball 的方式进行安装时,会将 rke2-images.linux-amd64.tar.zst文件放置到该目录下进行加载(Tallball 加载镜像的原理)。

为了防止每次重启 rke2 服务都去加载全量的镜像,可以手动把这个镜像文件删除掉即可。

1
rm -f /var/lib/rancher/rke2/agent/images/rke2-images.linux-amd64.tar.zst