Kubernetes, балансировка нагрузки и вход Nginx — AKS

#kubernetes #kubernetes-ingress #nginx-ingress #azure-aks #azure-load-balancer

#кубернетес #kubernetes-вход #вход nginx #лазурный-акс #azure-балансировщик нагрузки

Вопрос:

Стек: Контроллер входа службы Azure Kubernetes
NGINX —https://github.com/kubernetes/ingress-nginx
Контейнеры Docker для балансировки нагрузки AKS

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

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

Балансировщик нагрузки.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 — Входящий сервис.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-развертывание.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-адрес балансировщика нагрузки и получаю только тайм-аут на мои запросы.

Комментарии:

1. зачем вам нужен loadbalancer.yaml? в развертывании ingress уже есть балансировщик нагрузки, просто используйте существующий lb и получите доступ к IP-адресу lb. кроме того, я не вижу имя хоста под вашим входом, не уверен, что это должно работать

2. Если я не использую Azure Loadbalancer, как мне установить IP-адрес для отправки моих запросов?

3. если это не так — вероятно, нет простого способа, порта узла и общедоступного IP для каждого узла. очень хрупкий

Ответ №1:

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