菜单

Administrator
发布于 2025-12-04 / 0 阅读
0

RKE2 离线部署 Kubernetes 集群实践:Docker + Harbor + RKE2

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 网络需要依赖 overlaybr_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 集群的离线部署。整体流程可以概括为:

  1. 所有节点完成系统初始化。

  2. Master 节点部署 Docker、Harbor 和 RKE2 Server。

  3. Worker 节点安装 RKE2 Agent 并加入集群。

  4. 通过 kubectl get nodes -o wide 验证节点状态。

    部署完成后,后续可以继续安装 Ingress Controller、StorageClass、监控组件以及业务应用。