Files
qiming/qiming-rcoder/k8s/offline/README.md
2026-06-01 13:54:52 +08:00

6.8 KiB
Raw Permalink Blame History

RCoder 离线部署指南

本文档面向政企/内网客户:目标机器无公网访问,所有镜像与依赖必须随部署包交付


目录内容(解压 rcoder-offline-*.tar.gz 后)

.
├── install.sh                       # 主安装脚本
├── rewrite-registry.sh              # registry 模式: re-tag + push 辅助脚本
├── README.md                        # 本文件
├── values-dev.yaml                  # RCoder dev 环境 values
├── values-prod.yaml                 # RCoder prod 环境 values
├── values-offline.yaml              # 离线 registry 覆盖模板
├── images/
│   ├── all-images.tar               # 所有镜像的 docker save 产物
│   └── images.txt                   # 镜像清单
├── charts/
│   └── rcoder-*.tgz                 # RCoder Helm chart
├── longhorn/
│   └── longhorn-v*.yaml             # Longhorn 全量 manifest
├── juicefs-csi/
│   └── juicefs-csi-v*.yaml          # JuiceFS CSI Driver 官方 manifest
└── manifests/                       # 原始 Kustomize 资产 (参考, 不必使用)

前置条件

在离线机器上,提前准备好:

组件 版本 说明
K8s 1.19+ 已部署, kubeconfig 已配置
kubectl 与集群匹配 kubectl cluster-info 能通
helm 3.x 用于 helm upgrade --install
docker 最新 仅 registry 模式需要
k3s / nerdctl / ctr 最新 仅 direct 模式需要
open-iscsi 任意 Longhorn 依赖 (Ubuntu: apt install open-iscsi)

两种部署模式

模式 A: direct推荐单节点 / 小集群)

直接把镜像 import 到节点 containerd无需私有 registry。适合 k3s 单节点或 3-5 节点小集群。

多节点集群需要在每个节点上依次执行镜像导入。

# 1. 解压 bundle (可通过 make k8s-offline-import 一步完成)
tar xzf rcoder-offline-<version>-<arch>.tar.gz -C /opt/rcoder-offline
cd /opt/rcoder-offline

# 2. 一键安装
sudo ./install.sh --mode=direct --env=dev

# 生产环境
sudo ./install.sh --mode=direct --env=prod \
    --set credentials.postgresql.password='<prod-pg-pass>' \
    --set credentials.minio.rootPassword='<prod-minio-pass>'

多节点注意: 每个节点都要执行 sudo k3s ctr -n k8s.io image import images/all-images.tar 或把 bundle scp 到每个节点各跑一次 --skip-juicefs-csi --skip-longhorn 只做镜像导入。

模式 B: registry推荐多节点 / 生产)

把镜像重新打 tag 推送到客户的私有 registryHarbor / Nexus / 阿里云 ACR 内网实例K8s 按常规流程拉取。

前置: 集群节点能访问私有 registry并配置好拉取凭据如需要

# 1. 解压
tar xzf rcoder-offline-<version>-<arch>.tar.gz -C /opt/rcoder-offline
cd /opt/rcoder-offline

# 2. 如果私有 registry 需要认证, 先登录 docker daemon
docker login harbor.internal

# 3. 安装 (一条命令完成推送+部署)
./install.sh \
    --mode=registry \
    --registry=harbor.internal/rcoder \
    --thirdparty-registry=harbor.internal/thirdparty \
    --env=prod

推送完成后,镜像会以如下命名出现在 registry

原镜像 推送目标
nuwax-docker-images-registry.cn-hangzhou.cr.aliyuncs.com/dev/rcoder:latest harbor.internal/rcoder/rcoder:latest
postgres:16-alpine harbor.internal/thirdparty/postgres:16-alpine
longhornio/longhorn-manager:v1.7.2 harbor.internal/thirdparty/longhornio/longhorn-manager:v1.7.2
registry.k8s.io/sig-storage/csi-provisioner:v5.1.0 harbor.internal/thirdparty/sig-storage/csi-provisioner:v5.1.0

如果集群需要 imagePullSecret:

kubectl -n nuwax-rcoder-prod create secret docker-registry harbor-pull \
    --docker-server=harbor.internal \
    --docker-username=<user> \
    --docker-password=<pass>
# 重新安装时:
./install.sh ... --set 'global.imagePullSecrets[0].name=harbor-pull'

常见操作

查看部署状态

kubectl get pods -n nuwax-rcoder-dev
kubectl get svc  -n nuwax-rcoder-dev
kubectl rollout status deploy/rcoder -n nuwax-rcoder-dev

访问服务

# NodePort
NODE_IP=$(kubectl get nodes -o jsonpath='{.items[0].status.addresses[?(@.type=="InternalIP")].address}')
curl http://${NODE_IP}:30080/health    # dev
curl http://${NODE_IP}:30081/health    # prod

# 或 port-forward
kubectl port-forward -n nuwax-rcoder-dev svc/rcoder 8087:8087
curl http://localhost:8087/health

卸载

helm uninstall rcoder-dev --namespace nuwax-rcoder-dev

# 彻底删除 (包含 PVC)
kubectl delete pvc --all -n nuwax-rcoder-dev
kubectl delete namespace nuwax-rcoder-dev

升级

收到新 bundle 后直接重新跑 install.shhelm upgrade --install 会自动升级):

./install.sh --mode=registry --registry=harbor.internal/rcoder --env=prod

跳过选项

参数 用途
--skip-longhorn 集群已有其他 CSI (Ceph/NFS/CSI-local-path),不装 Longhorn
--skip-juicefs-csi 集群已有 JuiceFS CSI 或用其他 RWX 方案
--skip-image-import 镜像已手工导入,调试用

多节点镜像批量导入direct 模式)

install.sh 只在执行节点导入镜像。多节点集群建议写一个辅助脚本循环每个节点:

NODES=(node1 node2 node3)
for n in "${NODES[@]}"; do
    scp images/all-images.tar root@$n:/tmp/
    ssh root@$n 'sudo k3s ctr -n k8s.io image import /tmp/all-images.tar && rm /tmp/all-images.tar'
done
# 然后在控制平面节点跑:
./install.sh --mode=direct --env=prod --skip-image-import

故障排查

Pod 长时间 Pending

kubectl describe pod -n nuwax-rcoder-dev <pod-name>
# 常见原因:
# - ImagePullBackOff -> 节点 containerd 没有镜像 (direct 模式漏了某节点)
# - 长时间 ContainerCreating -> Longhorn / JuiceFS CSI 未就绪

JuiceFS 挂载失败

kubectl logs -n kube-system -l app=juicefs-csi-driver-node --tail=50
# 检查 postgresql / minio 是否就绪
kubectl get pods -n nuwax-rcoder-dev -l app=postgresql
kubectl get pods -n nuwax-rcoder-dev -l app=minio

Longhorn 无法启动

# 常见原因: open-iscsi 未安装
ssh <node> "sudo apt install -y open-iscsi && sudo systemctl enable --now iscsid"
kubectl delete pod -n longhorn-system -l app=longhorn-manager --force

版本信息

本 bundle 固定了以下版本:

  • RCoder: (由构建时的 git tag 决定, 见 images/images.txt)
  • PostgreSQL: 16-alpine
  • MinIO: 固定 release tag
  • JuiceFS Mount: ce-v1.3.1
  • JuiceFS CSI: v0.31.3 (官方 deploy/k8s.yaml; helm 仓库已停更)
  • Longhorn: v1.7.2

升级任意组件需要重新构建 bundlemake k8s-offline-bundle),本离线包不能在线更新。