前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何使用Higress快速实现金丝雀与蓝绿发布

如何使用Higress快速实现金丝雀与蓝绿发布

作者头像
用户1107783
发布2023-10-09 15:13:12
7410
发布2023-10-09 15:13:12
举报
文章被收录于专栏:云原生运维社区

背景

现如今,越来越多的应用采用了微服务架构,这也导致了应用数量相比传统模式更多,管理更加复杂,发布更加频繁,如果直接将新版本上线发布给全部用户。一旦遇到线上事故(或BUG),对用户的影响极大,解决问题周期较长,甚至有时不得不回滚到前一版本,严重影响了用户体验。为了保证整体系统的稳定,风险降到最低,我们可以采用灰度发布与蓝绿发布等不同的发布方式。

什么是金丝雀发布

金丝雀发布,又称灰度发布,是指通过让小部份用户流量引入的新版本进行测试,如果一切顺利,则可以增加(可能逐渐增加)百分比,逐步替换旧版本。如在过程中出现任何问题,则可以中止并快速回滚到旧版本。最简单的方式是随机选择百分比请求到金丝雀版本,但在更复杂的方案下,则可以基于请求的内容、特定范围的用户或其他属性等。

什么是蓝绿发布

蓝绿发布,提供了一种零宕机的部署方式,是一种以可观测的方式发布应用的方式,目的减少发布过程中停止时间。在保留老版本的同时部署新版本,将两个版本同时在线,新版本和老版本相互热备,通过切换路由权重的方式(非0即100)实现应用的不同版本上线或者下线,如果有问题可以快速地回滚到老版本。这样做的好处是无需停机,并且风险较小。

Higress 部署

代码语言:javascript
复制
# 环境为Kubernetes v1.27.3
$ kubectl get nodes
NAME                 STATUS   ROLES           AGE   VERSION
kind-control-plane   Ready    control-plane   9h    v1.27.3

# 通过Helm安装
$ helm repo add higress.io https://higress.io/helm-charts

"higress.io" already exists with the same configuration, skipping
$ helm install higress -n higress-system higress.io/higress --create-namespace --render-subchart-notes --set global.local=true --set higress-console.o11y.enabled=false  --set higress-console.domain=console.higress.io --set higress-console.admin.password.value=admin

NAME: higress
LAST DEPLOYED: Thu Aug 10 20:37:40 2023
NAMESPACE: higress-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Higress successfully installed!

To learn more about the release, try:
  $ helm status higress -n higress-system
  $ helm get all higress -n higress-system

1. Use the following URL to access the console:
  http://console.higress.io/
  Since Higress Console is running in local mode, you may need to add the following line into your hosts file before accessing the console:
  127.0.0.1 console.higress.io
2. Use following commands to get the credential and login:
  export ADMIN_USERNAME=$(kubectl get secret --namespace higress-system higress-console -o jsonpath="{.data.adminUsername}" | base64 -d)
  export ADMIN_PASSWORD=$(kubectl get secret --namespace higress-system higress-console -o jsonpath="{.data.adminPassword}" | base64 -d)
  echo -e "Username: ${ADMIN_USERNAME}\nPassword: ${ADMIN_PASSWORD}"
  NOTE: If this is an upgrade release, your current password won't be changed.
3. If you'd like to change the credential, you can edit this secret with new values: higress-system/higress-console

# 查看密码
$ export ADMIN_USERNAME=$(kubectl get secret --namespace higress-system higress-console -o jsonpath="{.data.adminUsername}" | base64 -d)
$ export ADMIN_PASSWORD=$(kubectl get secret --namespace higress-system higress-console -o jsonpath="{.data.adminPassword}" | base64 -d)
$ echo -e "Username: ${ADMIN_USERNAME}\nPassword: ${ADMIN_PASSWORD}"
Username: admin
Password: admin

# 配置Hosts
 $ cat /etc/hosts
 127.0.0.1 demo.kubesre.com console.higress.io

# 转发一下端口本地可以访问
$ kubectl  port-forward service/higress-gateway -n higress-system 80:80

访问地址:http://console.higress.io/plugin

Username: admin Password: admin

蓝绿发布.png

示例应用部署

部署示例版本:

代码语言:javascript
复制
$ cat demo.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo
  labels:
    app: demo
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo
  template:
    metadata:
      labels:
        app: demo
    spec:
      containers:
      - name: demo
        imagePullPolicy: Always
        image: registry.cn-shanghai.aliyuncs.com/kubesre01/demo:v1
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: demo-svc
spec:
  type: ClusterIP
  selector:
    app: demo
  ports:
    - port: 8080
      targetPort: 8080
$ kubectl apply -f demo.yml
deployment.apps/demo created

配置Higress路由规则

在域名管理中创建域名:

在路由配置中创建路由:

蓝绿发布.png

验证访问

代码语言:javascript
复制
# 通过如下命令进行访问,出现如下内容则说明部署成功!
$ curl http://demo.kubesre.com/info
{"message":"云原生运维圈!"}

部署新版本示例

部署新版本:

代码语言:javascript
复制
$ cat demo_new.yml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-new
  labels:
    app: demo-new
spec:
  replicas: 1
  selector:
    matchLabels:
      app: demo-new
  template:
    metadata:
      labels:
        app: demo-new
    spec:
      containers:
      - name: demo-new
        imagePullPolicy: Always
        image: registry.cn-shanghai.aliyuncs.com/kubesre01/demo:v2
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: demo-new-svc
spec:
  type: ClusterIP
  selector:
    app: demo-new
  ports:
    - port: 8080
      targetPort: 8080

$ kubectl apply -f demo_new.yml
deployment.apps/demo_new created

基于客户端请求头的流量切分

假设线上已运行了一套对外提供的七层demo应用,此时开发了一些新的功能,需要上线新版本demo应用,但是又不想直接替换成新版本demo应用,而是希望将请求头包含user=kubesre的客户端请求转发到新版本demo应用中,进行验证测试新版本demo应用,等测试验证通过并稳定后,可将所有流量从老版本demo应用切换到新版本demo应用中,再平滑地将老版本demo应用下线。

创建新版本Higress路由规则:

目标服务,选择最新版本

测试验证:

代码语言:javascript
复制
# 请求头为user: kubesre,访问到新的版本
$ curl -H "user: kubesre" http://demo.kubesre.com/info
{"message":"云原生运维圈!新版本"}

# 其他则访问到老的版本
$ curl  http://demo.kubesre.com/info
{"message":"云原生运维圈!"}

基于客户端来源IP的流量切分

假设线上已运行了一套对外提供的七层demo应用,此时开发了一些新的功能,需要上线新版本demo应用,又不想直接替换成新版本demo应用,而是只希望公司内部人员能访问到新版本demo应用中,进行测试验证新版本demo应用,非公司内部人员访问还是访问到老版本应用中。等公司内部人员测试验证通过并稳定后,可将所有流量从老版本demo应用切换到新版本demo应用中,再平滑地将老版本demo应用下线。创建新版本Higress路由规则:

蓝绿发布.png

测试验证:

代码语言:javascript
复制
# 通过请求头模拟来源IP,真实环境不需要
$ curl -H "X-Forwarded-For:123.456.789.123" http://demo.kubesre.com/info
{"message":"云原生运维圈!新版本"}

# 其他则访问到老的版本
$ curl  http://demo.kubesre.com/info
{"message":"云原生运维圈!"}

基于服务权重的流量切分

假设线上已运行了一套对外提供的七层demo应用,此时修复了一些问题,需要上线新版本demo应用,又不想直接替换成新版本demo应用,而是希望将20%的流量切换新版本。待运行一段时间稳定后,可将所有流量从老版本demo应用切换到新版本demo应用中,再平滑地将老版本demo应用下线。

创建新版本Higress路由规则:

选择最新目标服务即可,其他不需要任何特殊配置:

配置权重:

代码语言:javascript
复制
$ kubectl edit ingress -n higress-system demo-new-canary
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    higress.io/canary: "true"   # 开启灰度
    higress.io/canary-weight: "30" # 权重设置为30
    higress.io/destination: demo-new-svc.default.svc.cluster.local:8080
    higress.io/ignore-path-case: "false"
  creationTimestamp: "2023-10-07T07:04:40Z"
  generation: 1
  labels:
    higress.io/domain_demo.kubesre.com: "true"
    higress.io/resource-definer: higress
  name: demo-new-canary
  namespace: higress-system
  resourceVersion: "221188"
  uid: bf833256-6993-4e56-bc3e-f96fe606e278
spec:
  ingressClassName: higress
  rules:
  ....

验证测试:

代码语言:javascript
复制
$ for i in {1..20}; do curl http://demo.kubesre.com/info; done;
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!新版本"}
{"message":"云原生运维圈!新版本"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!新版本"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!"}
{"message":"云原生运维圈!新版本"}
{"message":"云原生运维圈!新版本"}
{"message":"云原生运维圈!新版本"}
{"message":"云原生运维圈!"}

注解说明

  • higress.io/canary-weight:设置请求到指定服务的百分比(值为0~100的整数)
  • higress.io/canary-weight-totatl:设置权重总和,默认为100
  • higress.io/canary-by-header:基于Request Header的名称进行流量切分。当请求包含该Header并其值为always时,请求流量会被分配到灰度服务入口;其他情况时,请求流量不会分配到灰度服务。

总结

本文介绍了金丝雀与蓝绿发布及不同的应用场景,并基于Higress结合企业实战案例进行演示,让大家更容易理解上手,接下来的文章会讲解Higress更多企业级应用实战,请敬请期待!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 云原生运维圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是金丝雀发布
  • 什么是蓝绿发布
  • Higress 部署
  • 示例应用部署
  • 配置Higress路由规则
  • 验证访问
  • 部署新版本示例
  • 基于客户端请求头的流量切分
  • 基于客户端来源IP的流量切分
  • 基于服务权重的流量切分
  • 注解说明
  • 总结
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档