XFF header in kong ingress - amazon-web-services

I've recently started to work with kong, on my ngnix ingress I had XFF header set as follows:
annotations: kubernetes.io/ingress.class: nginx nginx.ingress.kubernetes.io/configuration-snippet: | more_set_headers "X-Forwarded-For $http_x_forwarded_for";
I am now trying to add the XFF header to the kong ingress however it seems like the kong.config file isn't available for me (some internal reasons I'm trying to figure) but adding it manually for the ing should also do the trick if I understand correctly.
I found that the below config can be added:
name: ingress namespace: default config: functions: - ngx.var.upstream_x_forwarded_for=xxxxx plugin: serverless-functions
However it seems something is off with my syntax, would appreciate any input on the matter

Related

Kiali is not working with VictoriaMetricsHello

Was anyone was able to make kiali visualise mesh using VictoriaMetrics instead of Prometheus?
When I use prometheus and kiali setup from istio samples then Mesh Visualisation works.
But when I replace prometheus with Victoria Metrics (agent, select, insert, storage) then kiali simply showing empty graph.
I have checked that both Prometheus and Victoria Metrics have the same istio_requests_total metric.
But when I use Victoria Metrics select URL in spec.external_services.prometheus.url the graph comes empty.
apiVersion: kiali.io/v1alpha1
kind: Kiali
metadata:
name: kiali
namespace: istio-system
spec:
auth:
strategy: anonymous
external_services:
istio:
config_map_name: istio-1-14
url_service_version: http://istiod-1-14:15014/version
prometheus:
url: http://vmselect-example-vmcluster-persistent.poc.svc.cluster.local:8481/select/0/prometheus/
In logs I see two errors related to the fact that vm-select does not have corresponding endpoints
2022-07-15T19:25:13Z ERR Failed to fetch Prometheus configuration: bad_response: readObjectStart: expect { or n, but found r, error found in #1 byte of ...|remoteAddr:|..., bigger context ...|remoteAddr: "10.4.34.83:57468"; requestURI: /select|...
2022-07-15T19:25:13Z ERR Failed to fetch Prometheus flags: bad_response: readObjectStart: expect { or n, but found r, error found in #1 byte of ...|remoteAddr:|..., bigger context ...|remoteAddr: "10.4.34.83:57468"; requestURI: /select|...
and multiple warnings
2022-07-15T19:35:28Z WRN Skipping {destination_canonical_revision="v1", destination_canonical_service="microservice", destination_cluster="Kubernetes", destination_service="microservice.poc.svc.cluster.local", destination_service_name="microservice", destination_service_namespace="poc", destination_workload="microservice", destination_workload_namespace="poc", request_protocol="http", response_code="200", response_flags="-", source_canonical_revision="latest", source_canonical_service="istio-ingressgateway-internal", source_cluster="Kubernetes"}, missing expected TS labels
Here is my VMPodScrape which I expect will take all metrics from all pods
apiVersion: operator.victoriametrics.com/v1beta1
kind: VMPodScrape
metadata:
name: all-scrape
namespace: poc
spec:
podMetricsEndpoints:
- scheme: http
path: /stats/prometheus
targetPort: 15090
selector: {}
namespaceSelector:
any: true
Error messages don't look critical, in case of error kiali should use default values. As far as I understand, it tries to recognize scrape interval and retention based on prometheus configuration file and flags.
I think you have an issue with relabeling config, it drops labels required for kiali.
There is docs with needed labels by metric name:
https://kiali.io/docs/faq/general/#which-istio-metrics-and-attributes-are-required-by-kiali
I'd recommend check scrape config at VMAgent. Probably relabeling rules are outdated.

istio operator: pass ingress mTLS certs via files

I am trying to pass mTLS certs to istio ingress gateway via files and not via secrets.
Vault init-container will store certs at
/etc/istio/ingressgateway-certs/tls.key
/etc/istio/ingressgateway-certs/tls.cert
/etc/istio/ingressgateway-ca-certs/ca-chain.cert.pem
So I m trying to remove secret element via patch like this
- path: spec.template.spec.volumes[name:ingressgateway-ca-certs].emptyDir
value: {}
- path: spec.template.spec.volumes[name:ingressgateway-certs].emptyDir
value: {}
- path: spec.template.spec.volumes[name:ingressgateway-certs].secret
- path: spec.template.spec.volumes[name:ingressgateway-certs].secret.secretName
- path: spec.template.spec.volumes[name:ingressgateway-ca-certs].secret.secretName
- path: spec.template.spec.volumes[name:ingressgateway-ca-certs].secret
but it is not working.
Doc says, "For delete, value should be unset."
https://istio.io/latest/docs/reference/config/istio.operator.v1alpha1/#K8sObjectOverlay-PathValue
istioctl manifest generate command still includes secret section.
I also tried setting the value to "unset" but (as exptected) ended up using unset as literal value for secret name.
Any pointers are appreciated.
Used this to delete it since vault sidecar will mount it.
- path: spec.template.spec.volumes[name:ingressgateway-ca-certs]
- path: spec.template.spec.volumes[name:ingressgateway-certs]
but in final solution, configured and rendered certificates at a different path to avoid conflicts with default paths. E.g.
/etc/istio/ingressgateway/certs/tls.key
/etc/istio/ingressgateway/certs/tls.cert
/etc/istio/ingressgateway/ca-certs/ca-chain.cert.pem

Setting a custom call source header with Istio

I have a setup using Kubernetes and Istio where we run a set of services. Each of our services have an istio-sidecar and a REST-api. What we would like is that whenever a service within our setup calls another that the called service knows what service is the caller (Preferably through a header).
Looking at the example image from bookinfo:
bookinfo-image (Link due to <10 reputation)
This would mean that in the source code for the ratings service I would like to be able to, for example, read a header telling me the request came from e.g. Reviews-v2.
My intuition tells me that I should be able to handle this in the istio sidecars, but I fail to realise exactly how.
Until now I have looked at especially envoy filters in the hope that they could help me. I see that for the envoy filters I would be able to set a header, but what I don't see is how I would get the information about what service made the call in order to set it in the header.
Envoy automatically sets the X-Forwarded-Client-Cert header, which contains the SPIFFE ID of the caller. SPIFFE ID in Istio is a URI in the form spiffe://cluster.local/ns/<namespace>/sa/<service account>. Practically, it designates the Kubernetes Service Account of the caller. You may want to test it by using the Istio httpbin sample and sending a request to httpbin:8000/headers
I ended up finding another solution by using a "rule". If we made sure that policy enforcing is enabled and then added the rule:
apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
name: header-rule
namespace: istio-system
spec:
actions: []
requestHeaderOperations:
- name: serviceid
values:
- source.labels["app"]
operation: REPLACE
We achieved what we were attempting to do.

How can I confirm whether Circuit Breaking (via DestinationRule) is at work or not for external service (ServiceEntry & VirtualService)

Summary of Problem
I'm trying to impose Circuit Breaker parameters for an external endpoint outside of my mesh, hosted somewhere else. However, the parameters I have set doesn't seem to be imposed because I am still getting successful HTTP 200 responses, when I expect it to start failing with HTTP 503.
Tools versions are:
Istio-1.2.4
Kubernetes: v1.10.11
Docker Dekstop Version 2.0.0.3
Notable config:
global.outboundTrafficPolicy.mode is REGISTRY_ONLY.
Within Mesh is mTLS. External traffic policy, TLS is DISABLED
Related Resources
ServiceEntry
apiVersion: networking.istio.io/v1alpha3
kind: ServiceEntry
metadata:
name: external-service
spec:
hosts:
- external-service.sample.com
location: MESH_EXTERNAL
exportTo:
- "*"
ports:
- number: 80
name: http
protocol: HTTP
resolution: DNS
VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: external-service-vs
spec:
hosts:
- external-service.sample.com
http:
- timeout: 200ms
retries:
attempts: 1
perTryTimeout: 200ms
route:
- destination:
host: external-service.sample.com
port:
number: 80
DestinationRule
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: external-service-dr
spec:
host: external-service.sample.com
trafficPolicy:
tls:
mode: DISABLE
connectionPool:
tcp:
maxConnections: 1
connectTimeout: 200ms
http:
http2MaxRequests: 1
http1MaxPendingRequests: 1
maxRequestsPerConnection: 1
maxRetries: 1
idleTimeout: 200ms
outlierDetection:
consecutiveErrors: 1
interval: 1s
baseEjectionTime: 10s
maxEjectionPercent: 100
Testing
I have an application inside the mesh injected with an Envoy Proxy. The app basically just run load concurrent for HTTP1.1 GET external-service.sample.com/endpoint.
I adjust the number of concurrent users in the App (1 to 10) and requests per second per user (1 to 20).
I was expecting for the response to start failing with the ramp up. But that's not the case. I get success throughout.
Key Asks
If you see something very glaring, please point it out.
I already checked logs and /stats from my Envoy Proxy (outgoing request and response). What other istio logs do I need to check to understand more whether the request was subjected and evaluated by istio to the destinationrule or not?
Besides the statistic data gathered by Istio Mixer from nested Envoy instances, you might consider fetching Circuit Breaker events from Envoy Access logs.
Since Access logging enabled across Istio mesh plane, you can extract the relevant Circuit Breaker log entries, distinguished by specific response flags:
UO: Upstream overflow (circuit breaking) in addition to 503 response
code.
And fetched up record from container's envoy proxy access logs, i.e:
[2019-09-18T09:49:56.716Z] "GET /headers HTTP/1.1" 503 UO "-" "-" 0 81 0 - "-"
I have not really addressed the issue directly on this.
But, I have done the whole setup from the start with a clean slate all over again from setting up istio. And after that it was already throwing the expected HTTP 503.
It was rather challenging than necessary to know the state of the circuit breakers. There was supposed to be a ticket logged, but it seems development for such feature is not yet on the horizon.
Nevertheless, when verifying, I did take a look on some telemetry metrics to understand the circuit breaker state. I think this way could be better because I only want to know whether the circuit is close or open at a moment and not analyze from multiple input data.
Thanks.

How to enable user-level rate limiting in istio

I saw Istio site mention Rate Limiting support but I can only find global rate-limit example.
Is it possible to do so at user-level? For example, if my user logged in but sends more than 50 requests within a second then I'd like to block said user, etc. In a similar situation, if user doesn't logged in then that device cannot send more than 30 requests per seconds.
Yes it is possible to conditionally apply rate limits based on arbitrary
attributes using a match condition in the quota rule.
apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
name: quota
namespace: istio-system
spec:
match: source.namespace != destination.namespace
actions:
- handler: handler.memquota
instances:
- requestcount.quota
The quota will only apply when the source namespace is not equal to the destination namespace. In your case you probablty want to set a match like this:
match:
request:
headers:
cookie:
regex: "^(.*?;)?(user=jason)(;.*)?$"
I made a PR to improve the rate-limiting docs you can find it here: https://github.com/istio/istio.github.io/pull/1109