When TKGm is configured with AVI and contour package the following configuration takes place:
Since Avi is doing L4 only in this case, it can't set the X-Forwarded-For header as this option is only for HTTP L7 Virtual service, so that is not an option here.
Contour can be configured to operate using any of the above approaches:
If Contour is configured to use PROXY protocol then any packets that are not coming with PROXY protocol will be dropped so if a Pod within the cluster wants to access such service it will have to use PROXY protocol, which can be done via the flag curl --haproxy-protocol
https://example.com/
.
You can find more information on the following: https://everything.curl.dev/usingcurl/proxies/haproxy.html
To Complete the above scenario (enable proxy protocol on both AVI and contour) the following steps have to be applied:
1. Configure AVI to use Proxy under L4
Under AVI - Templates - Application - Create a new template with Enable proxy protocol v1 (do not select Preserve Client IP Address)
Associate this application profile with contour service.
2. Update installed contour to use Proxy
Update the contour package with the settings below where useProxyProtocol: true:
cat datavalues.yaml
infrastructure_provider: vsphere namespace: tanzu-system-ingress contour: useProxyProtocol: true replicas: 2 logLevel: info envoy: service: type: LoadBalancer annotations: {} externalTrafficPolicy: Cluster disableWait: false hostPorts: enable: true http: 80 https: 443 hostNetwork: false terminationGracePeriodSeconds: 300 logLevel: info certificates: duration: 8760h renewBefore: 360h
Update package with below example:
tanzu package installed update contour --package contour.tanzu.vmware.com --version <VERSION> --values-file datavalues.yaml --namespace tkg-system
cat proxy.yaml
apiVersion: projectcontour.io/v1 kind: HTTPProxy metadata: name: root namespace: projectcontour-roots spec: routes: - conditions: - prefix: / requestHeadersPolicy: set: - name: X-Client-IP value: '%DOWNSTREAM_REMOTE_ADDRESS_WITHOUT_PORT%' services: - name: rootapp port: 80 - conditions: - prefix: /secure services: - name: secureapp-default port: 80 virtualhost: fqdn: my.firstcontour.io
Where the code added is:
requestHeadersPolicy: set: - name: X-Client-IP value: '%DOWNSTREAM_REMOTE_ADDRESS_WITHOUT_PORT%'
As result test with curl command curl http://FQDN_OF_HTTP_PROXY:80 -v contains the following headers where the IP I am running curl from is 192.168.50.45: <li class="list-group-item">X-Client-Ip: [192.168.50.45]</li> <li class="list-group-item">X-Envoy-Expected-Rq-Timeout-Ms: [15000]</li> <li class="list-group-item">X-Envoy-Internal: [true]</li> <li class="list-group-item">X-Forwarded-For: [192.168.50.45]</li> <li class="list-group-item">X-Forwarded-Proto: [http]</li>