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

摘要: 本文主要跟你们分享下如何在阿里云容器服务不一样K8S集群内进行应用的流量复制

仿真测试

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

部署基础应用

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

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

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

2、部署完成后可经过以下命令测试访问:api

# 查看该应用的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

3、在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

4、部署完成后可经过以下命令测试访问:app

# 查看该应用的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上:
curl

说明:因为K8S Stage Cluster Ingress仅仅只做为复制流量的接收方,所以它不须要作任何配置修改,这里咱们只须要在K8S Product Cluster Ingress上进行配置便可。ide

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

经过以下命令来修改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\. 支持同时配置多个不一样的复制流量接收目标应用

2、配置流量复制

这里咱们经过configuration-snippetserver-snippet来修改源Ingress增长应用的流量复制配置(YAML参考以下):

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: nginx-ingress
  annotations:
    nginx.ingress.kubernetes.io/configuration-snippet: |
        mirror /mirror;
    nginx.ingress.kubernetes.io/server-snippet: |
        location = /mirror {
            internal;
            set $shadow_service_name    "nginx-product-service";
            proxy_set_header X-Shadow-Service  $shadow_service_name;
            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中对应的应用服务中:

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

云服务器99元拼团购!拉新还可赢现金红包!300万等你瓜分!
立刻一键开团赢红包: http://click.aliyun.com/m/100...



本文做者:chenqz

阅读原文

本文为云栖社区原创内容,未经容许不得转载。

相关文章
相关标签/搜索