Kubernetes, балансировка нагрузки и Nginx Ingress - AKS

Стек: служба Azure Kubernetes
NGINX Ingress Controller - https://github.com/kubernetes/ingress-nginx
AKS Loadbalancer
Контейнеры Docker

Моя цель - создать кластер K8s, который позволит мне использовать несколько модулей под одним IP-адресом для создания микросервисной архитектуры. После работы с множеством руководств и документации мне не повезло с моей конечной целью. Я дошел до того, что смог получить доступ к единственному развертыванию с помощью Loadbalancer, но внедрение входящего трафика пока не увенчалось успехом. Для удобства чтения и простоты управления службы разделены на соответствующие файлы.

Кроме того, в мой кластер был добавлен Ingress Controller, как описано в инструкциях по установке, используя: kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.35.0/deploy/static/provider/cloud/deploy.yaml

LoadBalancer.yml:

apiVersion: v1
kind: Service
metadata:
  name: backend
spec:
  loadBalancerIP: x.x.x.x
  selector:
    app: ingress-service
    tier: backend
  ports:
  - name: "default"
    port: 80
    targetPort: 80
  type: LoadBalancer

IngressService.yml:

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: ingress-service
  annotations:
    kubernetes.io/ingress.class: nginx
spec:
  rules:
  - http:
      paths:
      - path: /api
        backend:
          serviceName: api-service
          servicePort: 80

api-deployment.yml

apiVersion: v1
kind: Service
metadata:
  name: api-service
spec:
  selector:
    app: api
  ports:
    - port: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
   name: api-deployment
spec:
  selector:
    matchLabels:
      app: api
      tier: backend
      track: stable
  replicas: 1
  template:
    metadata:
      labels:
        app: api
        tier: backend
        track: stable
    spec:
      containers:
      - name: api
        image: image:tag
        ports:
        - containerPort: 80
        imagePullPolicy: Always
      imagePullSecrets:
      - name: SECRET

API в изображении правильно отображается через порт 80.

После применения каждой из вышеперечисленных служб и развертываний yml я пытаюсь выполнить веб-запрос к одному из ресурсов api через IP-адрес LoadBalancer и получаю только тайм-аут на свои запросы.


person Carson    schedule 10.09.2020    source источник
comment
зачем вам loadbalancer.yaml? В развертывании входящего трафика уже есть балансировщик нагрузки, просто используйте этот существующий фунт и получите доступ к IP-адресу фунта. Кроме того, я не вижу имени хоста под вашим входом, не уверен, что он должен работать   -  person 4c74356b41    schedule 10.09.2020
comment
Если я не использую Azure Loadbalancer, как мне настроить IP-адрес для отправки моих запросов?   -  person Carson    schedule 10.09.2020
comment
если нет - вероятно, не простой способ, порт узла и общедоступный ip для каждого узла. очень хрупкий   -  person 4c74356b41    schedule 10.09.2020


Ответы (1)


Нашел свой ответ после того, как достаточно поискал. По сути, проблема заключалась в том, что Ingress Controller имеет встроенный балансировщик нагрузки в yaml, как упоминалось в комментариях выше. Однако селектор для этого LoadBalancer требует пометить вашу службу Ingress как часть класса. Затем эта служба Ingress указывает на каждую из служб, подключенных к вашим модулям. Мне также пришлось сделать небольшую модификацию, чтобы можно было использовать статический IP-адрес в предоставленном балансировщике нагрузки.

person Carson    schedule 10.09.2020