События 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

Другие вопросы по тегам