OpenTwins Linux 离线环境部署指南
本文档参考 OpenTwins 官方文档,提供 Linux 离线环境下的完整部署指南。
一、部署概述
1.1 离线部署挑战
离线环境部署需要提前准备:
- 所有必需的 Docker 镜像
- Helm Charts 及其依赖
- 二进制安装包(kubectl、helm、docker 等)
- 相关配置文件和脚本
1.2 部署架构
1离线服务器2├── Docker 容器运行时3├── Kubernetes 集群(单节点或多节点)4├── Helm 包管理器5└── OpenTwins 平台组件6 ├── Eclipse Ditto(数字孪生核心)7 ├── Mosquitto(MQTT 消息代理)8 ├── InfluxDB(时序数据库)9 ├── Grafana(数据可视化)10 └── OpenTwins Frontend(Web 界面)1.3 系统要求
硬件要求
- CPU: 4 核心或以上
- 内存: 8GB RAM(最低),推荐 16GB
- 磁盘: 至少 40GB 可用空间
- 网络: 离线环境,需要内网连接
软件要求
- 操作系统: CentOS 7/8、RHEL 7/8、Ubuntu 18.04/20.04/22.04、Debian 10/11
- 内核版本: 3.10+
- SELinux: 可选关闭或配置
二、准备阶段(联网环境)
重要
此阶段需要在有互联网连接的机器上完成,准备好所有资源后传输到离线环境。
2.1 创建资源目录结构
bash
1mkdir -p /opt/opentwins-offline/{binaries,images,charts,scripts}2cd /opt/opentwins-offline2.2 下载二进制文件
下载 Docker
bash
1# CentOS/RHEL2wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-20.10.24-3.el7.x86_64.rpm3wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/docker-ce-cli-20.10.24-3.el7.x86_64.rpm4wget https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.6.21-3.1.el7.x86_64.rpm56# Ubuntu/Debian7wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce_20.10.24~3-0~ubuntu-focal_amd64.deb8wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/docker-ce-cli_20.10.24~3-0~ubuntu-focal_amd64.deb9wget https://download.docker.com/linux/ubuntu/dists/focal/pool/stable/amd64/containerd.io_1.6.21-1_amd64.deb1011# 移动到 binaries 目录12mv *.rpm *.deb binaries/下载 kubectl
bash
1cd binaries2# 下载 kubectl(选择合适的版本)3curl -LO "https://dl.k8s.io/release/v1.28.0/bin/linux/amd64/kubectl"4chmod +x kubectl下载 Helm
bash
1cd binaries2# 下载 Helm v33wget https://get.helm.sh/helm-v3.13.0-linux-amd64.tar.gz4tar -xzf helm-v3.13.0-linux-amd64.tar.gz5mv linux-amd64/helm ./6rm -rf linux-amd64 helm-v3.13.0-linux-amd64.tar.gz7chmod +x helm下载 Minikube(用于单节点部署)
bash
1cd binaries2curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd643mv minikube-linux-amd64 minikube4chmod +x minikube2.3 下载 Helm Charts
bash
1cd /opt/opentwins-offline/charts23# 添加 Helm 仓库4helm repo add ertis https://ertis-research.github.io/Helm-charts/5helm repo update67# 下载 OpenTwins Chart 及其依赖8helm pull ertis/OpenTwins --untar9helm dependency update OpenTwins/1011# 打包所有 charts12helm package OpenTwins/1314# 下载依赖的 charts(如果需要)15# 根据 OpenTwins/Chart.yaml 中的依赖列表下载2.4 导出 Docker 镜像
创建镜像列表文件 images-list.txt:
bash
1cd /opt/opentwins-offline/images2cat > images-list.txt << 'EOF'3# Eclipse Ditto 组件4eclipse/ditto-policies:latest5eclipse/ditto-things:latest6eclipse/ditto-things-search:latest7eclipse/ditto-gateway:latest8eclipse/ditto-connectivity:latest9eclipse/ditto-concierge:latest10nginx:alpine1112# MongoDB(Ditto 使用)13mongo:4.41415# Mosquitto MQTT16eclipse-mosquitto:2.01718# InfluxDB19influxdb:2.72021# Grafana22grafana/grafana:latest2324# OpenTwins Frontend25# 需要查看 Helm Chart values.yaml 确认具体镜像2627# Kubernetes 基础组件(如果使用 minikube)28registry.k8s.io/pause:3.929registry.k8s.io/kube-apiserver:v1.28.030registry.k8s.io/kube-controller-manager:v1.28.031registry.k8s.io/kube-scheduler:v1.28.032registry.k8s.io/kube-proxy:v1.28.033registry.k8s.io/etcd:3.5.9-034registry.k8s.io/coredns/coredns:v1.10.13536# Storage provisioner(如果使用)37k8s.gcr.io/storage-provisioner:v538EOF下载并保存镜像:
bash
1cd /opt/opentwins-offline/images23# 创建镜像下载脚本4cat > pull-images.sh << 'EOF'5#!/bin/bash6while IFS= read -r image; do7 # 跳过注释和空行8 [[ "$image" =~ ^#.*$ ]] && continue9 [[ -z "$image" ]] && continue10 11 echo "正在拉取镜像: $image"12 docker pull "$image"13 14 # 保存镜像15 image_file=$(echo "$image" | sed 's/[\/:]/_/g').tar16 echo "正在保存镜像到: $image_file"17 docker save -o "$image_file" "$image"18done < images-list.txt1920echo "所有镜像已下载并保存完成"21EOF2223chmod +x pull-images.sh24./pull-images.sh2.5 创建部署脚本
离线安装脚本
bash
1cd /opt/opentwins-offline/scripts23cat > 01-install-docker.sh << 'EOF'4#!/bin/bash5set -e67echo "========================================"8echo "开始安装 Docker"9echo "========================================"1011# 检测操作系统12if [ -f /etc/os-release ]; then13 . /etc/os-release14 OS=$ID15else16 echo "无法检测操作系统"17 exit 118fi1920cd /opt/opentwins-offline/binaries2122case $OS in23 centos|rhel)24 echo "在 CentOS/RHEL 上安装 Docker"25 sudo yum install -y *.rpm26 ;;27 ubuntu|debian)28 echo "在 Ubuntu/Debian 上安装 Docker"29 sudo dpkg -i *.deb30 sudo apt-get install -f -y31 ;;32 *)33 echo "不支持的操作系统: $OS"34 exit 135 ;;36esac3738# 启动 Docker39sudo systemctl start docker40sudo systemctl enable docker4142# 验证安装43docker --version4445echo "Docker 安装完成"46EOF4748chmod +x 01-install-docker.shbash
1cat > 02-load-images.sh << 'EOF'2#!/bin/bash3set -e45echo "========================================"6echo "开始加载 Docker 镜像"7echo "========================================"89cd /opt/opentwins-offline/images1011for tar_file in *.tar; do12 echo "正在加载: $tar_file"13 docker load -i "$tar_file"14done1516echo "镜像加载完成"17docker images18EOF1920chmod +x 02-load-images.shbash
1cat > 03-install-kubectl-helm.sh << 'EOF'2#!/bin/bash3set -e45echo "========================================"6echo "安装 kubectl 和 Helm"7echo "========================================"89cd /opt/opentwins-offline/binaries1011# 安装 kubectl12sudo cp kubectl /usr/local/bin/13sudo chmod +x /usr/local/bin/kubectl1415# 安装 helm16sudo cp helm /usr/local/bin/17sudo chmod +x /usr/local/bin/helm1819# 验证安装20kubectl version --client21helm version2223echo "kubectl 和 Helm 安装完成"24EOF2526chmod +x 03-install-kubectl-helm.shbash
1cat > 04-setup-minikube.sh << 'EOF'2#!/bin/bash3set -e45echo "========================================"6echo "设置 Minikube Kubernetes 集群"7echo "========================================"89cd /opt/opentwins-offline/binaries1011# 安装 minikube12sudo cp minikube /usr/local/bin/13sudo chmod +x /usr/local/bin/minikube1415# 启动 minikube(使用 Docker 驱动,离线模式)16minikube start \17 --cpus 4 \18 --memory 8192 \19 --disk-size 40gb \20 --driver=docker \21 --image-mirror-country=cn \22 --base-image="gcr.io/k8s-minikube/kicbase:v0.0.42"2324# 配置 kubectl25kubectl config use-context minikube2627# 验证集群28kubectl cluster-info29kubectl get nodes3031echo "Minikube 集群设置完成"32EOF3334chmod +x 04-setup-minikube.shbash
1cat > 05-deploy-opentwins.sh << 'EOF'2#!/bin/bash3set -e45echo "========================================"6echo "部署 OpenTwins 平台"7echo "========================================"89cd /opt/opentwins-offline/charts1011# 创建本地 Helm 仓库12helm repo add local file://$(pwd)13helm repo update1415# 安装 OpenTwins16helm upgrade --install opentwins ./OpenTwins-*.tgz \17 --wait \18 --timeout 20m \19 --set global.imageRegistry="" \20 --set global.imagePullPolicy=IfNotPresent2122# 等待所有 Pod 就绪23echo "等待所有 Pod 启动..."24kubectl wait --for=condition=ready pod --all --timeout=600s2526# 显示部署状态27kubectl get pods28kubectl get services2930echo "========================================"31echo "OpenTwins 部署完成!"32echo "========================================"33EOF3435chmod +x 05-deploy-opentwins.shbash
1cat > 06-port-forward.sh << 'EOF'2#!/bin/bash34echo "========================================"5echo "设置端口转发"6echo "========================================"78# 获取 Pod 名称9FRONTEND_POD=$(kubectl get pods -l app=opentwins-frontend -o jsonpath='{.items[0].metadata.name}')10GRAFANA_POD=$(kubectl get pods -l app=grafana -o jsonpath='{.items[0].metadata.name}')1112# 在后台启动端口转发13echo "启动端口转发..."1415# OpenTwins 前端 - 端口 300016kubectl port-forward svc/opentwins-frontend 3000:80 > /dev/null 2>&1 &17echo "OpenTwins 前端: http://localhost:3000"1819# Ditto nginx - 端口 808020kubectl port-forward svc/ditto-nginx 8080:8080 > /dev/null 2>&1 &21echo "Ditto API: http://localhost:8080"2223# Mosquitto MQTT - 端口 188324kubectl port-forward svc/mosquitto 1883:1883 > /dev/null 2>&1 &25echo "Mosquitto MQTT: localhost:1883"2627# Grafana - 端口 300128kubectl port-forward svc/grafana 3001:3000 > /dev/null 2>&1 &29echo "Grafana: http://localhost:3001"3031echo "========================================"32echo "端口转发已启动"33echo "使用 'pkill -f port-forward' 停止所有转发"34echo "========================================"35EOF3637chmod +x 06-port-forward.sh2.6 打包资源
bash
1cd /opt2tar -czf opentwins-offline-package.tar.gz opentwins-offline/将 opentwins-offline-package.tar.gz 传输到离线服务器。
三、离线环境部署
3.1 传输资源包
使用 USB 驱动器、内网文件传输或其他方式将资源包传输到离线服务器:
bash
1# 在离线服务器上2cd /opt3# 假设已经将 opentwins-offline-package.tar.gz 复制到此目录45# 解压资源包6tar -xzf opentwins-offline-package.tar.gz3.2 执行安装
bash
1cd /opt/opentwins-offline/scripts23# 步骤 1: 安装 Docker4sudo ./01-install-docker.sh56# 步骤 2: 加载 Docker 镜像7sudo ./02-load-images.sh89# 步骤 3: 安装 kubectl 和 Helm10sudo ./03-install-kubectl-helm.sh1112# 步骤 4: 设置 Kubernetes 集群13sudo ./04-setup-minikube.sh1415# 步骤 5: 部署 OpenTwins16./05-deploy-opentwins.sh3.3 验证部署
bash
1# 检查所有 Pod 状态2kubectl get pods --all-namespaces34# 检查服务5kubectl get services67# 查看 OpenTwins 组件8kubectl get pods -l app.kubernetes.io/name=opentwins3.4 设置访问
bash
1# 启动端口转发2cd /opt/opentwins-offline/scripts3./06-port-forward.sh45# 或者使用 NodePort 服务(持久访问)6kubectl patch svc opentwins-frontend -p '{"spec":{"type":"NodePort"}}'7kubectl patch svc grafana -p '{"spec":{"type":"NodePort"}}'89# 获取 NodePort10kubectl get svc opentwins-frontend11kubectl get svc grafana四、配置 OpenTwins
4.1 访问 Web 界面
bash
1# 如果使用端口转发2http://localhost:300034# 如果使用 NodePort5http://<节点IP>:<NodePort>4.2 配置 Ditto 连接
- 在 OpenTwins 界面中配置:
- Ditto nginx 地址:
http://ditto-nginx:8080(集群内)或http://localhost:8080(端口转发) - Ditto Extended API:
http://ditto-nginx:8080/api/ditto-extended
- Ditto nginx 地址:
4.3 创建数字孪生
参考官方文档创建数字孪生的步骤与在线环境相同:
创建 Car 类型
json
1{2 "thingId": "example:car",3 "policyId": "default:basic_policy",4 "attributes": {5 "name": "Car",6 "description": "数字孪生汽车示例",7 "image": "https://images.pexels.com/photos/119435/pexels-photo-119435.jpeg"8 },9 "features": {10 "gps": {11 "properties": {12 "latitude": null,13 "longitude": null14 }15 }16 }17}创建 Wheel 类型
json
1{2 "thingId": "example:wheel",3 "policyId": "default:basic_policy",4 "attributes": {5 "name": "Wheel",6 "description": "车轮数字孪生",7 "image": "https://images.pexels.com/photos/111766/pexels-photo-111766.jpeg"8 },9 "features": {10 "velocity": {11 "properties": {12 "value": null13 }14 },15 "direction": {16 "properties": {17 "value": null18 }19 }20 }21}五、数据接入
5.1 准备 Python 环境
bash
1# 如果离线环境没有 Python,需要提前准备2# 在联网环境下载 Python 和依赖包34# 下载 paho-mqtt(联网环境)5pip download paho-mqtt -d /opt/opentwins-offline/python-packages/67# 在离线环境安装8pip install --no-index --find-links=/opt/opentwins-offline/python-packages/ paho-mqtt5.2 创建数据模拟器
创建 car_simulator.py:
python
1#!/usr/bin/env python32import paho.mqtt.client as mqtt3import json4import time5import random67# 配置参数8MQTT_BROKER = "localhost" # 或者 Kubernetes 节点 IP9MQTT_PORT = 188310TOPIC_PREFIX = "ditto/"11NAMESPACE = "example"12CAR_NAME = "mycar"13WHEEL_PREFIX = "mycar:wheel_"1415def on_connect(client, userdata, flags, rc):16 if rc == 0:17 print(f"已成功连接到 MQTT Broker: {MQTT_BROKER}:{MQTT_PORT}")18 else:19 print(f"连接失败,返回码: {rc}")2021def on_publish(client, userdata, mid):22 print(f"消息 {mid} 已发布")2324# 初始化 MQTT 客户端25client = mqtt.Client()26client.on_connect = on_connect27client.on_publish = on_publish2829try:30 client.connect(MQTT_BROKER, MQTT_PORT, 60)31 client.loop_start()32except Exception as e:33 print(f"MQTT 连接错误: {e}")34 exit(1)3536def generate_wheel_data():37 """生成车轮模拟数据"""38 velocity = random.uniform(0.0, 120.0)39 direction = random.uniform(-45.0, 45.0)40 return velocity, direction4142def generate_gps_data():43 """生成 GPS 模拟数据"""44 # 模拟在某个区域内移动45 base_lat, base_lon = 39.9042, 116.4074 # 北京天安门46 latitude = base_lat + random.uniform(-0.01, 0.01)47 longitude = base_lon + random.uniform(-0.01, 0.01)48 return latitude, longitude4950def create_ditto_message(thing_id, features_update):51 """创建 Ditto 协议消息"""52 return {53 "topic": f"{NAMESPACE}/{thing_id}/things/twin/commands/merge",54 "headers": {55 "content-type": "application/merge-patch+json"56 },57 "path": "/features",58 "value": features_update59 }6061def publish_car_data(timestamp, latitude, longitude):62 """发布汽车数据"""63 features = {64 "gps": {65 "properties": {66 "latitude": latitude,67 "longitude": longitude,68 "timestamp": timestamp69 }70 }71 }72 message = create_ditto_message(CAR_NAME, features)73 topic = f"{TOPIC_PREFIX}{NAMESPACE}/{CAR_NAME}"74 client.publish(topic, json.dumps(message))75 print(f"✓ {CAR_NAME}: GPS ({latitude:.6f}, {longitude:.6f})")7677def publish_wheel_data(wheel_num, timestamp, velocity, direction):78 """发布车轮数据"""79 thing_id = f"{WHEEL_PREFIX}{wheel_num}"80 features = {81 "velocity": {82 "properties": {83 "value": velocity,84 "timestamp": timestamp85 }86 },87 "direction": {88 "properties": {89 "value": direction,90 "timestamp": timestamp91 }92 }93 }94 message = create_ditto_message(thing_id, features)95 topic = f"{TOPIC_PREFIX}{NAMESPACE}/{thing_id}"96 client.publish(topic, json.dumps(message))97 print(f"✓ {thing_id}: 速度={velocity:.2f} km/h, 方向={direction:.2f}°")9899# 主循环100print("="*60)101print("数字孪生数据模拟器已启动")102print("="*60)103104try:105 iteration = 0106 while True:107 iteration += 1108 timestamp = int(time.time() * 1000)109 110 print(f"\n--- 第 {iteration} 次数据更新 (时间戳: {timestamp}) ---")111 112 # 发布汽车数据113 latitude, longitude = generate_gps_data()114 publish_car_data(timestamp, latitude, longitude)115 116 # 发布四个车轮数据117 for i in range(1, 5):118 velocity, direction = generate_wheel_data()119 publish_wheel_data(i, timestamp, velocity, direction)120 121 print(f"--- 完成,等待 5 秒... ---")122 time.sleep(5)123 124except KeyboardInterrupt:125 print("\n\n程序被用户中断")126finally:127 client.loop_stop()128 client.disconnect()129 print("已断开 MQTT 连接")5.3 运行模拟器
bash
1chmod +x car_simulator.py2python3 car_simulator.py六、数据可视化
6.1 访问 Grafana
bash
1# 获取 Grafana 访问信息2kubectl get svc grafana34# 获取默认密码(如果使用了 secret)5kubectl get secret grafana-admin-password -o jsonpath="{.data.password}" | base64 --decode访问: http://localhost:3001 或 http://<节点IP>:<NodePort>
默认凭据:
- 用户名:
admin - 密码: 查看上述命令输出或 Helm values
6.2 配置 InfluxDB 数据源
- 登录 Grafana
- 导航到 Configuration → Data Sources
- 添加 InfluxDB 数据源:
- URL:
http://influxdb:8086(集群内地址) - Database:
opentwins - Query Language:
Flux
- URL:
6.3 创建仪表板
创建四个面板监控数字孪生数据:
面板 1: 当前 GPS 位置
flux
1import "strings"2from(bucket: "opentwins")3 |> range(start: v.timeRangeStart, stop: v.timeRangeStop)4 |> filter(fn: (r) => r["_measurement"] == "mqtt_consumer")5 |> filter(fn: (r) => r["thingId"] == "example:mycar")6 |> filter(fn: (r) => r["_field"] == "value_gps_properties_latitude" or 7 r["_field"] == "value_gps_properties_longitude")8 |> map(fn: (r) => ({ r with _field: strings.replace(v: r["_field"], 9 t: "value_gps_properties_", 10 u: "", i: 2) }))11 |> keep(columns: ["_value", "_field", "_time"])12 |> sort(columns: ["_time"], desc: false) 13 |> last()面板 2: GPS 轨迹
flux
1import "strings"2from(bucket: "opentwins")3 |> range(start: v.timeRangeStart, stop: v.timeRangeStop)4 |> filter(fn: (r) => r["_measurement"] == "mqtt_consumer")5 |> filter(fn: (r) => r["thingId"] == "example:mycar")6 |> filter(fn: (r) => r["_field"] == "value_gps_properties_latitude" or 7 r["_field"] == "value_gps_properties_longitude")8 |> map(fn: (r) => ({ r with _field: strings.replace(v: r["_field"], 9 t: "value_gps_properties_", 10 u: "", i: 2) }))11 |> keep(columns: ["_value", "_field", "_time"])面板 3: 车轮方向
flux
1import "strings"2from(bucket: "opentwins")3 |> range(start: v.timeRangeStart, stop: v.timeRangeStop)4 |> filter(fn: (r) => r["_measurement"] == "mqtt_consumer")5 |> filter(fn: (r) => strings.hasPrefix(v: r["thingId"], prefix: "example:mycar:wheel_"))6 |> filter(fn: (r) => r["_field"] == "value_direction_properties_value")7 |> map(fn: (r) => ({ r with thingId: strings.replace(v: r["thingId"], 8 t: "example:mycar:", 9 u: "", i: 2) }))10 |> keep(columns: ["thingId", "_value", "_time"])11 |> sort(columns: ["_time"], desc: false) 12 |> last()面板 4: 车轮速度对比
flux
1import "strings"2from(bucket: "opentwins")3 |> range(start: v.timeRangeStart, stop: v.timeRangeStop)4 |> filter(fn: (r) => r["_measurement"] == "mqtt_consumer")5 |> filter(fn: (r) => strings.hasPrefix(v: r["thingId"], prefix: "example:mycar:wheel_"))6 |> filter(fn: (r) => r["_field"] == "value_velocity_properties_value")7 |> map(fn: (r) => ({ r with thingId: strings.replace(v: r["thingId"], 8 t: "example:mycar:", 9 u: "", i: 2) }))10 |> keep(columns: ["thingId", "_value", "_time"])七、多节点集群部署(可选)
如果需要在多节点集群上部署(而非 minikube):
7.1 准备集群节点
在所有节点上:
bash
1# 加载 Docker 镜像2cd /opt/opentwins-offline/images3for tar_file in *.tar; do4 docker load -i "$tar_file"5done7.2 使用 kubeadm 部署集群
参考 Kubernetes 官方离线部署文档,或使用以下简化步骤:
bash
1# 主节点2kubeadm init --pod-network-cidr=10.244.0.0/1634# 配置 kubectl5mkdir -p $HOME/.kube6sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config7sudo chown $(id -u):$(id -g) $HOME/.kube/config89# 工作节点加入10# 在工作节点上执行主节点 init 输出的 join 命令11kubeadm join <主节点IP>:6443 --token <token> --discovery-token-ca-cert-hash <hash>7.3 部署网络插件(离线)
需要提前准备 CNI 插件镜像(如 Calico、Flannel)并加载到所有节点。
八、故障排除
8.1 镜像拉取失败
bash
1# 检查镜像是否已加载2docker images34# 手动加载缺失的镜像5docker load -i /opt/opentwins-offline/images/<镜像文件>.tar8.2 Pod 无法启动
bash
1# 查看 Pod 详情2kubectl describe pod <pod-name>34# 查看日志5kubectl logs <pod-name>67# 检查事件8kubectl get events --sort-by='.lastTimestamp'8.3 Helm 安装失败
bash
1# 查看详细日志2helm upgrade --install opentwins ./OpenTwins-*.tgz --debug34# 检查 values5helm get values opentwins67# 回滚8helm rollback opentwins8.4 MQTT 连接问题
bash
1# 检查 Mosquitto 服务2kubectl get svc mosquitto3kubectl logs <mosquitto-pod>45# 测试 MQTT 连接(需要 mosquitto-clients)6mosquitto_pub -h localhost -p 1883 -t "test" -m "hello"8.5 数据未存储到 InfluxDB
bash
1# 检查 Ditto 连接状态2kubectl logs <ditto-connectivity-pod>34# 检查 InfluxDB5kubectl exec -it <influxdb-pod> -- influx6# 在 influx CLI 中7> use opentwins8> show measurements9> select * from mqtt_consumer limit 10九、性能优化
9.1 资源限制
编辑 Helm values 文件设置资源限制:
yaml
1resources:2 limits:3 cpu: 2000m4 memory: 4Gi5 requests:6 cpu: 1000m7 memory: 2Gi9.2 持久化存储
配置 PersistentVolume 用于数据持久化:
yaml
1persistence:2 enabled: true3 storageClass: "local-storage"4 size: 20Gi9.3 高可用配置
增加副本数:
yaml
1replicaCount: 3十、备份与恢复
10.1 备份数据
bash
1# 备份 InfluxDB2kubectl exec <influxdb-pod> -- influxd backup /backup3kubectl cp <influxdb-pod>:/backup ./influxdb-backup45# 备份 MongoDB (Ditto 数据)6kubectl exec <mongodb-pod> -- mongodump --out /backup7kubectl cp <mongodb-pod>:/backup ./mongodb-backup89# 备份 Kubernetes 配置10kubectl get all --all-namespaces -o yaml > k8s-backup.yaml10.2 恢复数据
bash
1# 恢复 InfluxDB2kubectl cp ./influxdb-backup <influxdb-pod>:/backup3kubectl exec <influxdb-pod> -- influxd restore /backup45# 恢复 MongoDB6kubectl cp ./mongodb-backup <mongodb-pod>:/backup7kubectl exec <mongodb-pod> -- mongorestore /backup十一、卸载
bash
1# 卸载 OpenTwins2helm uninstall opentwins34# 删除持久卷声明5kubectl delete pvc --all67# 停止 minikube8minikube stop9minikube delete1011# 清理 Docker 资源12docker system prune -a十二、参考资源
十三、高级功能
部署完成后,可以探索以下高级功能:
- AI/ML 模型集成: 在数字孪生中集成机器学习模型
- 3D 可视化: 添加 3D 模型展示
- FMI 仿真: 集成 FMU 功能模拟单元
- 边缘计算: 部署边缘节点进行分布式计算
- 访问控制: 配置 Eclipse Ditto 策略进行细粒度权限管理
文档说明
本文档基于 OpenTwins 官方快速入门指南编写,针对 Linux 离线环境进行了优化和扩展。 最后更新:2025-10
重要提示
离线部署需要仔细规划和充分准备。建议先在联网环境测试完整流程,确保所有资源准备齐全后再进行离线部署。
评论