通過K8S Ingress Controller來實現應用的流量複製

摘要: 本文主要跟大家分享下如何在阿里雲容器服務不同K8S集群內進行應用的流量複製

仿真測試

通常在系統進行重大重構或者發佈新功能時,我們都需要進行壓測以事先評估新系統的承載能力,傳統情況下我們一般會在線下環境來模擬線上各種測試數據來對新系統進行測試,但是這種方式往往並不能有效地模擬出線上真實的訪問量,尤其是模擬出正常流量中混雜著各色的異常流量,針對這種情況我們可以通過將線上的應用流量複製到指定的線下環境來對新系統進行仿真測試;另外一種情況假若我們線上系統遇到了性能瓶頸,但是又不能快速地定位出問題點,我們同樣可以採用流量複製的方式來將應用的真實流量引導到線下環境來進行定位。下面主要跟大家分享下如何在阿里雲容器服務不同K8S集群內進行應用的流量複製:

通過K8S Ingress Controller來實現應用的流量複製

部署基礎應用

這裡假設您已經在阿里雲容器服務控制檯申請了兩個不同的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上:

通過K8S Ingress Controller來實現應用的流量複製

說明:由於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-snippet和server-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中對應的應用服務中:

通過K8S Ingress Controller來實現應用的流量複製

同時,由於前面我們在流量複製配置中配置了proxy_set_header X-Shadow-Service $shadow_service_name,因此在K8S Stage Cluster目標應用接收的請求中,都會攜帶一個X-Shadow-Service頭來指明該鏡像流量來源於哪個線上應用。


分享到:


相關文章: