Я пытаюсь установить простой HTTP-фильтр через Envoy Filter. Я использую совершенно новый кластер EKS, созданный с помощью Terraform, и Istio, установленное с Helm, с его последней версией и значениями по умолчанию.
Я пытаюсь достичь простого скрипта Python, который получает HTTP-запрос и распечатывает заголовок.
Ниже приведены ресурсы, которые я использую.
Скрипт на Python:
from flask import Flask, redirect, url_for, request, Response
import logging
app = Flask(__name__)
@app.route('/status', methods=['GET', 'POST'])
def parse_request():
data = request.data # data is empty
# need posted data here
headers = request.headers
print(headers)
app.logger.info(headers)
status_code = Response(status=200)
return status_code
if __name__ == '__main__':
app.run(app.run(debug=True, port=5000, host='0.0.0.0'))
K8s проявляет:
- Развертывание
apiVersion: apps/v1
kind: Deployment
metadata:
name: http
labels:
app: http
spec:
replicas: 1
selector:
matchLabels:
app: http
template:
metadata:
labels:
app: http
run: http_pod
spec:
containers:
- image: flask_http_test:latest
imagePullPolicy: Always
name: http
ports:
- containerPort: 5000
restartPolicy: Always
imagePullSecrets:
- name: regcred
- Шлюз и VirtualService
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: mygateway
labels:
app: http
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
kind: VirtualService
apiVersion: networking.istio.io/v1alpha3
metadata:
name: http-service-vs
namespace: http
labels:
app: http
spec:
hosts:
- "*" # host name of api
gateways:
- mygateway
http:
- match:
- uri:
prefix: /
route:
- destination:
host: http-service-svc # k8s service name
port:
number: 5000 # pod port
EOF
- Фильтр посланника
apiVersion: networking.istio.io/v1alpha3
kind: EnvoyFilter
metadata:
name: http-service-svc-header-filter
namespace: http
spec:
workloadLabels:
app: http-service-svc
namespace: http
filters:
- listenerMatch:
portNumber: 5000
listenerType: SIDECAR_INBOUND
listenerProtocol: HTTP
filterName: envoy.lua
filterType: HTTP
filterConfig:
inlineCode: |
function envoy_on_request(request_handle)
request_handle:headers():add("newheader", "it works!")
end
Я могу связаться со своим сервисом через Istio Ingress Gateway, но проблема в том, что фильтр полностью игнорирует. Я также попытался определить добавление фильтра в пространство имен istio-system без workloadSelector, но он по-прежнему игнорируется.
Кто-нибудь знает, где может быть проблема?