概述 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 二进制文件
根据这个规律,我们可以有以下几种组合:
canal CNI:rke2-images 或者 rke2-images-core + rke2-images-canal
calico CNI:rke2-images-core + rke2-images-calico
cilium CNI:rke2-images-core + rke2-images-cilium
其中 rke2 二进制文件是一定要下载的。
基于镜像仓库的离线安装方法 这种方法只需要将镜像导入到本地的私有镜像仓库中,例如 Harbor 镜像仓库,后续创建节点都可以使用这个镜像仓库下载镜像。
导入镜像 首先根据我们需要安装的 CNI选择对应的镜像包,这里以 canal 为例,我们直接下载 rke2-images.linux-amd64.tar.zst
和 rke2-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 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} 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 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-artifactswget 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-artifactsINSTALL_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: 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-artifactsINSTALL_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