当前位置: 首页 > article >正文

k8s(12) — 版本控制和滚动更新(金丝雀部署理念)

金丝雀部署简介:

1、基本概念

金丝雀部署是一种软件开发中的渐进式发布策略,其核心思想是通过将新版本应用逐步发布给一小部分用户(即 “金丝雀” 用户),在真实环境中验证功能稳定性和性能表现,再逐步扩大发布范围,最终完成全量更新。
名称来源:源于煤矿工人用金丝雀检测瓦斯泄漏的做法 —— 通过观察少量样本的反应,提前发现潜在风险。

2、核心流程与特点
(一)核心流程
  1. 准备阶段
    • 同时运行 ** 旧版本(稳定版本)新版本(待发布版本)** 的应用服务。
    • 配置路由规则,将少量用户流量(如 5%)导向新版本,其余流量仍指向旧版本。
  2. 监控与验证
    • 实时监控新版本的性能指标(如响应时间、错误率、资源利用率)和用户反馈(如功能异常、界面问题)。
    • 若发现严重问题,立即将流量切回旧版本(回滚);若验证通过,逐步增加新版本流量(如 10%、20%……)。
  3. 全量发布
    • 当新版本通过所有验证且流量占比达到 100% 时,完成部署,下线旧版本服务。
(二)关键特点
优点缺点
1. 风险隔离:仅少量用户受潜在问题影响,降低故障波及范围。
2. 精准验证:在真实环境中验证功能,提前发现兼容性、性能等问题。
3. 灵活回滚:支持快速切换回旧版本,减少停机时间。
1. 复杂度高:需维护新旧版本并存的环境,增加部署和监控成本。
2. 流量分配难度大:需精确控制流量比例,避免因流量不均导致验证偏差。
3. 适用场景有限:不适合需要用户状态强一致的场景(如交易系统)。
3、适用场景
  1. 功能迭代验证:如前端界面优化、新功能试点,通过小范围用户反馈迭代改进。
  2. 性能测试:在生产环境中测试新版本对服务器、数据库的负载影响。
  3. 灰度发布:与 A/B 测试结合,向不同用户群体展示不同版本,对比效果后再全量发布。
  4. 微服务架构:在分布式系统中,对单个服务进行金丝雀部署,降低整体变更风险。

部署思路:

在生产上先进行少量更新如有10个v1.0的Pod正在稳定运行,此时设置一个滚动更新为v2.0, 更新之后立马停止更新,此时有11个Pod正在运行,此时如果用户访问正常那么就全量开启滚动更新,否则就进行回退。

一、金丝雀部署-打补丁升级步骤

在 Kubernetes 中,rollout resumerollout pause是用于控制 Deployment、StatefulSet 或 DaemonSet 滚动更新过程的两个重要命令。它们允许你暂停正在进行的更新,进行检查或修改,然后恢复更新过程,提供了对滚动更新的精细控制。

1、滚动更新概念:

(一)、rollout pause:暂停滚动更新

1. 基本功能
  • 暂停当前进行中的滚动更新,使 Deployment 停止创建或更新 Pod。
  • 保留已更新的 Pod,但不会继续更新剩余的 Pod。
  • 允许修改更新参数(如镜像版本、环境变量),而不会触发新的滚动更新。
2. 适用场景
  • 在更新过程中进行中间检查(如验证部分 Pod 的运行状态)。
  • 需要临时调整更新策略(如减慢更新速度)。
  • 在更新关键应用前,预留时间进行人工确认。
3. 示例命令

bash

kubectl rollout pause deployment/my-app
4. 注意事项
  • 暂停后,Deployment 的状态会显示为ProgressingPaused: true
  • 只有 Deployment 支持暂停 / 恢复操作, ReplicaSet 和 ReplicationController 不支持。

(二)、rollout resume:恢复滚动更新

1. 基本功能
  • 继续被暂停的滚动更新,按照最新的配置继续创建或更新 Pod。
  • 应用暂停期间的配置修改,但不会触发新的滚动更新版本。
2. 适用场景
  • 在中间检查完成后,继续更新过程。
  • 在调整更新参数(如maxSurgemaxUnavailable)后,恢复更新。
3. 示例命令

bash

kubectl rollout resume deployment/my-app
4. 注意事项
  • 恢复后,Deployment 会继续使用暂停时的滚动更新策略(如spec.strategy)。
  • 如果在暂停期间修改了不允许的字段(如selector),可能导致更新失败。

(三)、典型工作流程示例

场景:更新应用并验证中间状态
  1. 启动滚动更新

    bash

    kubectl set image deployment/my-app app=my-app:v2
    
  2. 暂停更新(例如,当 50% 的 Pod 更新完成时):

    bash

    kubectl rollout pause deployment/my-app
    
  3. 验证中间状态

    bash

    kubectl get pods  # 检查已更新Pod的运行状态
    kubectl describe deployment/my-app  # 查看Deployment状态
    
  4. 调整参数(可选):

    bash

    kubectl patch deployment/my-app -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1}}}}'
    
  5. 恢复更新

    bash

    kubectl rollout resume deployment/my-app
    

(四)、常见问题与注意事项

1. 暂停后资源占用
  • 暂停期间,旧版本和新版本的 Pod 可能同时存在,需确保集群有足够资源。
2. 状态查看
  • 使用以下命令查看暂停状态:

    bash

    kubectl get deployments.apps my-app -o jsonpath='{.status.conditions[?(@.type=="Progressing")].message}'
    

    输出示例:

    plaintext

    Deployment is paused and will not progress further until resumed
    
3. 版本控制
  • 暂停 / 恢复操作不会创建新的 Rollout 版本(revision),所有修改会应用到当前进行中的更新。
4. 超时处理
  • 如果更新长时间暂停,可能触发ProgressDeadlineExceeded条件,需通过kubectl rollout restart重启更新。

(五)、与其他 Rollout 命令的对比

命令功能描述
rollout pause暂停滚动更新,允许修改配置而不触发新的更新。
rollout resume恢复被暂停的滚动更新。
rollout status查看滚动更新的状态(是否完成、进度百分比)。
rollout history查看滚动更新的历史版本。
rollout undo回滚到上一个稳定版本或指定版本。
rollout restart重启 Deployment,触发新一轮滚动更新(常用于配置刷新)。

(六)、总结

rollout pauserollout resume为 Kubernetes 滚动更新提供了灵活的控制机制,特别适合需要精细验证或调整的生产环境。通过暂停更新,你可以在关键阶段进行人工干预,确保变更安全;通过恢复更新,你可以继续完成变更流程,实现平滑过渡。合理使用这两个命令,有助于提升集群稳定性和发布效率。

2、滚动更新实现步骤

步骤一:运行v1.0版本的pod

v1.0版本的yaml

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-denamespace: delabels:app: nginx-de
spec:replicas: 3selector:matchExpressions:- key: appoperator: Invalues: [nginx-de]template:metadata:name: nginx-denamespace: delabels:app: nginx-despec:containers:- name: nginx-deimagePullPolicy: IfNotPresentimage: registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0ports:- containerPort: 80startupProbe:httpGet:path: /port: 80successThreshold: 1initialDelaySeconds: 15

步骤二:打补丁修改系统默认的更新策略

可用和不可用都是25%

修改更新策略:

#触发更新就停止滚动更新kubectl patch deploy nginx-de -n de  -p '{"spec":{"strategy":{"rollingUpdate":{"maxSurge":1,"maxUnavailable":0}}}}'

 修改之后:变成了允许超出预期的Pod数量最大值为1个。

  1. maxSurge: 1
    此参数表明在滚动更新期间,允许超出预期 Pod 数量的最大值为 1 个。打个比方,要是预期的 Pod 数量设定为 3 个,那么在更新过程中,最多会有 4 个 Pod 同时运行。

  2. maxUnavailable: 0
    该参数意味着在滚动更新时,处于不可用状态的 Pod 数量上限为 0。也就是说,在更新期间,所有预期的 Pod 都必须保持可用状态。

步骤三 :执行v2.0版本镜像的更新

kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0"}]}}}}' && kubectl rollout pause deploy nginx-de  -n de

  • 在打补丁时出现异常处理情况:
情况一: 直接回退到上一个版本

此时想回退到上一个版本:

操作步骤一:执行回滚命令会出现报错

 kubectl rollout undo  deploy nginx-de -n de

此时执行报错rollout undo命令会报错,因为是暂停了滚动更新需要回退之前得开启被暂停掉的更新!!!

操作步骤二:按照提示操作

解决方法:

执行:


#步骤一:先执行被暂停的滚动更新,再执行回滚的动作
kubectl rollout resume deploy nginx-de -n de && kubectl rollout undo deploy nginx-de -n de#步骤二:查看回滚状态是否正常kubectl rollout status deploy nginx-de -n de

情况二:出现报错修改配置参数

上述出现拉取镜像错误的信息,那么我们现在要将正确的镜像信息配置

操作步骤一:先删除之前报错的pod

步骤二:先执行继续回滚的动作再执行修改镜像配置的动作再执行暂停滚动更新动作

#步骤一:删除失败的镜像信息kubectl delete pod  nginx-de-bbd87f74d-2s6d5 -n de#步骤二:执行更新镜像信息
kubectl rollout resume deploy nginx-de -n de && \
kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0"}]}}}}' && \
kubectl rollout pause deploy nginx-de -n de#步骤三:验证
while true;do curl 10.96.62.230;done

步骤四:配置一个svc用于检测测试结果

apiVersion: v1
kind: Service
metadata:name: nginx-denamespace: de
spec:type: ClusterIPports:- port: 80targetPort: 80selector:app: nginx-de

金丝雀部署打补丁结果:

出现了4个Pod,其中1个为最新的v2.0版本,其他的为v1.0版本

测试:

[root@master deployment]# kubectl get svc -n de
NAME       TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
nginx-de   ClusterIP   10.96.62.230   <none>        80/TCP    3m49s
[root@master deployment]#
[root@master deployment]#
[root@master deployment]# while true;do curl 10.96.62.230;done

步骤五:操作异常回滚

情况一:灰度更新正常(继续开启滚动更新)

停止滚动更新目的是要看生产上有没有出现异常,如果没有异常再继续更新

继续滚动更新:

kubectl rollout resume deploy nginx-de -n de

测试更新结果:

情况二:灰度更新异常(回滚)

停止滚动更新目的是要看生产上有没有出现异常,如果有异常直接进行回滚操作

#回滚到上个版本
kubectl rollout undo deployment/nginx-de -n de

二、历史版本控制与规范

(一)、使用--record参数进行版本记录

1、--record参数使用方法
#执行yaml
kubectl apply -f  deployment.yaml --record#打补丁
kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v2.0"}]}}}}' --record#查看历史版本
kubectl rollout history deploy nginx-de -n de

2、使用--record参数记录版本号的弊端

注意:如果有一个在版本升级少加了--record,那么记录中会沿用上一个版本的的记录 这样容易在版本回退的时候造成误解。

如:

执行新的更新命令不带--record

#执行命令不带--record
kubectl patch deploy nginx-de -n de --patch '{"spec":{"template":{"spec":{"containers":[{"name":"nginx-de","image":"registry.cn-hangzhou.aliyuncs.com/yangbin-docker/nginx:v1.0"}]}}}}'

(二)、自定义版本更新规范(适用于生产环境的版本控制)

1、操作步骤

 将要更新的yaml格式设置为:xx.yaml-年-月-日-姓名-版本,再对这个新的xx.yaml-年-月-日-姓名-版本进行yaml文件进行操作

如下:

cp deployment.yaml deployment.yaml-2025-05-13-yb-nginx:v2.0

 

kubectl apply -f  deployment.yaml-2025-05-13-yb-nginx\:v2.0 --record

 

(三)、配置deploy.spec.revisionHistoryLimit(保留多少版本的历史记录)

如果使用这种当时可用将etcd中的rs记录给去掉,这个就不会造成资源消耗了。

revisionHistoryLimit 参数配置保留多少版本的历史记录:

kubectl explain deploy.spec.revisionHistoryLimit

三、回滚到指定的版本信息

 1、查看版本的历史记录加--record参数

kubectl rollout history deployment/nginx-de -n de

2、添加--to-revision=0参数回退到指定版本

2.1、查看kubectl rollout undo参数
#查看回滚的参数
kubectl rollout undo --help

2.2、--to-revision回退到指定版本
命令格式:

kubectl rollout  undo --to-revision=版本编号

目前版本是v2.0,回退到v1.0

步骤一:查看v1.0对应的版本编号 
kubectl rollout history deploy nginx-de -n de

步骤二:根据查出来的版本编号回退到指定的版本
#查出来的v1.0对应的历史版本号为3
kubectl rollout undo deploy nginx-de -n de --to-revision=3

相关文章:

k8s(12) — 版本控制和滚动更新(金丝雀部署理念)

金丝雀部署简介&#xff1a; 1、基本概念 金丝雀部署是一种软件开发中的渐进式发布策略&#xff0c;其核心思想是通过将新版本应用逐步发布给一小部分用户&#xff08;即 “金丝雀” 用户&#xff09;&#xff0c;在真实环境中验证功能稳定性和性能表现&#xff0c;再逐步扩大发…...

【git config --global alias | Git分支操作效率提升实践指南】

git config --global alias | Git分支操作效率提升实践指南 背景与痛点分析 在现代软件开发团队中&#xff0c;Git分支管理是日常工作的重要组成部分。特别是在规范的开发流程中&#xff0c;我们经常会遇到类似 feature/user-management、bugfix/login-issue 或 per/cny/dev …...

chrome源码中WeakPtr 跨线程使用详解:原理、风险与最佳实践

base::WeakPtr 在 Chromium 中 不能安全地跨线程使用。这是一个很关键的点&#xff0c;下面详细解释原因及正确用法。 &#x1f50d;原理与使用 ✅ 先说答案&#xff1a; base::WeakPtr 本质上是**线程绑定&#xff08;thread-affine&#xff09;**的。不能在多个线程之间创建…...

【Go】从0开始学习Go

文章目录 从0开始学习Go0 与C对比1 代码框架1.1 helloworld式代码示例1.2 主体代码元素&#xff08;核心三部分&#xff09;1.3 其他 2 与C/C区别3 有用的小工具4 注意事项 从0开始学习Go 0 与C对比 特性CGo编译型语言需要编译为机器码直接编译为二进制可执行文件静态类型类型…...

Windows 安装显卡驱动

1.第一步&#xff1a;打开Nvidia 官网驱动下载页面 2.第二步&#xff1a;选择相关信息&#xff0c; 玩游戏选择&#xff0c;GeForce Game Ready ,创意设计、摄影直播 选择 NVIDIA Studio 驱动程序 &#xff08;NVIDIA Studio Driver - WHQL.&#xff09; 2.第三步&#xff1…...

模块与包的导入

一、导入官方库 我们复盘下学习python的逻辑&#xff0c;所谓学习python就是学习python常见的基础语法学习你所处理任务需要用到的第三方库 类别典型库解决的问题学习门槛基础工具os、sys、json操作系统交互、序列化数据&#xff08;如读写 JSON 文件&#xff09;低科学计算n…...

Google设置app-ads.txt

问题&#xff1a; 应用上架后admob后台显示应用广告投放量受限&#xff0c;需要设置app-ads.txt才行。 如何解决&#xff1a; 官方教程: 看了下感觉不难&#xff0c;创建一个txt&#xff0c;将第二条的代码复制进行就得到app-ads.txt了。 然后就是要把这个txt放到哪才可以…...

docker安装rockerMQ

参考Docker部署RocketMQ5.x (单机部署配置参数详解不使用docker-compose直接部署)_rocketmq不推荐用docker部署-CSDN博客 镜像拉取 镜像地址&#xff1a; https://hub.docker.com/r/apache/rocketmq/tags 我在部署的时候最新发行版是5.1.0可以根据需求自行选择一个5.x的版本&a…...

交叉引用、多个参考文献插入、跨文献插入word/wps中之【插入[1-3]、连续文献】

我们在写论文时&#xff0c;需要插入大量参考文献。 有时&#xff0c;一句话需要引用多个文献&#xff0c;如&#xff1a;[1-3]或者[1,3,4]这种形式多个文献插入、跨文献插入。 在上一篇文章中&#xff0c;我们提到可以直接打“-”或者“&#xff0c;”&#xff0c;但是word导出…...

PLC双人舞:profinet转ethernet ip网关奏响施耐德与AB的协奏曲

PLC双人舞&#xff1a;ethernet ip转profinet网关奏响施耐德与AB的协奏曲 案例分析&#xff1a;施耐德PLC与AB PLC的互联互通 在现代工业自动化中&#xff0c;设备之间的互联互通至关重要。本案例旨在展示如何通过北京倍讯科技的EtherNet/IP转Modbus网关&#xff0c;将施耐德P…...

Image and depth from a conventional camera with a coded aperture论文阅读

Image and depth from a conventional camera with a coded aperture 1. 研究目标与实际意义1.1 研究目标1.2 实际问题与产业意义2. 创新方法:编码光圈设计与统计模型2.1 核心思路2.2 关键公式与模型架构2.2.1 图像形成模型2.2.2 深度可区分性准则2.2.3 统计模型与优化框架2.2…...

缺乏团队建设活动,如何增强凝聚力?

当一个团队缺乏系统性的建设活动时&#xff0c;成员之间容易产生疏离感、误解与信任缺失&#xff0c;最终影响整体执行力和目标达成。要有效增强团队凝聚力&#xff0c;应从设计高参与感的团队活动、结合业务与人文目标、营造持续共创的文化机制、推动跨层级协作互动等层面着手…...

特征筛选方法总结

非模型方法 一.FILTER过滤法&#xff1a; 1.缺失值比例&#xff08;80%以上缺失则删除&#xff09;/方差 注意&#xff1a; 连续变量只删方差为0的&#xff0c;因为变量取值范围会影响方差大小。 离散类的看各类取值占比,如果是三分类变量可以视作连续变量。 函数&#xff1a;V…...

力扣HOT100之二叉树:230. 二叉搜索树中第 K 小的元素

这道题直接用最笨的办法来做的&#xff0c;用递归来做&#xff0c;我们定义一个全局变量vector<int> element&#xff0c;然后使用中序遍历&#xff0c;每当碰到一个非空节点就将其加入到向量中&#xff0c;这样依赖当向量中的元素小于k时&#xff0c;就返回0&#xff0c…...

pinia.defineStore is not a function

错误信息表明 pinia.defineStore 不是一个函数,这通常意味着 pinia 没有被正确导入或初始化。 解决方案 检查 Pinia 的导入 确保你从 pinia 中正确导入了 defineStore。正确的导入方式应该是: javascript import { defineStore } from ‘pinia’; 如果你使用的是 createPin…...

入职软件开发与实施工程师了后........

时隔几个月没有创作的我又回来了&#xff0c;这几个月很忙&#xff0c;我一直在找工作&#xff0c;在自考&#xff08;顺便还处理了一下分手的事&#xff09;&#xff0c;到处奔波&#xff0c;心力交瘁。可能我骨子里比较傲吧。我不愿意着急谋生&#xff0c;做我不愿意做的普通…...

PCL点云库点云数据处理入门系列教材目录(2025年5月更新....)

PCL点云库点云数据处理入门系列教材目录 基础阶段 第 1 讲&#xff1a;PCL库简介和安装&#xff08;Win10/11VS2019PCL 1.12.0&#xff09;第 2 讲&#xff1a;PCL库中点云基本知识和数据类型结构第 3 讲&#xff1a;PCL库中点云数据格式PCD和PLY及其输入输出&#xff08;IO&…...

Linux面试题集合(5)

把文件1的内容追加到文件2 cat 文件1>>文件2 把文件1和文件2合并成文件3 cat 文件1 文件2>文件3 使用less查看文件时&#xff0c;搜寻ab字符 /ab 用more和less如何查看文件 more&#xff1a; CtrlF -- 向下滚动一屏 CtrlB -- 返回上一屏 f -- 向下翻屏 b -- 向上翻屏 …...

python动漫论坛管理系统

目录 技术栈介绍具体实现截图系统设计研究方法&#xff1a;设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理&#xff0c;难度适中&#xf…...

【ubuntu24.04】pycharm 死机结束进程

windows 远程pycharm到ubuntu执行程序 pycharm 在调试过程中&#xff0c;内存耗尽&#xff0c;然后死机了 pycharm 进程 (base) rootk8s-master-pfsrv:/home/zhangbin/下载# ps -ef | grep pycharm root 121245 3230568 0 5月14 pts/8 00:00:00 /bin/bash --rcfile …...

Java 中Supplier延迟生成值的原因

在编程中&#xff0c;延迟生成值&#xff08;Lazy Value Generation&#xff09; 是指将值的计算或生成过程推迟到真正需要使用该值时才执行。这一机制的核心是避免不必要的计算&#xff0c;提升程序的性能和资源利用率。结合 Supplier 和 Optional 的使用场景&#xff0c;我们…...

设置windows10同时多用户登录方法

RDP wrapper 的版本更新停止在2017年&#xff0c; 找到网上其它大神更新的软件&#xff0c; 参考&#xff1a;RDPWrap v1.8.9.9 (Windows家庭版开启远程桌面、Server解除远程数量限制&#xff09; - 吾爱破解 - 52pojie.cn 我的需求是在离线环境中布置&#xff0c;方法是&…...

Web 技术与 Nginx 网站环境部署

这里写目录标题 一. Web基础域名和DNS域名的概念域名的结构域名结构类型 Hosts文件Hosts文件的作用修改Hosts文件 DNS域名注册 网页与HTML网页概述HTML概述HTML基本标签HTML语法规则HTML文件结构 网站和主页Web1.0 与 Web2.0 静态网页与动态网页静态网页动态网页动态网页语言 H…...

分组背包问题:如何最大化背包价值?

有 N 组物品和一个容量是 V 的背包。 每组物品有若干个&#xff0c;同一组内的物品最多只能选一个。 每件物品的体积是 vij &#xff0c;价值是 wij &#xff0c;其中 i 是组号&#xff0c;j 是组内编号。 求解将哪些物品装入背包&#xff0c;可使物品总体积不超过背包容量&…...

nodejs快速入门到精通1

参考 nodejs快速入门到精通 菜鸟教程-nodejs nodejs官方文档 原因 视频免费 资料收费 笔记还是自己写吧 安装 nodejs官网 windows下&#xff1a; #查看nodejs版本 node -v #查看npm版本 npm -v #设置npm为淘宝镜像源 npm config set registry https://registry.npmmirror.…...

FP8精度革命:Hopper架构下大模型训练的误差传播控制方法

点击 “AladdinEdu&#xff0c;同学们用得起的【H卡】算力平台”&#xff0c;H卡级别算力&#xff0c;按量计费&#xff0c;灵活弹性&#xff0c;顶级配置&#xff0c;学生专属优惠。 一、FP8为何成为大模型训练的新范式&#xff1f; 1.1 算力需求与精度演进的矛盾 当前大语言…...

手动制做一个Transformer

本文来自I made a transformer by hand . 一直以来&#xff0c;笔者对 transformer 的注意力机制、qkv的理解都浮于表面&#xff0c;当然也不是说我看完 I made a transformer by hand 后理解有多深入&#xff0c;但确实加深了我对相关概念的理解&#xff0c;故搬运此文章&…...

已解决——如何让网站实现HTTPS访问?

一、申请SSL证书 SSL证书是HTTPS实现的关键&#xff0c;它由受信任的证书颁发机构&#xff08;CA&#xff09;签发&#xff0c;用于验证网站的身份并加密数据传输。以下是申请SSL证书的常见步骤&#xff1a; 选择证书类型 根据网站的需求和预算&#xff0c;选择合适的SSL证书…...

WebRTC技术EasyRTC嵌入式音视频通信SDK助力智能电视搭建沉浸式实时音视频交互

一、方案概述​ EasyRTC是一款基于WebRTC技术的开源实时音视频通信解决方案&#xff0c;具备低延迟、高画质、跨平台等优势。将EasyRTC功能应用于智能电视&#xff0c;能够为用户带来全新的交互体验&#xff0c;满足智能电视在家庭娱乐、远程教育、远程办公、远程医疗等多种场…...

Unreal Engine: Windows 下打包 AirSim项目 为 Linux 平台项目

环境&#xff1a; Windows: win10, UE4.27, Visual Studio 2022 Community.Linux: 22.04 windows环境安装教程&#xff1a; 链接遇到的问题&#xff08;问题&#xff1a;解决方案&#xff09; 点击Linux打包按钮&#xff0c;跳转至网页而不是执行打包流程&#xff1a;用VS打开项…...