为Nginx Ingress配置应用流量镜像
Nginx Ingress支持在不同集群内进行流量镜像(Traffic Mirror),将访问请求复制一份路由到镜像后端,但会忽略镜像后端的返回值,因此不会对原有请求造成影响,可用于系统的仿真测试和问题定位。本文介绍如何使用Nginx Ingress进行不同集群应用间的流量镜像。
准备工作
- 已创建2个CCE Standard集群cluster-1和cluster-2,详情请参见购买Standard/Turbo集群。
- 两个集群中均已安装NGINX Ingress控制器。
- 已安装和配置kubectl分别连接两个集群,详情请参见通过kubectl对接多个集群。
步骤1:创建工作负载,并通过Ingress对外暴露服务
- 在cluster-1集群中部署应用,并测试访问。
复制以下文件保存到nginx-deploy.yaml文件。
apiVersion: apps/v1 kind: Deployment metadata: labels: version: v1 name: nginx namespace: default spec: selector: matchLabels: app: nginx version: v1 template: metadata: labels: app: nginx version: v1 spec: containers: - name: container-1 image: nginx:latest imagePullPolicy: IfNotPresent terminationGracePeriodSeconds: 30 dnsPolicy: ClusterFirst replicas: 1 --- apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx namespace: default spec: selector: app: nginx externalTrafficPolicy: Cluster ports: - name: cce-service-0 targetPort: 80 port: 80 protocol: TCP type: NodePort --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: nginx namespace: default spec: rules: - host: example.com http: paths: - path: / backend: service: name: nginx port: number: 80 property: ingress.beta.kubernetes.io/url-match-mode: STARTS_WITH pathType: ImplementationSpecific ingressClassName: nginx
- 对cluster-1集群执行以下命令,创建工作负载。
kubectl apply -f nginx-deploy.yaml
- 在cluster-2集群中部署相同的应用,重复执行以上命令,创建相同的工作负载。
步骤2:配置流量复制
- cluster-2作为流量的接收方,不需要进行任何配置修改,只需要在cluster-1上配置即可。
- 在将cluster-1中应用的访问流量复制到cluster-2中对应的应用服务后,客户端只会收到cluster-1中的请求响应,cluster-2中的请求响应会被丢弃。
对cluster-1执行以下命令来配置流量镜像。更多关于Nginx Ingress流量镜像的配置请参考Nginx Ingress Mirror。
kubectl patch ingress nginx --type merge --patch '"metadata": {"annotations": {"nginx.ingress.kubernetes.io/mirror-target": "http://<cluster_2_ingress_ip_address>:80/", "nginx.ingress.kubernetes.io/mirror-host": "example.com"}}'
其中<cluster_2_ingress_ip_address>为cluster-2中Ingress负载均衡器的对外IP地址。
结果验证
执行以下命令,访问cluster-1的应用域名example.com,进行结果验证:
curl http://<cluster_1_ingress_ip_address>:80/ -H "Host: example.com"
同时查看cluster-1中nginx-ingress controller的日志:
kubectl logs -f <cceaddon-nginx-ingress-controller_pod_name> -n kube-system
其中<cceaddon-nginx-ingress-controller_pod_name>为nginx-ingress controller的Pod名字。
从日志中可以看到每次请求cluster-1中ingress对应的域名时,都将其复制一份同样的请求转发到cluster-2中对应的服务中。