首页 文章 精选 留言 我的

精选列表

搜索[c 14],共10000篇文章
优秀的个人博客,低调大师

ASP.NET Core on K8S深入学习(14)Ingress灰度发布

本篇已加入《.NET Core on K8S学习实践系列文章索引》,可以点击查看更多容器化技术相关系列文章。 之前一篇介绍了Ingress的基本概念和Nginx Ingress的基本配置和使用,本篇继续Ingress的使用,来看看如何使用Ingress实现灰度发布(金丝雀发布)。 一、准备工作 1.1 WebAPI项目准备 首先,我们还是准备两个版本的ASP.NET Core WebAPI项目,具体项目代码参见这里。 他们之间的差别在于一个接口的返回JSON数据,比如V1.0版本中返回的是Version: 1.0,而V1.1版本中返回的是Version:1.1。 [Route("api/[controller]")] [ApiController] public class HomeController : ControllerBase { // GET api/home [HttpGet] public ActionResult<IEnumerable<string>> Get() { return new string[] { "Hello, welcome to EDC's demo. Version: 1.0" }; } } 运行结果为: (2)将此项目各个版本根据Dockerfile打成镜像,分别是xilife/canary-api-demo:1.0,1.1。 (3)将本地镜像push到远程镜像仓库,这里我传送到了docker hub的一个公共仓库里边: docker push xilife/canary-api-demo:1.0 docker push xilife/canary-api-demo:1.1 1.2 WebAPI项目部署 其次,我们将这两个WebAPI项目部署到K8s集群中,还是通过熟悉的yaml文件来将其部署为Service: (1)V1.0版本(假设为线上版本) apiVersion: apps/v1 kind: Deployment metadata: name: canary-api-demo namespace: xdp-poc labels: name: canary-api-demo spec: replicas: 2 selector: matchLabels: name: canary-api-demo template: metadata: labels: name: canary-api-demo spec: containers: - name: canary-api-demo image: xilife/canary-api-demo:1.0 ports: - containerPort: 80 imagePullPolicy: IfNotPresent --- kind: Service apiVersion: v1 metadata: name: canary-api-svc namespace: xdp-poc spec: type: NodePort ports: - port: 80 targetPort: 80 selector: name: canary-api-demo (2)V1.1版本(假设为灰度版本) apiVersion: apps/v1 kind: Deployment metadata: name: canary-api-demo-gray namespace: xdp-poc labels: name: canary-api-demo-gray spec: replicas: 2 selector: matchLabels: name: canary-api-demo-gray template: metadata: labels: name: canary-api-demo-gray spec: containers: - name: canary-api-demo-gray image: xilife/canary-api-demo:1.1 ports: - containerPort: 80 imagePullPolicy: IfNotPresent --- kind: Service apiVersion: v1 metadata: name: canary-api-svc-gray namespace: xdp-poc spec: type: NodePort ports: - port: 80 targetPort: 80 selector: name: canary-api-demo-gray 将这两个应用部署至K8s集群: kubectl apply -f deploy-canary-api-svc.yml kubectl apply -f deploy-canary-api-gray-svc.yml 二、Ingress灰度发布应用 Ingress-Nginx 支持配置 Ingress Annotations 来实现不同场景下的灰度发布和测试,可以满足金丝雀发布、蓝绿部署与 A/B 测试等业务场景。 因此我们准备两个版本的Ingress的yml文件,它提供了两种方式: 一是基于用户请求的流量切分,具体又包括了基于Request Header的流量切分与基于Cookie的流量切分两种方式;如下图所示: 二是基于服务权重的流量切分;如下图所示: 2.1 基于Request Header的流量切分方式 根据Request Header的流量切分方式的约定,适用于灰度发布及A/B测试。当 Request Header 设置为 always时,请求将会被一直发送到 Canary 版本;当 Request Header 设置为 never时,请求不会被发送到 Canary 入口;对于任何其他 Header 值,将忽略 Header,并通过优先级将请求与其他金丝雀规则进行优先级的比较。 为1.0版本准备一个Ingress,让它先工作着: apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: nginx-ingress namespace: xdp-poc annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/rewrite-target: /api/$2 spec: rules: - host: portal.k8s.xi-life.cn http: paths: - path: /api(/|$)(.*) backend: serviceName: canary-api-svc servicePort: 80 应用至K8s集群: kubectl apply -f ingress-nginx.yaml 再为1.1版本准备一个Ingress,让它作为灰度版本的入口逐步替换原v1版本的流量接入: apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: nginx-ingress-gray namespace: xdp-poc annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/rewrite-target: /api/$2 nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-header: "canary" nginx.ingress.kubernetes.io/canary-by-header-value: "true" spec: rules: - host: portal.k8s.xi-life.cn http: paths: - path: /api(/|$)(.*) backend: serviceName: canary-api-svc-gray servicePort: 80 应用至K8s集群: kubectl apply -f ingress-nginx.yaml 快速验证: 2.2 基于Cookie的流量切分方式 根据基于 Cookie 的流量切分方式的约定,当 Cookie 值设置为 always时,它将被路由到 Canary 入口;当 Cookie 值设置为 never时,请求不会被发送到 Canary 入口;对于任何其他值,将忽略 Cookie 并将请求与其他金丝雀规则进行优先级的比较。 为灰度版本准备Ingress: apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: nginx-ingress-gray namespace: xdp-poc annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/proxy-body-size: "100m" nginx.ingress.kubernetes.io/limit-rps: '10' nginx.ingress.kubernetes.io/rewrite-target: /api/$2 nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-cookie: "xdp-v2-cookie" spec: rules: - host: portal.k8s.xi-life.cn http: paths: - path: /api(/|$)(.*) backend: serviceName: canary-api-svc-gray servicePort: 80 应用至K8s集群: kubectl apply -f ingress-nginx-gray.yaml 快速验证: (1)未添加Cookie (2)为要访问的域名添加一个Cookie (3)再次请求验证 2.3 基于服务权重的流量切分方式 根据基于服务权重的流量切分方式的约定,适用于蓝绿部署,权重范围 0 - 100 按百分比将请求路由到 Canary Ingress 中指定的服务。权重为 0 意味着该金丝雀规则不会向 Canary 入口的服务发送任何请求。权重为 100 意味着所有请求都将被发送到 Canary 入口。 为灰度版本准备Ingress: apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: nginx-ingress-gray namespace: xdp-poc annotations: kubernetes.io/ingress.class: "nginx" nginx.ingress.kubernetes.io/proxy-body-size: "100m" nginx.ingress.kubernetes.io/limit-rps: '10' nginx.ingress.kubernetes.io/rewrite-target: /api/$2 nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "50" spec: rules: - host: portal.k8s.xi-life.cn http: paths: - path: /api(/|$)(.*) backend: serviceName: canary-api-svc-gray servicePort: 80 应用至K8s集群: kubectl apply -f ingress-nginx-gray.yaml 快速验证:这里我直接通过浏览器来测试,需要注意的是这里的50%是一个近似分布值,可能实际中不会太精确。 三、三种方式的对比 Nginx Ingress提供的三种灰度发布的方式的优先级顺序为: canary-by-header -> canary-by-cookie -> canary-weight 已知限制: (1)Ingress-Nginx是在0.21.0版本中才引入的Canary功能,因此建议确保版本在0.22.0及之后(据说0.21.0版本的基于Cookie方式有点问题); (2)目前每个Ingress规则中最多只能应用一个canary入口! 四、小结 本文介绍了Nginx Ingress提供的三种灰度发布(canary)的方式,然后介绍了如何使用Nginx Ingress并进行配置实现ASP.NET Core WebAPI应用服务的灰度发布实践,最后对比三种方式的优先级及限制,希望对你有所帮助。 此外,我也有录制一个10min+的小视频介绍蓝绿发布和金丝雀发布的基本概念,视频入口点击这里。 参考资料 (1)JadePeng,《K8s基于Nginx Ingress实现灰度发布》 (2)我的小碗汤,《Nginx Ingress实现灰度和金丝雀发布》 (3)梁宽,《再也不踩坑的K8s实战指南》 (4)WangT,《K8s基于Nginx Ingress进行蓝绿部署/金丝雀发布》 (5)linus.lin,《一文明白蓝绿部署、滚动部署、灰度发布、金丝雀发布》

优秀的个人博客,低调大师

【阿里云IoT+YF3300】14.阿里IoT Studio打造手机端APP

在上一篇《13.阿里云IoT Studio WEB监控界面构建》中,我们介绍了用阿里云IoT Studio(原Link Develop)可视化构建WEB界面程序。本篇文章将介绍用阿里云IoT Studio打造手机端APP。 和WEB开发类似,可以通过可视化拖拽的方式,方便地将各种图表组件与设备相关的数据源关联,无需编程,即可将物联网平台上接入的设备数据可视化展现。不过支持的组件相对于WEB可视化相对少一些,如下图所示:一 阿里云云端设备创建操作步骤1)登陆物联网平台控制台2)创建产品a.左侧导航栏选择设备管理>产品。在产品管理页面,单击创建产品。b.单击完成 产品将自动出现在产品列表中 3)创建属性a.在创建的产品界面选择功能定义>自定义功能>添加功能。创建温湿度属性4)创建设备a.左侧导航栏选中设

优秀的个人博客,低调大师

云原生生态周报 Vol. 14 | K8s CVE 修复指南

业界要闻 1 Mesosphere公司正式更名为 D2IQ, 关注云原生Mesosophere公司日前发布[官方声明](https://mp.weixin.qq.com/s/nxEEESqxQv5pxwtoDn0gJQ)正式更名为:D2iQ(Day-Two-I-Q),称关注点转向Kubernetes与云原生领域, 并会继续将“Mesosphere”作为产品技术和品牌的一部。 2 Kubernetes 两个安全漏洞修复指南 2.1 Kubernetes API server 暴出安全漏洞(CVE-2019-11247),该漏洞使得指定了命名空间权限的请求可以访问到集群级别权限的自定义资源(CR),漏洞产生的主要原因在于CRD的服务API没有检查请求的命名空间范围(namespaceScope)。 漏洞涉及的版本包括: Kubernet

优秀的个人博客,低调大师

基于django的视频点播网站开发-step14-数据总览功能

数据总览功能,是对网站中产生的数据进行一个统计,统计出视频数、发布数、用户数、评论数,等等。让管理者对网站数据有一个清晰的认识,做到心中有数。 在本站中,笔者一共列举了下面几种数据:视频数、发布中未发布、用户数、用户新增、评论数、评论新增,等几项内容。 我们把所有的数据都封装到了一个函数里面,即 IndexView 它位于后台管理的首页。 path('', views.IndexView.as_view(), name='index'), IndexView代码如下 class IndexView(AdminUserRequiredMixin, generic.View): def get(self, request): video_count = Video.objects.get_count() video_has_published_count = Video.objects.get_published_count() video_not_published_count = Video.objects.get_not_published_count() user_count = User.objects.count() user_today_count = User.objects.exclude(date_joined__lt=datetime.date.today()).count() comment_count = Comment.objects.get_count() comment_today_count = Comment.objects.get_today_count() data = {"video_count": video_count, "video_has_published_count": video_has_published_count, "video_not_published_count": video_not_published_count, "user_count": user_count, "user_today_count": user_today_count, "comment_count": comment_count, "comment_today_count": comment_today_count} return render(self.request, 'myadmin/index.html', data) 与视频相关的统计,我们封装到了Video的models.py下面, class VideoQuerySet(models.query.QuerySet): # 视频总数 def get_count(self): return self.count() # 发布数 def get_published_count(self): return self.filter(status=0).count() # 未发布数 def get_not_published_count(self): return self.filter(status=1).count() 以上数据,大都使用了filter过滤器进行了过滤,最后通过count()函数返回给业务方。 与用户相关的统计,我们直接通过count和exclude将相关数据过滤出来。 与评论相关的统计,封装到了Comment的models.py下面, class CommentQuerySet(models.query.QuerySet): # 评论总数 def get_count(self): return self.count() # 今日新增 def get_today_count(self): return self.exclude(timestamp__lt=datetime.date.today()).count() 其中,今日新增评论,我们通过exclude来过滤时间,使用了 lt 标签来过滤。更多标签的使用方法,可参考 官方文档

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册