更新时间:2024-09-26 GMT+08:00
分享

为Nginx Ingress配置应用流量镜像

Nginx Ingress支持在不同集群内进行流量镜像(Traffic Mirror),将访问请求复制一份路由到镜像后端,但会忽略镜像后端的返回值,因此不会对原有请求造成影响,可用于系统的仿真测试和问题定位。本文介绍如何使用Nginx Ingress进行不同集群应用间的流量镜像。

图1 流量镜像

准备工作

步骤1:创建工作负载,并通过Ingress对外暴露服务

  1. 在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

  2. 对cluster-1集群执行以下命令,创建工作负载。

    kubectl apply -f nginx-deploy.yaml

  3. 在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中对应的服务中。

相关文档