离线部署RKE2高可用Kubernetes集群操作指南

在Ubuntu 24.04系统上离线部署RKE2 Kubernetes集群,需要综合考虑系统环境准备、离线资源获取、集群配置及高可用架构设计。以下是详细的操作流程,结合了多个权威参考资料的最佳实践。

一、部署环境规划与准备

1.1 集群节点规划

建议采用3个控制平面节点和2个工作节点的高可用架构,具体规划如下表所示:

节点名称主机名IP地址操作系统节点角色
控制节点1rke2-server-01192.168.122.11Ubuntu 24.04控制平面
控制节点2rke2-server-02192.168.122.12Ubuntu 24.04控制平面
控制节点3rke2-server-03192.168.122.13Ubuntu 24.04控制平面
工作节点1rke2-worker-01192.168.122.21Ubuntu 24.04工作节点
工作节点2rke2-worker-02192.168.122.22Ubuntu 24.04工作节点
1.2 系统环境初始化(所有节点执行)

所有节点需要执行以下基础配置,确保环境一致性:

# 1. 关闭防火墙(生产环境需按需配置)
sudo systemctl stop ufw && sudo systemctl disable ufw

# 2. 关闭SWAP分区
sudo swapoff -a
sudo sed -i '/swap/s/^/#/' /etc/fstab

# 3. 配置内核参数
cat <<EOF | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
EOF

sudo modprobe overlay
sudo modprobe br_netfilter

cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
EOF

sudo sysctl --system

# 4. 设置主机名(以server-01为例)
sudo hostnamectl set-hostname rke2-server-01

# 5. 配置hosts文件
sudo tee -a /etc/hosts <<EOF
192.168.122.11 rke2-server-01 rke2-server-01.contoso.intra
192.168.122.12 rke2-server-02 rke2-server-02.contoso.intra
192.168.122.13 rke2-server-03 rke2-server-03.contoso.intra
192.168.122.21 rke2-worker-01 rke2-worker-01.contoso.intra
192.168.122.22 rke2-worker-02 rke2-worker-02.contoso.intra
EOF

# 6. 配置时间同步
sudo apt update
sudo apt install chrony -y
sudo systemctl enable --now chronyd

二、离线资源获取与分发

2.1 准备离线镜像仓库(可选)

在生产环境中,建议搭建私有镜像仓库作为离线镜像源:

# 在可访问互联网的机器上执行
# 1. 下载RKE2安装脚本和二进制文件
wget https://github.com/rancher/rke2/releases/download/v1.33.5+rke2r1/rke2.linux-amd64.tar.gz
wget https://github.com/rancher/rke2/releases/download/v1.33.5+rke2r1/rke2-images.linux-amd64.tar.gz

# 2. 下载安装脚本
curl -sfL https://get.rke2.io --output install.sh

# 3. 创建离线镜像包(使用skopeo或docker save)
# 此处以docker为例(需提前安装docker)
docker pull registry.cn-hangzhou.aliyuncs.com/rancher/mirrored-pause:3.6
docker save -o pause.tar registry.cn-hangzhou.aliyuncs.com/rancher/mirrored-pause:3.6
2.2 离线安装包分发

将下载的离线资源复制到所有集群节点:

# 使用scp或ansible批量分发
for node in rke2-server-01 rke2-server-02 rke2-server-03 rke2-worker-01 rke2-worker-02; do
    scp rke2.linux-amd64.tar.gz rke2-images.linux-amd64.tar.gz root@$node:/tmp/
done

三、RKE2控制平面部署

3.1 安装RKE2(第一个控制节点)

在第一个控制节点(rke2-server-01)上执行:

# 1. 创建配置目录
mkdir -p /etc/rancher/rke2/

# 2. 创建RKE2配置文件
cat > /etc/rancher/rke2/config.yaml <<EOF
token: 123456  # 集群token,用于节点加入
system-default-registry: "registry.cn-hangzhou.aliyuncs.com"
node-taint:
  - "node-role.kubernetes.io/control-plane:NoSchedule"
tls-san:
  - rke2-server-01
  - rke2-server-01.contoso.intra
  - 192.168.122.11
write-kubeconfig-mode: "0644"
EOF

# 3. 安装RKE2(离线模式)
tar xzf /tmp/rke2.linux-amd64.tar.gz -C /usr/local
cp /tmp/rke2-images.linux-amd64.tar.gz /var/lib/rancher/rke2/agent/images/

# 4. 启动RKE2服务
systemctl enable --now rke2-server.service

# 5. 等待服务启动并导入镜像
while [ ! -f /run/k3s/containerd/containerd.sock ]; do
    echo "等待containerd socket文件生成..."
    sleep 5
done

# 6. 导入离线镜像
/var/lib/rancher/rke2/bin/ctr -a /run/k3s/containerd/containerd.sock -n k8s.io images import /var/lib/rancher/rke2/agent/images/rke2-images.linux-amd64.tar.gz

# 7. 配置环境变量
echo 'export PATH=$PATH:/var/lib/rancher/rke2/bin' >> ~/.bashrc
echo 'export KUBECONFIG=/etc/rancher/rke2/rke2.yaml' >> ~/.bashrc
source ~/.bashrc

# 8. 验证安装
crictl images  # 查看已加载的镜像
kubectl get nodes  # 查看节点状态
3.2 配置高可用控制平面

获取第一个节点的token和server-url,用于其他控制节点加入:

# 1. 获取token和server-url
cat /var/lib/rancher/rke2/server/token
# 输出类似:K10c3b1c5a8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6::server:123456

# 2. 在第二个控制节点(rke2-server-02)上配置
cat > /etc/rancher/rke2/config.yaml <<EOF
server: https://192.168.122.11:9345
token: K10c3b1c5a8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6::server:123456
system-default-registry: "registry.cn-hangzhou.aliyuncs.com"
node-taint:
  - "node-role.kubernetes.io/control-plane:NoSchedule"
tls-san:
  - rke2-server-02
  - rke2-server-02.contoso.intra
  - 192.168.122.12
EOF

# 3. 安装并启动服务(同第一个节点步骤)
# 4. 重复上述步骤配置第三个控制节点

四、工作节点加入集群

在工作节点上执行以下配置:

# 1. 创建工作节点配置文件
cat > /etc/rancher/rke2/config.yaml <<EOF
server: https://192.168.122.11:9345
token: K10c3b1c5a8e9f0a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6::server:123456
system-default-registry: "registry.cn-hangzhou.aliyuncs.com"
EOF

# 2. 安装RKE2 Agent
tar xzf /tmp/rke2.linux-amd64.tar.gz -C /usr/local
cp /tmp/rke2-images.linux-amd64.tar.gz /var/lib/rancher/rke2/agent/images/

# 3. 启动Agent服务
systemctl enable --now rke2-agent.service

# 4. 导入镜像
while [ ! -f /run/k3s/containerd/containerd.sock ]; do
    sleep 5
done
/var/lib/rancher/rke2/bin/ctr -a /run/k3s/containerd/containerd.sock -n k8s.io images import /var/lib/rancher/rke2/agent/images/rke2-images.linux-amd64.tar.gz

五、集群验证与网络配置

5.1 验证集群状态

在任意控制节点上执行:

# 1. 查看集群节点状态
kubectl get nodes -o wide

# 预期输出:
# NAME              STATUS   ROLES                       AGE   VERSION
# rke2-server-01    Ready    control-plane,etcd,master   10m   v1.33.5+rke2r1
# rke2-server-02    Ready    control-plane,etcd,master   8m    v1.33.5+rke2r1
# rke2-server-03    Ready    control-plane,etcd,master   5m    v1.33.5+rke2r1
# rke2-worker-01    Ready    <none>                      3m    v1.33.5+rke2r1
# rke2-worker-02    Ready    <none>                      2m    v1.33.5+rke2r1

# 2. 查看核心组件状态
kubectl get pods -n kube-system

# 3. 验证etcd集群状态
kubectl exec -n kube-system etcd-rke2-server-01 -- etcdctl member list
5.2 配置Calico网络插件(可选)

RKE2默认使用Canal(Calico+Flannel),如需纯Calico配置:

# 创建calico-config.yaml
apiVersion: helm.cattle.io/v1
kind: HelmChartConfig
metadata:
  name: rke2-calico
  namespace: kube-system
spec:
  valuesContent: |-
    installation:
      calicoNetwork:
        bgp: disabled
        ipPools:
        - blockSize: 26
          cidr: 10.42.0.0/16
          encapsulation: VXLAN
          natOutgoing: Enabled
          nodeSelector: all()
    ipam:
      type: Calico
    felixConfiguration:
      bpfLogLevel: ""

# 应用配置
kubectl apply -f calico-config.yaml

六、生产环境优化建议

6.1 安全加固措施
# 1. 配置Pod安全策略
kubectl apply -f - <<EOF
apiVersion: policy/v1beta1
kind: PodSecurityPolicy
metadata:
  name: restricted
spec:
  privileged: false
  allowPrivilegeEscalation: false
  requiredDropCapabilities:
    - ALL
  volumes:
    - 'configMap'
    - 'emptyDir'
    - 'projected'
    - 'secret'
    - 'downwardAPI'
    - 'persistentVolumeClaim'
  hostNetwork: false
  hostIPC: false
  hostPID: false
  runAsUser:
    rule: 'MustRunAsNonRoot'
  seLinux:
    rule: 'RunAsAny'
  supplementalGroups:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
  fsGroup:
    rule: 'MustRunAs'
    ranges:
      - min: 1
        max: 65535
EOF

# 2. 启用审计日志
cat >> /etc/rancher/rke2/config.yaml <<EOF
audit-policy-file: /etc/rancher/rke2/audit.yaml
kube-apiserver-arg:
  - audit-log-path=/var/lib/rancher/rke2/server/logs/audit.log
  - audit-log-maxage=30
  - audit-log-maxbackup=10
  - audit-log-maxsize=100
EOF
6.2 监控与日志方案
# 安装Prometheus Stack(离线需提前准备镜像)
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# 创建values.yaml配置
cat > prometheus-values.yaml <<EOF
prometheus:
  prometheusSpec:
    storageSpec:
      volumeClaimTemplate:
        spec:
          accessModes: ["ReadWriteOnce"]
          resources:
            requests:
              storage: 50Gi

grafana:
  adminPassword: "admin123"
  persistence:
    enabled: true
    size: 10Gi
EOF

# 离线安装(需提前下载chart和镜像)
helm install prometheus prometheus-community/kube-prometheus-stack -f prometheus-values.yaml

七、常见问题排查

7.1 节点无法加入集群
# 检查token和server地址
cat /etc/rancher/rke2/config.yaml

# 查看服务日志
journalctl -u rke2-server.service -f
journalctl -u rke2-agent.service -f

# 验证网络连通性
telnet 192.168.122.11 9345
7.2 镜像拉取失败
# 检查镜像仓库配置
cat /etc/rancher/rke2/registries.yaml

# 手动导入镜像
ctr -n k8s.io images import /path/to/image.tar

# 验证镜像列表
crictl images
7.3 etcd集群状态异常
# 检查etcd成员状态
kubectl exec -n kube-system etcd-$(hostname) -- etcdctl endpoint health

# 查看etcd日志
kubectl logs -n kube-system etcd-$(hostname) -f

八、维护与升级操作

8.1 集群备份与恢复
# 备份etcd数据
kubectl exec -n kube-system etcd-$(hostname) -- etcdctl snapshot save /var/lib/rancher/rke2/server/db/snapshot.db

# 恢复etcd数据
systemctl stop rke2-server.service
/var/lib/rancher/rke2/bin/etcdctl snapshot restore /path/to/snapshot.db --data-dir /var/lib/rancher/rke2/server/db
systemctl start rke2-server.service
8.2 RKE2版本升级
# 下载新版本离线包
wget https://github.com/rancher/rke2/releases/download/v1.34.0+rke2r1/rke2.linux-amd64.tar.gz

# 逐个节点升级(先工作节点,后控制节点)
systemctl stop rke2-server.service
tar xzf rke2.linux-amd64.tar.gz -C /usr/local
systemctl start rke2-server.service

通过以上完整流程,可以在Ubuntu 24.04系统上成功部署一个高可用的RKE2 Kubernetes集群。整个部署过程强调了离线环境下的资源管理、高可用架构的实现以及生产环境的最佳实践配置。实际部署时,请根据具体网络环境和硬件配置调整相关参数。


参考来源

更多推荐