首页 > 其他分享 >kubernetes三种方式实现金丝雀发布

kubernetes三种方式实现金丝雀发布

时间:2024-03-27 10:32:17浏览次数:12  
标签:name kubernetes 金丝雀 app v1 v2 version 三种 myapp

目录

使用service实现

使用ingress特性实现

使用istio实现


使用service实现

        金丝雀发布的核心是让 Service 同时指向 v1 和 v2 版本的 Deployment Pod,通过调整两个 Deployment 的副本数来逐步迁移流量。

1、创建当前版本的Deployment v1 和 Service 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-v1
spec:
  replicas: 9
  selector:
    matchLabels:
      app: myapp
      version: v1
  template:
    metadata:
      labels:
        app: myapp
        version: v1
    spec:
      containers:
      - name: myapp-container
        image: myapp:v1
---
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
    version: v1
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080

2、创建新版本的 Deployment v2

创建一个新的 Deployment 用于金丝雀发布,一开始只部署少量的副本

apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-v2
spec:
  replicas: 1  # 金丝雀的副本数量较少
  selector:
    matchLabels:
      app: myapp
      version: v2
  template:
    metadata:
      labels:
        app: myapp
        version: v2
    spec:
      containers:
      - name: myapp-container
        image: myapp:v2

3、更新 Service 选择器

更新现有的 Service 选择器,让它同时选中两个版本的 Pod,这将导致 Service 将流量路由到两个版本的 Pod。因为 v2 的 Pod 数量较少,所以接收到的流量也会相对较少,这实现了金丝雀发布(v2所分流量接近于10%,v1所分流量接近于90%)。

apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
    # 注意,这里不再指定 version 标签
  ports:
    - protocol: TCP
      port: 80
      targetPort: 8080


使用ingress特性实现

0.21.0版本引入canary功能,才能通过ingress实现金丝雀发布

1、创建两个 Deployment

首先,创建两个 Deployment,一个用于稳定版本(v1),另一个用于新版本(v2)。

# Deployment for v1
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-v1
spec:
  replicas: 5
  selector:
    matchLabels:
      app: myapp
      version: v1
  template:
    metadata:
      labels:
        app: myapp
        version: v1
    spec:
      containers:
      - name: myapp-container
        image: myapp:v1
---
# Deployment for v2 (Canary)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app-v2
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
      version: v2
  template:
    metadata:
      labels:
        app: myapp
        version: v2
    spec:
      containers:
      - name: myapp-container
        image: myapp:v2

2、为 v1 和 v2 版本的 Deployment 分别创建 Service

#v1 版本的 Service

apiVersion: v1
kind: Service
metadata:
  name: myapp-v1
spec:
  selector:
    app: myapp
    version: v1
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080
---
#v2 版本的 Service
apiVersion: v1
kind: Service
metadata:
  name: myapp-v2
spec:
  selector:
    app: myapp
    version: v2
  ports:
  - protocol: TCP
    port: 80
    targetPort: 8080

3、创建2个ingress实现金丝雀发布

        在这个配置中,我们使用了 nginx.ingress.kubernetes.io/canary-weight 注解,其值设置为 10。这意味着约有 10% 的流量会被路由到 myapp-v2 服务,而其他的 90% 仍然会被路由到 myapp-v1 服务。这个权重可以根据需要调整

# 主 Ingress 对象为 v1 版本
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-v1
            port:
              number: 80

---
# 金丝雀 Ingress 对象为 v2 版本
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: myapp-ingress-canary
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "10"
spec:
  rules:
  - host: myapp.example.com
    http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: myapp-v2
            port:
              number: 80


使用istio实现

1、过VirtualService配置金丝雀发布

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: app-virtualservice
spec:
  hosts:
  - "www.app-service.com"   #指域名
  http:
  - route:
    - destination:
        host: app-service    #指对应的service名称
        subset: v1  #对应destinationRule中的v1
      weight: 90    #90%流量分发到destinationRule中v1对应的pod
    - destination:
        host: app-service    #指对应的service名称
        subset: v2  ##对应destinationRule中的v2
      weight: 10    #10%流量分发到destinationRule中v2对应的pod

DestinationRule Yaml

apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: app-service-destination
spec:
  host: app-service    #对应service名称
  subsets:
    - name: v1        #对应上面VirtualService中的v1
      labels:
        version: v1   #对应标签version=v1的pod
    - name: v2        #对应上面VirtualService中的v2
      labels:
        version: v2   #对应标签version=v2的pod

标签:name,kubernetes,金丝雀,app,v1,v2,version,三种,myapp
From: https://blog.csdn.net/qq_38483331/article/details/136978946

相关文章

  • SSH远程链接超时断开的三种解决方法
    在使用SSH登陆连接Linux服务器的时候,如果一段时间没有操作,服务器会自动断开与客户端的连接,这样重新登录就会比较麻烦,小编整理了SSH远程链接超时断开的三种解决方法,供大家参考。第一种是修改服务器配置文件/etc/ssh/sshd_config,在配置文件里加入下面三行:1TCPKeepAlive......
  • Flink Native Kubernetes实战,索引为什么能提供查询性能
    关于FlinkNativeKubernetes先对比官方的1.9和1.10版本文档,如下图和红框和蓝框所示,可见FlinkNativeKubernetes是1.10版本才有的新功能:看看NativeKubernetes是如何运行的,如下图,创建sessioncluster的命令来自Flink安装包:更有趣的是,提交任务的命令也来自Flink安装包,......
  • 云原生周刊:Kubernetes v1.30 一瞥 | 2024.3.25
    开源项目推荐RetinaRetina是一个与云无关的开源Kubernetes网络可观测平台,它提供了一个用于监控应用程序运行状况、网络运行状况和安全性的集中中心。它为集群网络管理员、集群安全管理员和DevOps工程师提供可操作的见解,帮助他们了解DevOps、SecOps和合规性用例。Retina......
  • Kubernetes网络原理
    Kubernetes的网络依赖于Docker,Docker的网络又离不开Linux操作系统内核特性的支持,所以在学习Kubernetes网络原理之前,有必要先深入了解Docker相关的网络基础知识,以及Docker的网络实现原理,详见《Docker的Linux网络基础》与《Docker网络原理》。 一、Kubernetes网......
  • Kubernetes知识整理
    Kubernetes知识整理Kubernetes组件Kubernetes由多个组件组成,共同协作以管理容器化应用程序。这些组件可以分为以下几类:控制平面组件API服务器(kube-apiserver):KubernetesAPI的入口点,负责处理来自客户端的请求并协调集群状态。调度器(kube-scheduler):负责将Pod分配......
  • 容器镜像加速指南:探索 Kubernetes 缓存最佳实践
    介绍将容器化应用程序部署到Kubernetes集群时,由于从registry中提取必要的容器镜像需要时间,因此可能会出现延迟。在应用程序需要横向扩展或处理高速实时数据的情况下,这种延迟尤其容易造成问题。幸运的是,有几种工具和策略可以改善Kubernetes中容器镜像的可用性和缓存。在本篇......
  • Kubernetes Antipatterns
    InKubernetes,identifyingandavoidinganti-patternsiscrucialformaintainingarobustcontainerorchestrationenvironment.Thesemisleadingpracticesmayinitiallyappeareffectivebutcanleadtocomplications.ThisreadingexplorestenprevalentKub......
  • Kubernetes一文上手【手把手系列】
    目录Kubernetes前言部署方式的演变K8S概述K8S架构Master节点1.APIServer2.Etcd3.ControllerManager4.SchedulerNode节点1.kubelet2.kube-proxy3.容器运行时组件与插件1.KubernetesDNS2.Dashboard3.Heapster4.IngressControllerK8S核心概念PodSerivce......
  • Kubernetes客户端认证(三)—— Kubernetes使用CertificateSigningRequest方式签发客户端
    1、概述在《Kubernetes客户端认证(一)——基于CA证书的双向认证方式 》和《Kubernetes客户端认证(二)——基于ServiceAccount的JWTToken认证》两篇博文中详细介绍了Kubernetes客户端认证方式,包括以证书方式访问的普通用户或进程(运维人员及kubectl、kubelet等进程);以Service......
  • Kubernetes之Service
    一、Service的概念与定义1.Service的概念Service是Kubernetes实现微服务架构的核心概念,主要用于提供网络服务。通过Service的定义,可以对客户端应用屏蔽后端Pod实例数量及PodIP地址的变化,通过负载均衡策略实现请求到后端Pod实例的转发,为客户端应用提供一......