亿琪软件-开源博客 - 默认分类
type: channel
link: https://www.yiqisoft.cn/blogs/category/default/
description: 只是一个默认分类
items: 分享-OpenWrt 双 wan 出口实现负载均衡和带宽叠加（每个链接单独出口）
items: 在 kubeflow 自定义 namespace 创建的 inferenceService 无法访问，出现 403 错误，RBAC: access denied
items: Linux运维笔记：修复 ThinLinc 会话数据库损坏问题
items: 在 ubuntu22.04 中 安装 EdgeX 并运行 device-sdk-c sample
items: 在 ubuntu22.04 中 安装 OpenVINO 并运行 Hello Classification C Sample
items: 端口转发与反向代理实现本机连接远程内网
items: 使用 FRP 将本地 SSH 服务暴露到远程主机
items: 创建自签名的数字证书
items: K3S 私有化部署方案实践
items: 离线安装 docker

分享-OpenWrt 双 wan 出口实现负载均衡和带宽叠加（每个链接单独出口）
type: item
date: 2025-06-16T04:43:00+00:00
description: 情况说明 OpenWrt 安装 网络链接 有线网络 无线网络 mwan3(Multi WAN load balancing/failover) 配置 Interface Member Policy Rule 总结 单出口 双出口 情况说明 当你的网络运营商（公司IT，楼宇等）针对单独一个 IP 或设备限制了流量，比如 5MB 带宽，你可以通过以下方法实现同时使用两个外网出口（有线网络+Wi-Fi），这样总的带宽就有 5MB+5MB=10MB。但是，单个链接，还是只能有 5MB 限制。 OpenWrt 安装 opkg update opkg install mwan3 luci-app-mwan3 网络链接 有线网络 Gateway Metri: 10 Network > Interfaces WAN > Edit Advanced Settings Use default gateway: enabled Use gateway metric: 10 Save & Apply 无线网络 Gateway Metri: 20 Network > Interfaces WWAN > Edit Advanced Settings Use default gateway: enabled Use gateway metric: 20 Save & Apply mwan3(Multi WAN load balancing/failover) 配置 通过 UI 配置比较简单一些，进入 OpenWrt UI，Network -> MultiWAN Manager Interface 创建两个 interface，跟你的 Network Interfaces 里名称一样，类似如下： Member 新建两个 Member，保持 Metric 相等： Policy 把两个 Member 选中 Rule 保留两个，https 一定要保留，因为不能随便切换线路。 总结 这样的话，通过两个出口，两个连接，就可以实现带宽叠加，达到更高的下载速度。 单出口 双出口

在 kubeflow 自定义 namespace 创建的 inferenceService 无法访问，出现 403 错误，RBAC: access denied
type: item
date: 2025-04-27T14:19:00+00:00
description: 奇怪的问题 根据 inferenceService pod 来指定策略 奇怪的问题 不知道为什么，只有增加这一条规则，才能访问。试了很多方法，只有这个奏效。 apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-all namespace: yiqisoft spec: rules: - {} 根据 inferenceService pod 来指定策略 apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-ovms namespace: yiqisoft spec: selector: matchLabels: serving.kserve.io/inferenceservice: ovms rules: - {} --- apiVersion: security.istio.io/v1beta1 kind: AuthorizationPolicy metadata: name: allow-sklearn-iris namespace: yiqisoft spec: selector: matchLabels: serving.kserve.io/inferenceservice: sklearn-iris rules: - {} ``

Linux运维笔记：修复 ThinLinc 会话数据库损坏问题
type: item
date: 2025-04-14T15:53:00+00:00
description: Linux运维笔记：修复 ThinLinc 会话数据库损坏问题 ThinLinc 在多用户 Linux 工作站中的重要性 问题发现：会话数据库损坏 解决： 1. 备份数据 2.删除损坏的数据库文件 3.重启服务 4.重新检查 5.验证修复 总结 Linux运维笔记：修复 ThinLinc 会话数据库损坏问题 ThinLinc 是一个优秀的远程桌面解决方案，它让用户能够方便地访问工作站，运行复杂计算任务或进行数据分析。然而，最近我们遇到一个问题：ThinLinc 客户端无法成功连接至工作站。排查发现是 ThinLinc 的核心服务 vsmserver.service 启动失败，导致用户无法登录。经过进一步排查，发现问题源于会话数据库损坏，并成功解决了它。 ThinLinc 在多用户 Linux 工作站中的重要性 实验室的工作站通常需要配置高性能硬件，运行专业软件，但用户分布在不同地点。ThinLinc 通过虚拟会话管理（VSM）提供流畅的远程访问体验，让用户无需物理接触工作站即可完成工作。VSM 服务器（vsmserver.service）是 ThinLinc 的核心组件，负责协调用户会话。如果它出现故障，整个远程访问系统就会瘫痪。 最近，我们注意到用户反馈无法连接到工作站。运行 systemctl list-units --type=service 检查后，发现 vsmserver.service 状态为 loaded failed failed，详细情况如下所示： root@ccccs-Z790-UD-AX:/home/ccccs# systemctl list-units --type=service ... vsmagent.service loaded active running ThinLinc VSM agent vsmserver.service loaded failed failed ThinLinc VSM server whoopsie.service loaded active running crash report submission daemon ... 此时通过 systemctl 命令尝试重启该服务，发现仍不能成功启动... 问题发现：会话数据库损坏 首先查看了系统日志： sudo journalctl -u vsmserver.service 日志显示服务在启动后立即退出，状态码为 status=1/FAILURE，但没有具体错误详情。接着转向 ThinLinc 的专用日志文件： sudo cat /var/log/vsmserver.log 2025-04-14 12:26:52 INFO vsmserver: VSM Server version 4.15.0 build 3358 started 2025-04-14 12:26:52 ERROR vsmserver: Error loading session database: Error unpacking /var/lib/vsm/sessions (invalid load key, '\x00'.) 2025-04-14 12:26:52 ERROR vsmserver: Session database needs manual recovery. 2025-04-14 12:26:52 ERROR vsmserver: Exiting 发现是 /var/lib/vsm/sessions 文件损坏，导致 VSM 服务器无法加载会话数据库并退出。 这个错误提示 invalid load key, '\x00' 通常表示文件内容不完整或被意外修改，可能是磁盘问题、异常关机或软件 bug 导致。(工作站会偶尔发生断电或人为重启) 解决： 1. 备份数据 sudo cp -r /var/lib/vsm/sessions /var/lib/vsm/sessions.bak 2.删除损坏的数据库文件 ThinLinc 文档指出，损坏的 /var/lib/vsm/sessions 文件可以安全删除，服务器会在下次启动时自动重新创建。我们执行： sudo rm /var/lib/vsm/sessions 注意：删除会话数据库会清除当前会话记录，可能导致用户丢失未保存的会话状态。在我们的场景中，实验室用户主要运行短期任务，影响较小，但也要确保此时每人连接。 3.重启服务 sudo systemctl start vsmserver.service 4.重新检查 systemctl list-units --type=service # 启动成功 vsmserver.service loaded active running ThinLi…

在 ubuntu22.04 中 安装 EdgeX 并运行 device-sdk-c sample
type: item
date: 2025-03-13T09:15:00+00:00
description: 在 ubuntu22.04 中 安装 EdgeX 并运行 device-sdk-c sample 1.克隆源码-EdgeX 2.安装工具 3.编译运行-EdgeX 4.克隆源码-SDK-C 5.添加第三方依赖库 6.编译-C SDK 7.编译运行 random 设备服务示例 总结 在 ubuntu22.04 中 安装 EdgeX 并运行 device-sdk-c sample EdgeX Foundry 作为一个开源的边缘计算框架，为开发者提供了一个灵活、可扩展的平台，用于构建和管理边缘设备及服务。然而，对于初次接触 EdgeX 的用户来说，从零开始安装并运行其相关组件（如 device-sdk-c 示例）可能会面临不少挑战。 无论是环境的配置、依赖的安装，还是编译与调试的过程，每一步都需要细致的操作和清晰的思路。本文将以 Ubuntu 22.04 为基础平台，详细记录如何从克隆 EdgeX 源码到成功运行 device-sdk-c 的 sample 示例的全过程。希望通过这篇博客，不仅能为新手提供一份实用的操作指南，也能让有经验的开发者在遇到问题时找到解决思路。 1.克隆源码-EdgeX 在开始安装 EdgeX 之前，我们需要先获取其源码，而 GitHub 是获取最新版本的最佳途径。为了让后续操作更加有条理，我们首先在用户主目录下创建一个专属的工作目录，用于存放 EdgeX 相关的文件。以下是具体操作： 打开终端，输入以下命令创建一个名为 edgex 的文件夹，并进入该目录： mkdir edgex && cd edgex 接下来，我们需要从 GitHub 上克隆 EdgeX 的 Compose 文件仓库，这是运行 EdgeX 服务的核心配置文件集合。执行以下命令： git clone https://github.com/edgexfoundry/edgex-compose.git cd edgex-compose 结果显示如下： root@ubuntu:/home/ubuntu# mkdir edgex && cd edgex root@ubuntu:/home/ubuntu/edgex# git clone https://github.com/edgexfoundry/edgex-compose.git Cloning into 'edgex-compose'... remote: Enumerating objects: 5826, done. remote: Counting objects: 100% (3563/3563), done. remote: Compressing objects: 100% (319/319), done. remote: Total 5826 (delta 3504), reused 3250 (delta 3244), pack-reused 2263 (from 3) Receiving objects: 100% (5826/5826), 1.59 MiB | 1.76 MiB/s, done. Resolving deltas: 100% (4949/4949), done. root@ubuntu:/home/ubuntu/edgex# ls edgex-compose 输出信息显示了克隆进度，最终 ls 命令确认目录中已存在 edgex-compose 文件夹，说明这一步成功完成。 2.安装工具 EdgeX 的部署离不开 Docker，因为它通过容器化技术简化了服务的管理和运行。因此，我们需要先在 Ubuntu 系统中安装 Docker。以下是详细的安装步骤： 使用官方脚本安装 Docker，并指定阿里云镜像源以加速下载： curl -fsSL https://get.docker.com -o get-docker.sh sh get-docker.sh --mirror Aliyun docker -v 第一条命令通过 curl 下载安装脚本并保存为 get-docker.sh 文件；第二条命令执行脚本，--mirror Aliyun 参数指定使用阿里云镜像源，避免默认源下载缓慢；最后通过 docker -v 检查版本，确保安装成功。安装过程的输出类似： root@ubuntu:/home/ubuntu# curl -fsSL https://get.docker.com -o get-docker.sh root@ubuntu:/home/ubuntu# sh get-docker.sh --mirror Aliyun # Executing docker install script, commit: 4c94a56999e10efcf48c5b8e3f6a…

在 ubuntu22.04 中 安装 OpenVINO 并运行 Hello Classification C Sample
type: item
date: 2025-03-11T08:40:00+00:00
description: 在 ubuntu22.04 中 安装 OpenVINO 并运行 Hello Classification C Sample 1.克隆源码 2.安装依赖 和 编译 3.安装项目 4.配置环境变量 5.编译 Sample 总结 在 ubuntu22.04 中 安装 OpenVINO 并运行 Hello Classification C Sample 从GitHub上获取一个项目的源码并成功运行其Demo，虽然看似简单，但实际上涉及多个步骤和注意事项。这个过程不仅需要对Git的基本操作有所了解，还需要根据项目的具体需求进行环境配置、依赖安装和构建工具的使用。以下是一个相对通用的流程，以OpenVINO项目的编译、安装、运行为例，详细描述从克隆源码到运行Demo的各个步骤。 1.克隆源码 在 root 下创建文件夹目录 mkdir devel && cd devel mkdir openvino && cd 克隆新版本源码 git clone -b 2025.0.0 https://github.com/openvinotoolkit/openvino.git 注意版本号2025.0.0 2.安装依赖 和 编译 编译流程中，前2~5点参考的https://github.com/openvinotoolkit/openvino/blob/2025.0.0/docs/dev/build_linux.md 编译和构建软件之前，安装必要的开发工具和库： sudo apt install build-essential -y OpenVINO 包含一些子模块，还需要更新，国内推荐使用gitee：（时间稍长 须作等待） cd openvino chmod +x scripts/submodule_update_with_gitee.sh ./scripts/submodule_update_with_gitee.sh 使用项目根目录脚本安装依赖项： sudo ./install_build_dependencies.sh 编译的准备工作： mkdir build && cd build OpenVINO Runtime使用基于CMake的构建系统。在创建的构建目录中，运行cmake获取项目依赖关系并创建Unix makefile，然后运行make构建项目： cmake -DCMAKE_BUILD_TYPE=Release .. cmake --build . --parallel 4 （ 通过 nproc 命令查询到 CPU 核心数为 4 ）编译时间漫长，成功后显示如下： 3.安装项目 目的: 将编译结果安装到系统指定位置。 在 build 文件下执行安装命令： sudo cmake --install . 文件会被安装到 /usr/local 如果只是运行 sample，可以跳过此步，直接使用构建目录中的文件。但建议规范安装好完整项目，从 /usr/local/sample 下获取 sample 源码和编译文件。 此时注意到：/usr/local/include 为 openvino 规范的头文件路径，/usr/local/lib/intel64/ 为规范的库文件路径。在 install 之前，二者的路径为/源码/src/bindings/c/include 以及/bin/intel64/Release ，使用它们并不规范！ 4.配置环境变量 目的: 告诉系统的动态链接器等（ld.so）在运行时查找共享库（.so 文件）的额外路径。在 OpenVINO 的例子中，/usr/local/lib/intel64/ 包含编译后的动态库（如 libopenvino.so），程序运行时需要这些库。如果这个路径没有被正确设置，运行程序时可能会遇到错误。openvino 提供了配置脚本 /usr/local/setupvars.sh ，执行 source 命令启动它： source /usr/local/setupvars.sh 注意： 不能直接执行 ./usr/local/setupvars.sh 。因为./setupvars.sh 会在一个新的子 Shell 进程中执行脚本。脚本中设置的环境变量只在子进程中生效，子进程结束后，这些修改不会传递回父 Shell（即你的当前终端）。 OpenVINO 的 setupvars.sh 脚本也是临时的，除非你每次打开终端都运行它，否则需要手动永久设置。 永久设置：（设置需要用到的环境变量） vim ~/.bashrc # .bashrc末尾添加 export LD_LIBRARY_PATH=/usr/local/runtime/3rdparty/tbb/lib:/usr/local/runtime/lib/inte…

端口转发与反向代理实现本机连接远程内网
type: item
date: 2025-02-14T02:28:50+00:00
description: 端口转发与反向代理实现本机连接远程内网 在日常工作中，特别是对网络管理、系统运维、开发调试等任务而言，有时需要通过 SSH 来访问远程内网资源。为了实现这一目标，可以利用 端口转发 和 反向代理 技术。通过 SSH 的端口转发功能，可以把本地的流量转发到远程网络，进而访问远程内网的资源。本文将介绍如何通过 SSH 端口转发和反向代理技术来实现本机连接远程内网。 1. 本机连接远程内网：本地端口转发 首先，假设我们有一台远程服务器 120.120.120.120，我们希望通过本机访问该服务器内网中的某个服务（例如，位于 127.0.0.1:1000 的服务）。通过设置 本地端口转发（Local Port Forwarding），可以将本机的流量转发到远程服务器上，然后访问该服务。 命令： ssh -L 1000:127.0.0.1:1000 120.120.120.120 参数解析： -L 1000:127.0.0.1:1000： 1000（本地端口）：指定本机的端口，用于监听。 127.0.0.1:1000（远程目标地址和端口）：表示远程服务器内部的目标地址和端口，这里的 127.0.0.1 表示远程服务器上的本地回环地址，1000 是远程服务器的端口。 本地计算机会监听本地端口 1000，然后把流量转发到远程服务器的 127.0.0.1:1000。 120.120.120.120： 远程服务器的 IP 地址，表示 SSH 的目标服务器。 工作原理： 当你在本地计算机上访问 127.0.0.1:1000 时，流量会被转发到远程服务器 120.120.120.120 的 127.0.0.1:1000 地址。 这意味着，本地计算机就像直接连接到了远程服务器内网中的服务一样，通过 SSH 隧道实现了端口转发。 2. 远程服务器连接本地服务器：动态端口转发 假设远程服务器 50.50.50.50 上有一个服务需要通过 SSH 隧道来访问本地的资源。可以通过 动态端口转发（Dynamic Port Forwarding） 技术，配置一个 SOCKS 代理，从而将远程服务器的数据流量通过 SSH 隧道转发到本地计算机，进而访问内网资源。 命令： ssh -D 2000 50.50.50.50 参数解析： -D 2000： 2000（本地端口）：指定本地计算机上用于监听的端口，此端口将充当 SOCKS 代理服务器。 该命令会在本地启动一个 SOCKS 代理服务器，监听端口 2000。 通过该代理服务器，所有从本地发送到端口 2000 的流量将被发送到远程服务器 50.50.50.50，然后通过该服务器转发到目标地址。 50.50.50.50： 远程服务器的 IP 地址，表示 SSH 的目标服务器。 工作原理： 本地计算机会在 2000 端口上启动一个 SOCKS 代理，所有流量会通过这个代理发送到远程服务器 50.50.50.50。 远程服务器通过 SSH 隧道将流量发送到最终目标，例如内网服务。 这样一来，本地计算机就能够通过远程服务器来访问内网资源。 3. 端口转发与反向代理的结合 通过端口转发和反向代理的结合，可以实现本地计算机通过远程服务器访问内网资源，也可以通过远程服务器反向访问本地内网资源。两者结合，形成了一条完整的 SSH 隧道链路，解决了很多需要穿越防火墙和 NAT 网络的场景。 常见的应用场景： 远程桌面访问：通过端口转发，可以将本地端口映射到远程服务器上的 RDP 服务端口（如 3389），使得本地计算机能够远程控制内网机器。 内网穿透：当本地计算机位于 NAT 网络后时，通过 SSH 端口转发可以实现内网穿透，访问远程内网服务。 网络调试与监控：开发和运维人员可以通过端口转发访问远程服务，进行调试和监控。 绕过防火墙：通过 SSH 隧道，可以将流量加密并绕过防火墙的限制，实现安全通信。 4. 总结 本文介绍了通过 端口转发 和 动态代理 技术，实现本机与远程内网的连接。通过 SSH 的端口转发功能，可以将本地的流量转发到远程服务器，再由远程服务器转发到目标内网服务。而动态端口转发则充当 SOCKS 代理，允许本地计算机通过远程服务器访问内网资源。这两种技术常常用于实现远程访问、内网穿透、远程调试等场景。掌握这些技巧，对于解决网络访问限制和提高工作效率具有重要意义。

使用 FRP 将本地 SSH 服务暴露到远程主机
type: item
date: 2025-02-14T02:28:33+00:00
description: 使用 FRP 将本地 SSH 服务暴露到远程主机 FRP（Fast Reverse Proxy）是一个高性能的反向代理应用，可以帮助我们穿透 NAT 和防火墙，将本地的服务暴露到公网上。在本篇博客中，我们将讲解如何使用 FRP 将本地的 SSH 服务暴露到远程主机，实现安全的远程访问。 1. 安装 FRP 首先，你需要从 FRP 的 GitHub 页面 下载适合你系统的版本。假设你已经成功解压 FRP 文件，并准备好 frpc（客户端）和 frps（服务器端）的可执行文件。 2. FRP 配置 FRP 配置分为两部分：客户端配置 (frpc.toml) 和服务器端配置 (frps.toml)。 FRP 服务器端配置 (frps.toml) 在远程主机上配置 FRP 服务器。frps.toml 配置文件内容如下： # frps.toml bindPort = port1 FRP 服务器将监听 port1 端口，用于 FRP 客户端与 FRP 服务器之间的控制和数据传输。 客户端通过 FRP 服务器的port1端口与服务器建立连接，所有的代理服务请求和管理通信都会通过这个端口来进行。这是 FRP 服务器暴露的端口，客户端需要连接到此端口来请求访问服务。 在 frps.toml 配置中设置了 bindPort = port1，这意味着 FRP 服务器在 port1 端口监听来自客户端的连接请求。 在 frpc.toml 配置中，客户端设置 serverPort = port1，表示客户端连接到服务器的 port1 端口进行通信。 FRP 客户端配置 (frpc.toml) # frpc.toml serverAddr = "127.0.0.1" # FRP 服务器地址，服务器和客户端在同一台机器上 serverPort = port1 # FRP 服务器端口，确保与 frps.toml 中的配置一致 proxies name = "test-tcp" # 为该代理指定一个名称 type = "tcp" # 使用 TCP 协议进行代理 localIP = "127.0.0.1" # 本地机器的 IP 地址 localPort = 22 # 本地 SSH 服务的端口，默认 SSH 端口为 22 remotePort = port2 # 远程服务器上的端口port2，将会映射到本地的 22 端口 用于暴露本地服务（如 SSH）到远程主机。 客户端的本地服务（如 SSH 服务，默认是 22 端口）通过 FRP 被映射到远程服务器上的某个端口（如 port2 端口）。此端口是客户端的本地服务经过 FRP 隧道转发到远程服务器后的端口。 在 frpc.toml 配置文件中，localPort = 22 表示客户端本地服务（如 SSH）运行在 22 端口。 remotePort = port2 表示远程服务器上的端口号，用于通过 FRP 将本地 22 端口的流量转发到远程服务器的 port2 端口。 3. 启动 FRP 服务 在远程服务器上启动 FRP 服务器端： ./frps -c ./frps.toml 在本地机器上启动 FRP 客户端： ./frpc -c ./frpc.toml 4. 验证连接 当 FRP 客户端和服务器都成功启动后，本地机器上的 SSH 服务（通常运行在 22 端口）将被暴露到远程服务器的 port2 端口。你可以通过以下命令进行连接测试： ssh -p port2 username@remote_host 5. 查看端口状态 你可以在远程服务器或本地机器上通过 netstat 命令查看端口是否成功监听。 在 Linux 上使用以下命令查看 port2 端口的状态： netstat -na | grep port2 tcp 0 0 0.0.0.0:port2 0.0.0.0:* LISTEN 6. 总结 通过以上步骤，你可以使用 FRP 将本地的 SSH 服务暴露到远程服务器。这样，即使在 NAT 或防火墙后面，你也可以通过 FRP 安全地访问本地服务。FRP 提供了高效、灵活的端口转发机制，适合多种网络环境和使用场景。 为了避免每次ssh登录输入密码，可以配置公私钥。 PS: 如何配置公私钥 生成密钥对 ssh-keygen -t rsa -b 2048 -C "your_email@example.com" 秘钥添加到远程服务器 生成的公钥 (~/.ssh/id_rsa.pub) 添加到目标服务器的 ~/.ssh/authorized_keys 文件中。 ssh-copy-id user@remote_host # 公钥直接复制到远程服务器 使用私钥连接或者直接连接 ssh -i ~/.ssh/id_rsa …

创建自签名的数字证书
type: item
date: 2024-10-08T08:13:00+00:00
description: openssl genrsa -out mydomain.key 2048 openssl req -new -key mydomain.key -out mydomain.csr openssl x509 -req -days 3650 -in mydomain.csr -signkey mydomain.key -out mydomain.crt [req] default_bits = 2048 distinguished_name = req_distinguished_name req_extensions = req_ext prompt = no [req_distinguished_name] C = CN ST = SH L = Shanghai O = YIQISOFT OU = Tech CN = harbor.yiqisoft.cn [req_ext] subjectAltName = @alt_names [alt_names] DNS.1 = harbor.yiqisoft.cn openssl req -x509 -nodes -days 3650 -newkey rsa:2048 -keyout mydomain.key -out mydomain.crt -config openssl.cnf

K3S 私有化部署方案实践
type: item
date: 2024-10-05T16:32:00+00:00
description: 准备工作 硬件 软件 基础配置 数据库配置 Docker 数据库 PostgreSQL MySQL 部署 K3S 管理集群 主机名 K3S 核心安装 自动安装(推荐) 手动二进制文件安装(不推荐) Master / Worker 手动加入(如有必要) 安装 Rancher 集群管理工具和 Harbor Registry 仓库 准备工作 安装 Kubernetes 包管理工具 Helm 安装证书管理器 cert-manager 安装 Rancher 安装 Harbor 使用 Ceph（推荐） 使用 NFS 部署 pv 和 pvc 部署 Harbor Helm 批量上传所需 image 到 Harbor 部署 K3S 业务集群 所有的 Master 和 Worker 都加入业务集群 Rancher 中创建一个新的集群 Master 加入集群(初始化业务集群) Worker 加入业务集群 (部署/更新) Harbor hub CA 证书到所有的 Master 和 Worker (手动操作)导出 Harbor hub HTTPS 证书 (自动部署)Harbor Hub CA 证书 新建一个 Secret 新建一个 DaemonSet 基于 K3S 部署业务应用(边缘计算框架) EdgeX Foundry Base 部署辅助应用：流媒体，推理服务器，NVR 部署 OpenVINO AI 应用 总结 准备工作 硬件 主 K3S Master 节点：3台, master101, master102, master103 业务 K3S Master 节点：3台，master151, master152, master153 Worker 节点：N台，随意, worker01, worker02, ... 软件 基础配置 操作系统：Ubuntu Server 22.04 最小化安装系统，包含：openssh-server, iputils-ping, net-tools, vim PRETTY_NAME="Ubuntu 22.04.5 LTS" NAME="Ubuntu" VERSION_ID="22.04" VERSION="22.04.5 LTS (Jammy Jellyfish)" 管理集群 主机名 IP 其他 database 192.168.198.100 数据库+NFS存储，如有需要做 HA master101 192.168.198.101 管理 K3S master master102 192.168.198.102 管理 K3S master master103 192.168.198.103 管理 K3S master 业务集群 主机名 IP 其他 master151 192.168.123.151 业务 K3S master + worker master152 192.168.123.152 业务 K3S master + worker master153 192.168.123.153 业务 K3S master + worker worker161 192.168.123.161 业务 worker worker162 192.168.123.162 业务 worker 数据库配置 Docker 准备 docker 环境 curl -fsSL https://get.docker.com | sh - 验证 docker docker images REPOSITORY TAG IMAGE ID CREATED SIZE 设置一个 Registry 镜像 cat /etc/docker/daemon.json { "insecure-registries" : [ "0.0.0.0/0" ], "registry-mirrors": [ "https://xxx.mirror.swr.myhuaweicloud.com" ] } 重启 docker systemctl restart docker 数据库 PostgreSQL 创建 compose.yml services: postgres: image: postgres:alpine container_name: postgres restart: unless-stopped environment: POSTGRES_USER: k3s POSTGRES_PASSWORD: talent POSTGRES_DB: k3s ports: - "5432:5432" volumes: - ./data:/var/lib/postgresql/data - ./init-db.sh:/docker-entrypoint-initdb.d/init-db.sh …

离线安装 docker
type: item
date: 2024-09-28T02:52:22+00:00
description: 下载 docker deb 文件 #!/bin/bash # Check if running as root if [ "$EUID" -ne 0 ]; then echo "Please run as root" exit fi # Check if correct number of arguments provided if [ "$#" -ne 2 ]; then echo "Usage: $0 <architecture> <distro>" exit fi ARCHITECTURE=$1 DISTRO=$2 # Current directory CURRENT_DIR=$(pwd) # URL of the HTML page with the list of Docker files HTML_URL="https://download.docker.com/linux/ubuntu/dists/${DISTRO}/pool/stable/${ARCHITECTURE}/" # Fetch the list of available packages PACKAGE_LIST=$(curl -s "$HTML_URL" | grep -oP '(?<=href=")[^"]+(?=")' | grep -oP '.*\.deb' | sort -Vr) # Function to download a package with a progress bar download_package() { PACKAGE=$1 FILENAME="${PACKAGE}" URL="${HTML_URL}${FILENAME}" echo "Downloading $FILENAME..." curl -L --progress-bar "$URL" -o "$CURRENT_DIR/$FILENAME" } # Download the latest package for each type TYPES=("containerd.io" "docker-ce" "docker-ce-cli" "docker-buildx-plugin" "docker-compose-plugin") for TYPE in "${TYPES[@]}"; do PACKAGE=$(echo "$PACKAGE_LIST" | grep "$TYPE" | head -n 1) if [ -n "$PACKAGE" ]; then download_package "$PACKAGE" fi done echo "Docker packages downloaded successfully!" 运行下载 bash docker-image.sh amd64 noble