0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

使用Kubernete实现应用的蓝绿部署

马哥Linux运维 来源:稀土掘金 作者:chulinx 2022-08-20 14:57 次阅读

背景介绍

某些情况下,我们在使用Kubernetes作为业务应用的云平台,想要实现应用的蓝绿部署用来迭代应用版本,用lstio太重太复杂,而且它本身定位于流控和网格治理;Ingress-Nginx在0.21版本引入了Canary功能,可以为网关入口配置多个版本的应用程序,使用annotation来控制多个后端服务的流量分配。

Ingress-Nginx-Annotation Canary 功能介绍

如果想启用Canary功能,要先设置nginx.ingress.kubernetes.io/canary: "true",然后可以启用以下注释来配置Canary

nginx.ingress.kubernetes.io/canary-weight 请求到Canary ingress中指定的服务的请求百分比,值为0-100的整数,根据设置的值来决定大概有百分之多少的流量会分配Canary Ingress中指定的后端s服务

nginx.ingress.kubernetes.io/canary-by-header 基于request header 的流量切分,适用于灰度发布或者A/B测试,当设定的hearder值为always是,请求流量会被一直分配到Canary入口,当hearder值被设置为never时,请求流量不会分配到Canary入口,对于其他hearder值,将忽略,并通过优先级将请求流量分配到其他规则

nginx.ingress.kubernetes.io/canary-by-header-value 这个配置要和nginx.ingress.kubernetes.io/canary-by-header 一起使用,当请求中的hearder key和value 和nginx.ingress.kubernetes.io/canary-by-header nginx.ingress.kubernetes.io/canary-by-header-value匹配时,请求流量会被分配到Canary Ingress入口,对于其他任何hearder值,将忽略,并通过优先级将请求流量分配到其他规则

nginx.ingress.kubernetes.io/canary-by-cookie 这个配置是基于cookie的流量切分,也适用于灰度发布或者A/B测试,当cookie值设置为always时,请求流量将被路由到Canary Ingress入口,当cookie值设置为never时,请求流量将不会路由到Canary入口,对于其他值,将忽略,并通过优先级将请求流量分配到其他规则

金丝雀规则按优先顺序进行如下排序:canary-by-header - > canary-by-cookie - > canary-weight

基于权重的小规模版本测试

v1版本编排文件

apiVersion:extensions/v1beta1
kind:Ingress
metadata:
annotations:
kubernetes.io/ingress.class:nginx
labels:
app:echoserverv1
name:echoserverv1
namespace:echoserver
spec:
rules:
-host:echo.chulinx.com
http:
paths:
-backend:
serviceName:echoserverv1
servicePort:8080
path:/
---
kind:Service
apiVersion:v1
metadata:
name:echoserverv1
namespace:echoserver
spec:
selector:
name:echoserverv1
type:ClusterIP
ports:
-name:echoserverv1
port:8080
targetPort:8080
---
apiVersion:extensions/v1beta1
kind:Deployment
metadata:
name:echoserverv1
namespace:echoserver
labels:
name:echoserverv1
spec:
template:
metadata:
labels:
name:echoserverv1
spec:
containers:
-image:mirrorgooglecontainers/echoserver:1.10
name:echoserverv1
ports:
-containerPort:8080
name:echoserverv1

查看v1版本创建的资源

$[K8sSj]kubectlgetpod,service,ingress-nechoserver
NAMEREADYSTATUSRESTARTSAGE
pod/echoserverv1-657b966cb5-7grqs1/1Running024h

NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
service/echoserverv1ClusterIP10.99.68.728080/TCP24h

NAMEHOSTSADDRESSPORTSAGE
ingress.extensions/echoserverv1echo.chulinx.com8024h

访问v1的服务,可以看到10个请求都是访问到一个pod上也就是v1版本的服务

$[K8sSj]foriin`seq10`;docurl-secho.chulinx.com|grepHostname;done
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs

创建v2版本的服务

我们开启canary功能,将v2版本的权重设置为50%,这个百分比并不能精确的将请求平均分配到两个版本的服务,而是在50%上下浮动

apiVersion:extensions/v1beta1
kind:Ingress
metadata:
annotations:
kubernetes.io/ingress.class:nginx
nginx.ingress.kubernetes.io/canary:"true"
nginx.ingress.kubernetes.io/canary-weight:"50"
labels:
app:echoserverv2
name:echoserverv2
namespace:echoserver
spec:
rules:
-host:echo.chulinx.com
http:
paths:
-backend:
serviceName:echoserverv2
servicePort:8080
path:/
---
kind:Service
apiVersion:v1
metadata:
name:echoserverv2
namespace:echoserver
spec:
selector:
name:echoserverv2
type:ClusterIP
ports:
-name:echoserverv2
port:8080
targetPort:8080
---
apiVersion:extensions/v1beta1
kind:Deployment
metadata:
name:echoserverv2
namespace:echoserver
labels:
name:echoserverv2
spec:
template:
metadata:
labels:
name:echoserverv2
spec:
containers:
-image:mirrorgooglecontainers/echoserver:1.10
name:echoserverv2
ports:
-containerPort:8080
name:echoserverv2

创建v2版本的服务

我们开启canary功能,将v2版本的权重设置为50%,这个百分比并不能精确的将请求平均分配到两个版本的服务,而是在50%上下浮动

apiVersion:extensions/v1beta1
kind:Ingress
metadata:
annotations:
kubernetes.io/ingress.class:nginx
nginx.ingress.kubernetes.io/canary:"true"
nginx.ingress.kubernetes.io/canary-weight:"50"
labels:
app:echoserverv2
name:echoserverv2
namespace:echoserver
spec:
rules:
-host:echo.chulinx.com
http:
paths:
-backend:
serviceName:echoserverv2
servicePort:8080
path:/
---
kind:Service
apiVersion:v1
metadata:
name:echoserverv2
namespace:echoserver
spec:
selector:
name:echoserverv2
type:ClusterIP
ports:
-name:echoserverv2
port:8080
targetPort:8080
---
apiVersion:extensions/v1beta1
kind:Deployment
metadata:
name:echoserverv2
namespace:echoserver
labels:
name:echoserverv2
spec:
template:
metadata:
labels:
name:echoserverv2
spec:
containers:
-image:mirrorgooglecontainers/echoserver:1.10
name:echoserverv2
ports:
-containerPort:8080
name:echoserverv2

再次查看创建的资源

$[K8sSj]kubectlgetpod,service,ingress-nechoserver
NAMEREADYSTATUSRESTARTSAGE
pod/echoserverv1-657b966cb5-7grqs1/1Running024h
pod/echoserverv2-856bb5758-f9tqn1/1Running04s

NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
service/echoserverv1ClusterIP10.99.68.728080/TCP24h
service/echoserverv2ClusterIP10.111.103.1708080/TCP4s

NAMEHOSTSADDRESSPORTSAGE
ingress.extensions/echoserverv1echo.chulinx.com8024h
ingress.extensions/echoserverv2echo.chulinx.com804s

访问测试

可以看到请求有4个落到v2版本,6个落到v1版本,理论上来说,请求说越多,落到v2版本的请求数越接近设置的权重50%

$[K8sSj]foriin`seq10`;docurl-secho.chulinx.com|grepHostname;done
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs

基于header的A/B测试

更改v2版本的编排文件

增加headernginx.ingress.kubernetes.io/canary-by-header: "v2"

apiVersion:extensions/v1beta1
kind:Ingress
metadata:
annotations:
kubernetes.io/ingress.class:nginx
nginx.ingress.kubernetes.io/canary:"true"
nginx.ingress.kubernetes.io/canary-weight:"50"
nginx.ingress.kubernetes.io/canary-by-header:"v2"
labels:
app:echoserverv2
name:echoserverv2
namespace:echoserver
spec:
rules:
-host:echo.chulinx.com
http:
paths:
-backend:
serviceName:echoserverv2
servicePort:8080
path:/
---
kind:Service
apiVersion:v1
metadata:
name:echoserverv2
namespace:echoserver
spec:
selector:
name:echoserverv2
type:ClusterIP
ports:
-name:echoserverv2
port:8080
targetPort:8080
---
apiVersion:extensions/v1beta1
kind:Deployment
metadata:
name:echoserverv2
namespace:echoserver
labels:
name:echoserverv2
spec:
template:
metadata:
labels:
name:echoserverv2
spec:
containers:
-image:mirrorgooglecontainers/echoserver:1.10
name:echoserverv2
ports:
-containerPort:8080
name:echoserverv2

更新访问测试

测试了header 为v2:always v2:never v2:true这三个hearder值,可以看到当hearder为v2:always时,流量会全部流入v2,当v2:never时,流量会全部流入v1,当v2:true时,也就是非always/never,流量会按照配置的权重流入对应版本的服务

$[K8sSj]kubectlapply-fappv2.yml
ingress.extensions/echoserverv2configured
service/echoserverv2unchanged
deployment.extensions/echoserverv2unchanged
$[K8sSj]foriin`seq10`;docurl-s-H"v2:always"echo.chulinx.com|grepHostname;done
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
$[K8sSj]foriin`seq10`;docurl-s-H"v2:never"echo.chulinx.com|grepHostname;done
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
$[K8sSj]foriin`seq10`;docurl-s-H"v2:true"echo.chulinx.com|grepHostname;done
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn

自定义header-value

apiVersion:extensions/v1beta1
kind:Ingress
metadata:
annotations:
kubernetes.io/ingress.class:nginx
nginx.ingress.kubernetes.io/canary:"true"
nginx.ingress.kubernetes.io/canary-weight:"50"
nginx.ingress.kubernetes.io/canary-by-header:"v2"
nginx.ingress.kubernetes.io/canary-by-header-value:"true"
labels:
app:echoserverv2
name:echoserverv2
namespace:echoserver
spec:
rules:
-host:echo.chulinx.com
http:
paths:
-backend:
serviceName:echoserverv2
servicePort:8080
path:/
---
kind:Service
apiVersion:v1
metadata:
name:echoserverv2
namespace:echoserver
spec:
selector:
name:echoserverv2
type:ClusterIP
ports:
-name:echoserverv2
port:8080
targetPort:8080
---
apiVersion:extensions/v1beta1
kind:Deployment
metadata:
name:echoserverv2
namespace:echoserver
labels:
name:echoserverv2
spec:
template:
metadata:
labels:
name:echoserverv2
spec:
containers:
-image:mirrorgooglecontainers/echoserver:1.10
name:echoserverv2
ports:
-containerPort:8080
name:echoserverv2

更新测试

可以看到只有header为v2:never时,请求流量才会流入v2版本,其他值流量都会按照权重设置流入不同版本的服务

$[K8sSj]kubectlapply-fappv2.yml
ingress.extensions/echoserverv2configured
service/echoserverv2unchanged
deployment.extensions/echoserverv2unchanged

$[K8sSj]foriin`seq10`;docurl-s-H"v2:true"echo.chulinx.com|grepHostname;done
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn

$[K8sSj]foriin`seq10`;docurl-s-H"v2:always"echo.chulinx.com|grepHostname;done
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn

$[K8sSj]foriin`seq10`;docurl-s-H"v2:never"echo.chulinx.com|grepHostname;done
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs

访问测试

可以看和header的访问效果是一样的,只不过cookie不能自定义value

$[K8sSj]kubectlapply-fappv2.yml
ingress.extensions/echoserverv2configured
service/echoserverv2unchanged
deployment.extensions/echoserverv2unchanged

$[K8sSj]foriin`seq10`;docurl-s--cookie"user_from_shanghai"echo.chulinx.com|grepHostname;done
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn

#zlx@zlxdeMacBook-Proin~/Desktop/unicom/k8syml/nginx-ingress-canary-deployment[1652]
$[K8sSj]foriin`seq10`;docurl-s--cookie"user_from_shanghai:always"echo.chulinx.com|grepHostname;done
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv1-657b966cb5-7grqs
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn

#zlx@zlxdeMacBook-Proin~/Desktop/unicom/k8syml/nginx-ingress-canary-deployment[1625]
$[K8sSj]foriin`seq10`;docurl-s--cookie"user_from_shanghai=always"echo.chulinx.com|grepHostname;done
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn
Hostname:echoserverv2-856bb5758-f9tqn

总结

灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以对新版本进行测试、发现和调整问题,以保证其影响度,以上内容通过实例详细介绍了Ingress-Nginx的实战Canary Annotation,可以借助Ingress-Nginx轻松实现蓝绿发布和金丝雀发布

其他

蓝绿发布

蓝绿部署中,一共有两套系统:一套是正在提供服务系统,标记为“绿色”;另一套是准备发布的系统,标记为“蓝色”。两套系统都是功能完善的,并且正在运行的系统,只是系统版本和对外服务情况不同。

最初,没有任何系统,没有蓝绿之分。

然后,第一套系统开发完成,直接上线,这个过程只有一个系统,也没有蓝绿之分。

后来,开发了新版本,要用新版本替换线上的旧版本,在线上的系统之外,搭建了一个使用新版本代码的全新系统。这时候,一共有两套系统在运行,正在对外提供服务的老系统是绿色系统,新部署的系统是蓝色系统。

蓝色系统不对外提供服务,用来做啥?

用来做发布前测试,测试过程中发现任何问题,可以直接在蓝色系统上修改,不干扰用户正在使用的系统。(注意,两套系统没有耦合的时候才能百分百保证不干扰)

蓝色系统经过反复的测试、修改、验证,确定达到上线标准之后,直接将用户切换到蓝色系统:

切换后的一段时间内,依旧是蓝绿两套系统并存,但是用户访问的已经是蓝色系统。这段时间内观察蓝色系统(新系统)工作状态,如果出现问题,直接切换回绿色系统。

当确信对外提供服务的蓝色系统工作正常,不对外提供服务的绿色系统已经不再需要的时候,蓝色系统正式成为对外提供服务系统,成为新的绿色系统。原先的绿色系统可以销毁,将资源释放出来,用于部署下一个蓝色系统。

蓝绿部署只是上线策略中的一种,它不是可以应对所有情况的万能方案。蓝绿部署能够简单快捷实施的前提假设是目标系统是非常内聚的,如果目标系统相当复杂,那么如何切换、两套系统的数据是否需要以及如何同步等,都需要仔细考虑。

金丝雀发布

金丝雀发布(Canary)也是一种发布策略,和国内常说的灰度发布是同一类策略。蓝绿部署是准备两套系统,在两套系统之间进行切换,金丝雀策略是只有一套系统,逐渐替换这套系统

譬如说,目标系统是一组无状态的Web服务器,但是数量非常多,假设有一万台。

这时候,蓝绿部署就不能用了,因为你不可能申请一万台服务器专门用来部署蓝色系统(在蓝绿部署的定义中,蓝色的系统要能够承接所有访问)。

可以想到的一个方法是:

只准备几台服务器,在上面部署新版本的系统并测试验证。测试通过之后,担心出现意外,还不敢立即更新所有的服务器。先将线上的一万台服务器中的10台更新为最新的系统,然后观察验证。确认没有异常之后,再将剩余的所有服务器更新。

这个方法就是金丝雀发布。

实际操作中还可以做更多控制,譬如说,给最初更新的10台服务器设置较低的权重、控制发送给这10台服务器的请求数,然后逐渐提高权重、增加请求数。

这个控制叫做“流量切分”,既可以用于金丝雀发布,也可以用于后面的A/B测试。

蓝绿部署和金丝雀发布是两种发布策略,都不是万能的。有时候两者都可以使用,有时候只能用其中一种。

A/B测试

首先需要明确的是,A/B测试和蓝绿部署以及金丝雀,完全是两回事。

蓝绿部署和金丝雀是发布策略,目标是确保新上线的系统稳定,关注的是新系统的BUG、隐患。

A/B测试是效果测试,同一时间有多个版本的服务对外服务,这些服务都是经过足够测试,达到了上线标准的服务,有差异但是没有新旧之分(它们上线时可能采用了蓝绿部署的方式)。

A/B测试关注的是不同版本的服务的实际效果,譬如说转化率、订单情况等。

A/B测试时,线上同时运行多个版本的服务,这些服务通常会有一些体验上的差异,譬如说页面样式、颜色、操作流程不同。相关人员通过分析各个版本服务的实际效果,选出效果最好的版本。

在A/B测试中,需要能够控制流量的分配,譬如说,为A版本分配10%的流量,为B版本分配10%的流量,为C版本分配80%的流量。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 网关
    +关注

    关注

    9

    文章

    4275

    浏览量

    50893
  • 控制
    +关注

    关注

    4

    文章

    1010

    浏览量

    122601
  • kubernetes
    +关注

    关注

    0

    文章

    223

    浏览量

    8683

原文标题:使用 Kubernetes Ingress-Nginx 实现蓝绿、灰度发布!你会用了吗?

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    YOLOv6在LabVIEW中的推理部署(含源码)

    YOLOv6 是美团视觉智能部研发的一款目标检测框架,致力于工业应用。如何使用python进行该模型的部署,官网已经介绍的很清楚了,但是对于如何在LabVIEW中实现该模型的部署,笔者目前还没有看到
    的头像 发表于 11-06 16:07 143次阅读
    YOLOv6在LabVIEW中的推理<b class='flag-5'>部署</b>(含源码)

    k8s可以部署私有云吗?私有云部署全攻略

    Kubernetes(简称K8S)可以部署私有云。Kubernetes是一个开源的容器编排引擎,能够自动化容器的部署、扩展和管理,使得应用可以在各种环境中高效运行。通过使用Kubernetes,企业可以在自己的数据中心或私有云环境中搭建和管理容器化的应用,
    的头像 发表于 10-25 09:32 113次阅读

    涂鸦HEDV本地化部署方案,助你低成本实现定制化开发!

    ,如何低成本实现快速交付、敏捷迭代以及满足本地合规部署的需求,成为了行业亟待解决的问题。面对这一挑战,涂鸦智能精心推出了海德薇(HEDV)本地部署解决方案,一个轻量
    的头像 发表于 07-06 08:15 624次阅读
    涂鸦HEDV本地化<b class='flag-5'>部署</b>方案,助你低成本<b class='flag-5'>实现</b>定制化开发!

    鸿蒙OS开发:【一次开发,多端部署】(音乐专辑页面)

    基于自适应和响应式布局,实现一次开发、多端部署音乐专辑页面。
    的头像 发表于 05-25 16:21 716次阅读
    鸿蒙OS开发:【一次开发,多端<b class='flag-5'>部署</b>】(音乐专辑页面)

    HarmonyOS开发案例:【一次开发,多端部署-音乐专辑】

    基于自适应和响应式布局,实现一次开发、多端部署音乐专辑页面。
    的头像 发表于 05-13 16:48 635次阅读
    HarmonyOS开发案例:【一次开发,多端<b class='flag-5'>部署</b>-音乐专辑】

    鸿蒙实战开发-本地部署、SmartPerf 编译部署指导文档

    install 在项目目录下运行命令: npm run build 编译成功后会有main 可执行文件生成。 项目部署 直接运行 ./main 可执行程序,完成项目的部署。 访问项目 在浏览器上打开
    发表于 05-09 14:23

    基于OpenCV DNN实现YOLOv8的模型部署与推理演示

    基于OpenCV DNN实现YOLOv8推理的好处就是一套代码就可以部署在Windows10系统、乌班图系统、Jetson的Jetpack系统
    的头像 发表于 03-01 15:52 1357次阅读
    基于OpenCV DNN<b class='flag-5'>实现</b>YOLOv8的模型<b class='flag-5'>部署</b>与推理演示

    请问可以私有部署

    有没有插件或者私有部署的服务
    发表于 02-01 16:00

    Docker部署迁移实战

    由于公司内部机器要做迁移,原系统机器部署在阿里云,要向亚马逊云迁移,由于之前的服务实在windows远程机器部署,并且有些项目因为打包问题,需要远程机器的IDEA做启停控制,本次准备先解决相关打包问题,然后将服务通过镜像方式部署
    的头像 发表于 12-12 14:22 896次阅读
    Docker<b class='flag-5'>部署</b>迁移实战

    jrebel和idea热部署优势

    JRebel 和 IntelliJ IDEA 是两个常用的开发工具,它们可以提供热部署的功能,极大地提高了开发效率。下面将详细介绍 JRebel 和 IntelliJ IDEA 热部署的优势。 提高
    的头像 发表于 12-03 15:16 719次阅读

    Helm部署MinIO集群

    Helm部署MinIO集群
    的头像 发表于 12-03 09:44 776次阅读
    Helm<b class='flag-5'>部署</b>MinIO集群

    蓝牙AOA基站的部署必须水平放置部署吗?

    蓝牙AOA基站的部署必须水平放置部署吗? 蓝牙AOA(Angle of Arrival)基站的部署需要考虑多个因素,其中包括放置方向、高度和间距等。虽然蓝牙AOA基站的水平放置是一种常见的部署
    的头像 发表于 11-30 11:17 581次阅读

    docker部署mysql的坏处

    Docker 是一种虚拟化技术,它允许开发人员在容器内打包应用程序及其所有依赖项,从而实现在不同环境中运行相同的应用程序的能力。然而,在使用 Docker 部署 MySQL 时,也存在一些潜在
    的头像 发表于 11-23 09:29 1343次阅读

    如何使用OpenVINO C++ API部署FastSAM模型

    象的位置和边界。本文将介绍如何使用 OpenVINO C++ API 部署 FastSAM 模型,以实现快速高效的语义分割。在前文中我们发表了《基于 OpenVINO Python API 部署
    的头像 发表于 11-17 09:53 846次阅读
    如何使用OpenVINO C++ API<b class='flag-5'>部署</b>FastSAM模型

    数据中心为什么要部署FPGA?

    FPGA 芯片在数据中心领域主要用于硬件加速,在云服务器厂商中已有广泛部署。数据中心使用 FPGA 芯片代替传统的 CPU 方案后,处理其自定义算法时可实现显著的加速效果。因此近年来,微软 Azure、亚马逊 AWS、阿里云的服务器上都开始
    发表于 11-16 09:55 765次阅读
    数据中心为什么要<b class='flag-5'>部署</b>FPGA?