Kubernetes: балансировка нагрузки в двух разных пространствах имен

#kubernetes #load-balancing

#kubernetes #балансировка нагрузки

Вопрос:

Я хочу развернуть разные версии одного и того же приложения в рабочей среде:

 kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:1.0 -n test-a
kubectl create deployment hello-server --image=gcr.io/google-samples/hello-app:2.0 -n test-b
kubectl expose deployment hello-server --port 80 --target-port 8080 -n test-a
kubectl expose deployment hello-server --port 80 --target-port 8080 -n test-b
 

Я попытался сбалансировать нагрузку следующим образом:

 apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: test
  annotations:
    kubernetes.io/ingress.class: "nginx"
    nginx.org/server-snippets: |
        upstream test-servers-upstream {
          server hello-server.test-a:80;
          server hello-server.test-b:80;
        }
spec:
  rules:
    - host: test-servers.example.com
      http:
        paths:
          - path: /
            backend:
              serviceName: test-servers-upstream
              servicePort: 80
 

но он возвращает ошибку:

/ test-servers-upstream:80 (<ошибка: конечные точки «test-servers-upstream» не найдены>)

Услуги:

 $ kubectl get services -n test-b         
NAME           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)   AGE
hello-server   ClusterIP   10.128.199.113   <none>        80/TCP    75m
$ kubectl get services -n test-a 
NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)   AGE
hello-server   ClusterIP   10.128.207.6   <none>        80/TCP    75m
 

Как я могу сбалансировать нагрузку?

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

1. Не могли бы вы показать имена объектов сервиса?

2. @GiovanniPatruno, вот имена служб, я не могу их правильно отформатировать $ kubectl get services -n test-a -o широкий ТИП ИМЕНИ CLUSTER-IP ВНЕШНИЙ-IP ПОРТ (Ы) ВОЗРАСТ СЕЛЕКТОР привет-сервер ClusterIP 10.128.207.6 <нет> 80 / TCP 71m app=привет-сервер $ kubectlполучить службы -n тестов-b -o широкий ТИП ИМЕНИ КЛАСТЕР-IP ВНЕШНИЙ-IP ПОРТ (Ы) ВОЗРАСТ СЕЛЕКТОР привет-сервер ClusterIP 10.128.199.113 <нет> 80 / TCP 71m app=привет-сервер

3. @GiovanniPatruno, я обновил вопрос с объектами service для лучшего форматирования

4. Я просматривал ссылку на API, и кажется, что можно указать только одно имя службы. Я понимаю ваш «трюк» по добавлению фрагмента nginx для установки псевдонима, но я боюсь, что это не сработает. Вы пытались просто поставить hello-server as ServiceName ? PS Это страница документа, которую я прочитал.

5. @GiovanniPatruno хорошая находка. Есть ли какой-либо другой способ балансировки нагрузки в нескольких пространствах имен?

Ответ №1:

Fresh ingress-nginx поддерживает готовые развертывания canary на основе веса.
Похоже на то, о чем вы просите.
https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#canary .

Отличный пример здесь.
https://medium.com/@domi.stoehr/canary-deployments-on-kubernetes-without-service-mesh-425b7e4cc862

По сути, вы создаете 2 идентичных входа, по одному для каждого пространства имен.
Они отличаются только аннотациями и указаниями на разные сервисы.

 # ingress for a service A in namespace A
kind: Ingress
metadata:
  name: demo-ingress
  namespace: demo-prod
spec:
  rules:
  - host: canary.example.com
    http:
      paths:
      - backend:
          serviceName: demo-prod
          servicePort: 80
        path: /

# ingress for a service B in namespace B
# note canary annotations
kind: Ingress
metadata:
  annotations:
    nginx.ingress.kubernetes.io/canary: "true"
    nginx.ingress.kubernetes.io/canary-weight: "20"
  name: demo-ingress
  namespace: demo-canary
spec:
  rules:
  - host: canary.example.com
    http:
      paths:
      - backend:
          serviceName: demo-canary
          servicePort: 80
        path: /
 

Обратите внимание, что ingress-nginx реализация canary фактически требует, чтобы ваши сервисы находились в разных пространствах имен.