RKE2 离线部署 Kubernetes 集群实践:Docker + Harbor + RKE2
本文记录一次在内网环境中离线部署 RKE2 Kubernetes 集群的过程。集群包含 1 台 Master 节点和 2 台 Worker 节点,同时使用 Harbor 作为本地镜像仓库。
一、环境规划
| 主机角色 | 主机名 | IP 地址 | 说明 |
|---|---|---|---|
| Master | rke2-master |
10.1.2.100 |
RKE2 Server 节点,同时作为 Harbor / dockerhub.local |
| Worker 1 | rke2-worker-1 |
10.1.2.101 |
RKE2 Agent 节点 |
| Worker 2 | rke2-worker-2 |
10.1.2.102 |
RKE2 Agent 节点 |
本地镜像仓库地址:
dockerhub.local
离线安装包包括:
docker-offline.tgz
harbor-offline-installer-v2.14.4.tgz
rke2-offline.tgz
二、所有节点通用初始化操作
以下操作需要在三台服务器上都执行。
1. 设置主机名
Master 节点执行:
hostnamectl set-hostname rke2-master
Worker 1 节点执行:
hostnamectl set-hostname rke2-worker-1
Worker 2 节点执行:
hostnamectl set-hostname rke2-worker-2
2. 配置 hosts 解析
用于内网环境下解析 Master、Worker 和 Harbor 地址。
cat >> /etc/hosts <<'EOF'
10.1.2.100 dockerhub.local rke2-master
10.1.2.101 rke2-worker-1
10.1.2.102 rke2-worker-2
EOF
3. 加载内核模块
Kubernetes 网络需要依赖 overlay 和 br_netfilter 模块。
cat >/etc/modules-load.d/rke2.conf <<'EOF'
overlay
br_netfilter
EOF
modprobe overlay
modprobe br_netfilter
4. 配置内核参数
开启桥接流量转发和 IPv4 转发能力。
cat >/etc/sysctl.d/99-k8s.conf <<'EOF'
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF
sysctl --system
5. 关闭防火墙
如果环境中启用了 ufw,建议先关闭,避免端口被拦截。
k8s依赖iptables进行防火墙策略处理,如没有,需要按照各个系统安装方式进行安装,如是nftables,也需要安装iptables-nft以支持nft的兼容层iptables命令
systemctl disable --now ufw 2>/dev/null || true
三、Master 节点操作
以下操作只在 10.1.2.100 / rke2-master 上执行。
1. 下载离线安装包
从 OSS 下载 Docker、Harbor 和 RKE2 离线安装包。
ossutil cp oss://zlose-docker-image/k8s-offline/docker-offline.tgz .
ossutil cp oss://zlose-docker-image/k8s-offline/harbor-offline-installer-v2.14.4.tgz .
ossutil cp oss://zlose-docker-image/k8s-offline/rke2-offline.tgz .
2. 解压离线安装包
mkdir -p docker-offline rke2-offline harbor-offline
tar -xf docker-offline.tgz -C docker-offline/
tar -xf rke2-offline.tgz -C rke2-offline/
tar -xf harbor-offline-installer-v2.14.4.tgz -C harbor-offline/
3. 配置 Docker 访问 Harbor
将 dockerhub.local 配置为非 HTTPS 的本地镜像仓库。
cat > /etc/docker/daemon.json <<'EOF'
{
"insecure-registries": ["dockerhub.local"]
}
EOF
systemctl daemon-reload
systemctl restart docker
4. 登录 Harbor
docker login dockerhub.local -u admin -p 'Harbor@123'
5. 准备 RKE2 离线镜像
RKE2 启动时会自动从该目录加载离线镜像包。
mkdir -p /var/lib/rancher/rke2/agent/images
cp /root/rke2-offline/rke2-images.linux-amd64.tar.zst \
/var/lib/rancher/rke2/agent/images/
6. 配置 RKE2 镜像仓库
让 RKE2 优先从本地 Harbor 拉取镜像。
mkdir -p /etc/rancher/rke2
cat >/etc/rancher/rke2/registries.yaml <<'EOF'
mirrors:
"dockerhub.local":
endpoint:
- "http://dockerhub.local"
EOF
7. 安装 RKE2 Server
INSTALL_RKE2_TYPE=server \
INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-offline \
sh /root/rke2-offline/install.sh
8. 生成集群 Token
Worker 节点加入集群时需要使用该 token。
rke2TOKEN=$(openssl rand -hex 32)
echo $rke2TOKEN
请记录输出的 token,后续 Worker 节点配置时需要使用。
9. 配置 RKE2 Server
mkdir -p /etc/rancher/rke2
cat >/etc/rancher/rke2/config.yaml <<EOF
token: "$rke2TOKEN"
# 自定义rke2数据的存储路径
# data-dir: "/data/rke2"
node-ip: "10.1.2.100"
advertise-address: "10.1.2.100"
cni: calico
write-kubeconfig-mode: "0644"
# 自定义k8s集群资源的存储位置
#kubelet-arg:
# - "root-dir=/data/kubelet"
tls-san:
- "10.1.2.100"
- "dockerhub.local"
disable:
- rke2-ingress-nginx
EOF
配置说明:
token:集群加入认证 token。node-ip:当前 Master 节点 IP。advertise-address:API Server 对外通告地址。write-kubeconfig-mode:允许普通用户读取 kubeconfig。tls-san:为证书增加额外访问地址。disable:禁用默认的rke2-ingress-nginx。
10. 启动 RKE2 Server
systemctl enable --now rke2-server
systemctl status rke2-server.service
11. 配置环境变量
建议所有主机都配置ctr别名
echo "export PATH=/var/lib/rancher/rke2/bin:\$PATH" >> /etc/profile
echo "alias ctr='/var/lib/rancher/rke2/bin/ctr -a /run/k3s/containerd/containerd.sock'" >> /etc/profile
source /etc/profile
echo 'export KUBECONFIG=/etc/rancher/rke2/rke2.yaml' >> ~/.bashrc
source ~/.bashrc
12. 查看 Master 节点状态
kubectl get nodes -o wide
此时应该可以看到 rke2-master 节点处于 Ready 状态。
四、Worker 1 节点操作
以下操作只在 10.1.2.101 / rke2-worker-1 上执行。
1. 准备 RKE2 离线安装包
如果 Worker 节点没有安装包,需要将 Master 上的 /root/rke2-offline 目录同步到 Worker 节点,例如:
scp -r /root/rke2-offline root@10.1.2.101:/root/
2. 准备 RKE2 离线镜像
mkdir -p /var/lib/rancher/rke2/agent/images
cp /root/rke2-offline/rke2-images.linux-amd64.tar.zst \
/var/lib/rancher/rke2/agent/images/
3. 配置本地镜像仓库
mkdir -p /etc/rancher/rke2
cat >/etc/rancher/rke2/registries.yaml <<'EOF'
mirrors:
"dockerhub.local":
endpoint:
- "http://dockerhub.local"
EOF
4. 安装 RKE2 Agent
INSTALL_RKE2_TYPE=agent \
INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-offline \
sh /root/rke2-offline/install.sh
5. 配置 Worker 1 加入集群
将 <MASTER_TOKEN> 替换为 Master 节点生成的实际 token。
cat >/etc/rancher/rke2/config.yaml <<'EOF'
server: "https://10.1.2.100:9345"
token: "<MASTER_TOKEN>"
node-ip: "10.1.2.101"
# 自定义k8s集群资源的存储位置
# kubelet-arg:
# - "root-dir=/data/kubelet"
node-label:
- "node-role.kubernetes.io/worker=worker"
EOF
配置说明:
server:RKE2 Server 地址。token:Master 节点生成的集群 token。node-ip:当前 Worker 节点 IP。
6. 启动 RKE2 Agent
systemctl enable --now rke2-agent
systemctl status rke2-agent.service
五、Worker 2 节点操作
以下操作只在 10.1.2.102 / rke2-worker-2 上执行。
1. 准备 RKE2 离线安装包
如果 Worker 节点没有安装包,需要将 Master 上的 /root/rke2-offline 目录同步到 Worker 节点,例如:
scp -r /root/rke2-offline root@10.1.2.102:/root/
2. 准备 RKE2 离线镜像
mkdir -p /var/lib/rancher/rke2/agent/images
cp /root/rke2-offline/rke2-images.linux-amd64.tar.zst \
/var/lib/rancher/rke2/agent/images/
3. 配置本地镜像仓库
mkdir -p /etc/rancher/rke2
cat >/etc/rancher/rke2/registries.yaml <<'EOF'
mirrors:
"dockerhub.local":
endpoint:
- "http://dockerhub.local"
EOF
4. 安装 RKE2 Agent
INSTALL_RKE2_TYPE=agent \
INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-offline \
sh /root/rke2-offline/install.sh
5. 配置 Worker 2 加入集群
将 <MASTER_TOKEN> 替换为 Master 节点生成的实际 token。
cat >/etc/rancher/rke2/config.yaml <<'EOF'
server: "https://10.1.2.100:9345"
token: "<MASTER_TOKEN>"
node-ip: "10.1.2.102"
# 自定义k8s集群资源的存储位置
# kubelet-arg:
# - "root-dir=/data/kubelet"
node-label:
- "node-role.kubernetes.io/worker=worker"
EOF
6. 启动 RKE2 Agent
systemctl enable --now rke2-agent
systemctl status rke2-agent.service
六、配置 crictl
以下操作建议在所有节点执行,方便后续使用 crictl 查看容器运行时状态。
cat >/etc/crictl.yaml <<'EOF'
runtime-endpoint: unix:///run/k3s/containerd/containerd.sock
image-endpoint: unix:///run/k3s/containerd/containerd.sock
timeout: 10
debug: false
EOF
七、验证集群状态
回到 Master 节点执行:
kubectl get nodes -o wide
正常情况下可以看到 3 个节点:
NAME STATUS ROLES AGE VERSION INTERNAL-IP
rke2-master Ready control-plane,etcd,master ... ... 10.1.2.100
rke2-worker-1 Ready <none> ... ... 10.1.2.101
rke2-worker-2 Ready <none> ... ... 10.1.2.102
查看系统 Pod:
kubectl get pods -A
确认核心组件状态正常:
kubectl get pods -A | grep -v Running
如果没有异常 Pod,说明 RKE2 离线集群部署完成。
八、常见注意事项
1. Worker 节点 token 必须和 Master 一致
Master 节点通过以下命令生成 token:
rke2TOKEN=$(openssl rand -hex 32)
echo $rke2TOKEN
Worker 节点中的配置必须使用这个实际输出值:
token: "<MASTER_TOKEN>"
不能随意填写其他 token,否则 Worker 无法加入集群。
2. Docker 重启后再执行登录
修改 /etc/docker/daemon.json 后,需要重启 Docker:
systemctl daemon-reload
systemctl restart docker
然后再登录 Harbor:
docker login dockerhub.local -u admin -p 'Harbor@123'
3. 离线镜像路径要确认正确
RKE2 离线镜像需要放到:
/var/lib/rancher/rke2/agent/images/
例如:
cp /root/rke2-offline/rke2-images.linux-amd64.tar.zst \
/var/lib/rancher/rke2/agent/images/
4. 安装命令不要带 shell 提示符
正确写法:
INSTALL_RKE2_TYPE=server \
INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-offline \
sh /root/rke2-offline/install.sh
不要写成:
> INSTALL_RKE2_ARTIFACT_PATH=/root/rke2-offline
这里的 > 通常只是终端换行提示符,不应该复制到脚本中。
九、总结
通过以上步骤,可以在无公网环境中完成 RKE2 Kubernetes 集群的离线部署。整体流程可以概括为:
所有节点完成系统初始化。
Master 节点部署 Docker、Harbor 和 RKE2 Server。
Worker 节点安装 RKE2 Agent 并加入集群。
通过
kubectl get nodes -o wide验证节点状态。部署完成后,后续可以继续安装 Ingress Controller、StorageClass、监控组件以及业务应用。