События Argo: доступ к Webhook через балансировщик нагрузки K8s в подсети Azure
Я пытаюсь перенаправить запросы POST через балансировщик нагрузки K8s на Webhook в Argo Events. Я не могу найти четкой документации по этому поводу. Я могу создать веб-перехватчик, и я могу успешно общаться с ним, когда перенаправляю веб-перехватчик-события-svc. Балансировщик нагрузки построен отлично и отображает внешний IP-адрес, который я назначаю. Однако, когда я пытаюсь выполнить POST-запрос в Load Balancer, я просто получаю ошибку тайм-аута соединения. Надеюсь, я просто неправильно настроил эти манифесты.
Вот манифест для обеих служб.
apiVersion: argoproj.io/v1alpha1
kind: EventSource
metadata:
name: webhook
namespace: argo-events
spec:
service:
ports:
- port: 12000
targetPort: 12000
webhook:
example:
endpoint: /deploy
method: POST
port: "12000"
---
apiVersion: v1
kind: Service
metadata:
name: webhook-loadbalancer
namespace: argo-events
annotations:
service.beta.kubernetes.io/azure-load-balancer-internal: "true"
service.beta.kubernetes.io/azure-load-balancer-internal-subnet: DevelopSubnet
spec:
type: LoadBalancer
loadBalancerIP: 1XX.X.X.XXX
ports:
- protocol: TCP
port: 90
targetPort: 12000
selector:
app: webhook-eventsource-svc
controller: eventsource-controller
А вот как я отправляю запрос:
curl -d '@params.json' -H "Content-Type: application/json" -X POST http://1XX.X.X.XXX:90/deploy
Какие-либо предложения?
2 ответа
Я пытаюсь сделать что-то подобное в AWS. Я могу заставить образец веб-перехватчика работать с переадресацией портов (https://argoproj.github.io/argo-events/quick_start/). Но он не будет работать с обычными объектами K8s. В моем случае объект Ingress и Service. Я вижу, что мой селектор службы правильно выбирает модуль датчика веб-перехватчика. И Argo Events, и Argo Workflow работают в одном и том же пространстве имен argo. После настройки доступ к Ingress от Postman возвращает 404. Что меня сбивает с толку, так это то, что фактический порт, который выставляет блок датчиков, в образце равен 7777, а не 12000. Итак, я пробовал службу с портом 12000 / TargetPort 12000 или 7777. В любом случае POST возвращает 404.
Я могу отметить, что это применимо в вашем и моем случае (https://argoproj.github.io/argo-events/eventsources/services/) во втором абзаце говорится, что вы должны удалить поле службы из вашего EventSource объект для рефакторинга образца из переадресации портов. Надеюсь, поможет. Я все еще пытаюсь сделать эту работу.
просто хотел рассказать, как вы предоставляете веб-перехватчик, поэтому в зависимости от документации, когда вы хотите предоставить веб-перехватчик
apiVersion: argoproj.io/v1alpha1
kind: EventSource
metadata:
name: webhook
spec:
# to expose this endpoint to public internet we need to remove this part
# service:
# ports:
# - port: 12000
# targetPort: 12000
webhook:
example:
port: "12000"
# now this is the endpoint you may want to expose with your ingress/virtualService/etc..
endpoint: /webhook
method: POST
следующая часть — создать сервис, который будет указывать на вебхук
apiVersion: v1
kind: Service
metadata:
name: webhook-eventsource
spec:
ports:
- port: 12000
protocol: TCP
name: tcp
targetPort: 12000
selector:
# pods created from `EventSource` will have the label of `eventsource-name=eventsourcename` by default so we use this selector to select it
eventsource-name: webhook
type: ClusterIP
И последнее, но не менее важное: вам нужно будет предоставить службу с помощью конечной точки (в моем примере я использую ISTIO с виртуальной службой)
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: https
namespace: istio-system
spec:
hosts:
- "*"
gateways:
- http-gateway
http:
# this URL matching should match the URL inside the following "EventSource.webhook.example"
# it is not intended to be used like "/webhook/webhook" the URL should directly match the one inside the object "webhook"
- match:
- uri:
prefix: /webhook
route:
- destination:
host: webhook-eventsource.argo-events.svc.cluster.local
port:
number: 12000
здесь очень важно отметить, что оба/webhook
внутриEventSource
точно соответствует URL-адресу в вашемingress/virtualService