All Products
Search
Document Center

Container Service for Kubernetes:Use an Ingress controller to mirror network traffic

Last Updated:Aug 06, 2024

Cross-cluster traffic mirroring is the process of mirroring traffic from a production environment to a staging environment to run simulation tests or troubleshoot issues. You can use this method to run tests and perform troubleshooting without interrupting your businesses in the production environment. This topic describes how to use the NGINX Ingress controller to mirror traffic between Container Service for Kubernetes (ACK) clusters.

Prerequisites

Use scenarios

Traffic mirroring can be used in the following scenarios:

  • Production workload simulation:

    Before you make important changes to a system or release new features, you must run stress tests to assess the stability of the system. In most cases, production workloads are simulated in a staging environment to test the stability of a new system before the system is released. However, the actual loads are difficult to estimate because the system may receive both normal and abnormal network traffic. To resolve this issue, you can mirror network traffic from applications that are deployed in the production environment to the staging environment. Then, you can simulate the production workloads in the staging environment.

  • Troubleshooting:

    When a system deployed in a production environment encounters a performance bottleneck and you cannot locate the cause, you can mirror the network traffic of the system to a staging environment. This way, you can troubleshoot errors in the staging environment.

In this example, an ACK cluster named K8s Product Cluster resides in a production environment and an ACK cluster named K8s Stage Cluster resides in a staging environment.

image

Preparations

To mirror 100% production traffic from K8s Product Cluster to the application in K8s Stage Cluster, replicate all requests destined for example.com and redirect them to example1.com.

image

Step 1: Deploy an application in the staging environment

  1. Create a file named my-nginx.yaml in K8s Stage Cluster and add the following content to the file.

    Note

    You need only to deploy an application in K8s Stage Cluster to receive the mirrored traffic. Do no change the configuration of the cluster.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            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: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-ingress
    spec:
      rules:
      - host: example1.com
        http:
          paths:
          - path: /
            backend:
              service: 
                name: nginx-service
                port:
                  number: 80
            pathType: ImplementationSpecific
  2. Run the following command to deploy the my-nginx application:

    kubectl apply -f my-nginx.yaml
  3. Run the following command to view the Ingress configurations:

    kubectl get ing nginx-ingress

    Expected output:

    NAME            HOSTS         ADDRESS      PORTS       AGE                                                         
    nginx-ingress   example1.com  47.**.**.53   80          8m
  4. Run the following command to access the domain name of the application in order to test the domain name resolution setting:

    curl http://example1.com

Step 2: Configure traffic mirroring in the production environment

Note

After an application is deployed in K8s Product Cluster, you need to add the traffic mirroring annotations to the Ingress.

  1. Create a file named my-nginx.yaml in K8s Product Cluster and add the following content to the file:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
          - image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6
            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
  2. Run the following command to deploy the my-nginx application:

    kubectl apply -f my-nginx.yaml
  3. Create a file named my-ingress.yaml and add the following Ingress configuration to the file.

    • Add nginx.ingress.kubernetes.io/mirror-target and set the value to ADDRESS of K8s Stage Cluster in Step 3. This annotation applies only to HTTP and HTTPS. For more information, see ingress-nginx_mirror.

    • Add nginx.ingress.kubernetes.io/mirror-host and set the value to HOSTS of K8s Stage Cluster in Step 3.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: nginx-ingress
      annotations:
        nginx.ingress.kubernetes.io/mirror-target: "http://47.**.**.53$request_uri"  #Specify the destination address of the mirrored traffic. 
        nginx.ingress.kubernetes.io/mirror-request-body: "off"            # Request bodies are not sent to the destination. To send request bodies to the destination, delete this annotation. 
        nginx.ingress.kubernetes.io/mirror-host: "example1.com"           # Set the Host header of the mirrored traffic. 
    spec:
      rules:
      - host: example.com
        http: 
          paths:
          - path: /
            backend:
              service: 
                name: nginx-service
                port:
                  number: 80
            pathType: ImplementationSpecific
  4. Run the following command to deploy the Ingress:

    kubectl apply -f my-ingress.yaml
  5. Run the following command to view the Ingress configurations:

    kubectl get ing nginx-ingress

    Expected output:

    NAME            HOSTS          ADDRESS        PORTS     AGE                                                       
    nginx-ingress   example.com   39.**.**.54   80        1m
  6. Run the following command to check whether you can access the domain name of the application:

    curl http://example.com

Verify the configuration

Access the domain name example.com in K8s Product Cluster. After you run the following command, the output shows that requests destined for the domain name are replicated. The replicated requests are redirected to the application in K8s Stage Cluster.

kubectl -n kube-system logs --tail=0 -f nginx-ingress-controller-674c96ffbc-9mc8n

流量复制结果验证