通过K8S Ingress Controller来实现应用的流量复制

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 本文主要跟大家分享下如何在阿里云容器服务不同K8S集群内进行应用的流量复制

仿真测试

通常在系统进行重大重构或者发布新功能时,我们都需要进行压测以事先评估新系统的承载能力,传统情况下我们一般会在线下环境来模拟线上各种测试数据来对新系统进行测试,但是这种方式往往并不能有效地模拟出线上真实的访问量,尤其是模拟出正常流量中混杂着各色的异常流量,针对这种情况我们可以通过将线上的应用流量复制到指定的线下环境来对新系统进行仿真测试;另外一种情况假若我们线上系统遇到了性能瓶颈,但是又不能快速地定位出问题点,我们同样可以采用流量复制的方式来将应用的真实流量引导到线下环境来进行定位。下面主要跟大家分享下如何在阿里云容器服务不同K8S集群内进行应用的流量复制:
image

部署基础应用

这里假设您已经在阿里云容器服务控制台申请了两个不同的K8S集群(暂定一个为K8S Product Cluster,一个为K8S Stage Cluster)。

一、在K8S Product Cluster中部署一个应用,并通过Ingress来对外暴露服务访问:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      # 当前配置为老版本镜像
      - image: registry.cn-hangzhou.aliyuncs.com/xianlu/old-nginx
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  # 这里配置使用了集群默认域名(您也可以使用自定义域名并作DNS解析)
  - host: nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-service
          servicePort: 80

二、部署完成后可通过如下命令测试访问:

  # 查看该应用的ingress配置
  kubectl get ing nginx-ingress
NAME            HOSTS                                                                  ADDRESS         PORTS     AGE
nginx-ingress   nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com   47.110.199.44   80        8m
 
  # 测试访问应用域名
  curl http://nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com
old
 

三、在K8S Stage Cluster中部署一个相同应用,同样通过Ingress来对外暴露服务访问:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      # 当前配置为新版本镜像
      - image: registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginx
        imagePullPolicy: Always
        name: nginx
        ports:
        - containerPort: 80
          protocol: TCP
      restartPolicy: Always
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  ports:
  - port: 80
    protocol: TCP
    targetPort: 80
  selector:
    app: nginx
  type: NodePort
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
spec:
  rules:
  # 这里配置使用了集群默认域名(您也可以使用自定义域名并作DNS解析)
  - host: nginx.c41eb6ca34a3e49f7aea63b8bc9e8ad98.cn-beijing.alicontainer.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-service
          servicePort: 80

四、部署完成后可通过如下命令测试访问:

 # 查看该应用的ingress配置
 kubectl get ing nginx-ingress
NAME            HOSTS                                                                 ADDRESS        PORTS     AGE
nginx-ingress   nginx.c41eb6ca34a3e49f7aea63b8bc9e8ad98.cn-beijing.alicontainer.com   39.106.233.1   80        1m

 # 测试访问应用域名
 curl http://nginx.c41eb6ca34a3e49f7aea63b8bc9e8ad98.cn-beijing.alicontainer.com
new

配置流量复制

这里假设我们希望将K8S Product Cluster中该应用 100% 的访问流量复制到K8S Stage Cluster中对应的应用服务上,即将所有访问域名nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com的请求复制转发一份到nginx.c41eb6ca34a3e49f7aea63b8bc9e8ad98.cn-beijing.alicontainer.com上:
image

说明:由于K8S Stage Cluster Ingress仅仅只作为复制流量的接收方,因此它不需要做任何配置修改,这里我们只需要在K8S Product Cluster Ingress上进行配置即可。

一、配置复制流量百分比和接收复制流量的应用域名

通过如下命令来修改K8S Ingress Controller的ConfigMap配置增加http-snippet配置片段,配置期望的复制流量百分比和接收复制流量的目标应用域名:

  ~ kubectl -n kube-system edit cm nginx-configuration

配置如下KV对:

 http-snippet: |
   split_clients "$date_gmt" $mirror_servers {
      100%    nginx.c41eb6ca34a3e49f7aea63b8bc9e8ad98.cn-beijing.alicontainer.com;
   }

# 配置说明:
# 1. 流量百分比取值范围:(0, 100],百分比总和必须不大于100%
# 2. 支持同时配置多个不同的复制流量接收目标应用

二、配置流量复制

这里我们通过configuration-snippetserver-snippet来修改源Ingress增加应用的流量复制配置(YAML参考如下):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
        mirror /mirror; # 配置N次该项则可放大N倍流量
    nginx.ingress.kubernetes.io/server-snippet: |
        location = /mirror {
            internal;
            # 不打印mirror请求日志
            #access_log off; 
            # 设置proxy_upstream_name,格式必须为[Namespace]-[BackendServiceName]-[BackendServicePort]
            set $proxy_upstream_name    "default-nginx-service-80";
            # 自定义字符串,会作为请求头X-Shadow-Service值传给mirror server
            set $shadow_service_name    "nginx-product-service"; 
            proxy_set_header X-Shadow-Service  $shadow_service_name;
            proxy_set_header Host $mirror_servers;
            proxy_pass http://$mirror_servers$request_uri;
        }
spec:
  rules:
  - host: nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com
    http:
      paths:
      - path: /
        backend:
          serviceName: nginx-service
          servicePort: 80

至此,基于K8S Ingress Controller的应用流量复制配置已经完成。

测试流量复制

这里我们尝试访问K8S Product Cluster中的应用域名nginx.c37bf6b77bded43669ba2fb67448b4146.cn-hangzhou.alicontainer.com,可以看到每次请求K8S Product Cluster中的Ingress应用域名时,其都将复制一份同样的请求转发到K8S Stage Cluster中对应的应用服务中:

image

同时,由于前面我们在流量复制配置中配置了proxy_set_header X-Shadow-Service $shadow_service_name,因此在K8S Stage Cluster目标应用接收的请求中,都会携带一个X-Shadow-Service头来指明该镜像流量来源于哪个线上应用。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
7天前
|
jenkins 持续交付 开发者
利用Docker容器化部署应用的实战指南
【6月更文挑战第27天】本文详述Docker应用部署,涵盖Docker基本概念、安装、镜像制作及运行。通过编写Dockerfile构建镜像,使用`docker build`、`run`、`push`及`stop`命令管理。集成CI/CD工具如Jenkins,实现自动化构建、测试和部署,提升开发效率与部署质量。Docker助力轻量级、可移植的微服务架构。
|
23天前
|
Kubernetes 前端开发 Serverless
Serverless 应用引擎产品使用合集之如何调用Kubernetes集群内服务
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
6天前
|
Kubernetes 监控 Java
阿里云云效产品使用问题之进行Kubernetes分批发布时应用名被更改,是什么导致的
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
14天前
|
Kubernetes 前端开发 微服务
实操教程丨如何在K8S集群中部署Traefik Ingress Controller
实操教程丨如何在K8S集群中部署Traefik Ingress Controller
|
18天前
|
SQL Kubernetes 数据处理
实时计算 Flink版产品使用问题之在 flink-conf.yaml 中定义的配置在某些情况下未被正确应用到 K8s 上运行的任务管理器(JobManager)和任务管理节点(TaskManager),是什么导致的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
2月前
|
Kubernetes Cloud Native 开发者
构建高效云原生应用:Kubernetes与微服务架构的融合
【5月更文挑战第31天】 在数字化转型和技术迭代的大潮中,企业对于敏捷、可扩展的IT基础设施需求日益增长。云原生技术以其独特的优势成为推动这一进程的关键力量。本文深入探讨了如何通过结合Kubernetes容器编排和微服务架构来构建和维护高效、可靠的云原生应用。我们将剖析这种技术整合的必要性,揭示其背后的原理,并讨论在实际部署过程中可能遇到的挑战及解决方案。通过案例分析和最佳实践的分享,旨在为开发者和架构师提供一套行之有效的云原生应用构建指南。
|
1月前
|
Kubernetes 微服务 容器
Aspire项目发布到远程k8s集群
Aspire项目发布到远程k8s集群
392 2
Aspire项目发布到远程k8s集群
|
21天前
|
Kubernetes Cloud Native 微服务
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
微服务实践之使用 kube-vip 搭建高可用 Kubernetes 集群
211 3
|
6天前
|
Kubernetes 网络协议 Docker
k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
k8s 开船记-故障公告:自建 k8s 集群在阿里云上大翻船
|
6天前
|
Kubernetes Ubuntu jenkins
超详细实操教程!在现有K8S集群上安装JenkinsX,极速提升CI/CD体验!
超详细实操教程!在现有K8S集群上安装JenkinsX,极速提升CI/CD体验!

相关产品

  • 容器服务Kubernetes版