Как вы уже заметили, вам нужно будет настроить пользовательский loadbalancer для выполнения этой работы. Этот loadbalancer должен быть внешним для вашего кластера и настроен самостоятельно.
Я предлагаю вам ознакомиться с концепциями Ingress
и ingress-controller
. Особенно полезен здесь nginx-ingress-controller.
Преимущество состояло в том, что вам нужно было бы настроить собственный пользовательский внешний балансировщик только один раз, а не для всех служб, которые вы хотели бы открыть. Ваш loadbalancer должен балансировать трафик до входного контроллера, который затем будет выполнять внутреннюю балансировку нагрузки на основе предоставленных ресурсов Ingress
.
Чтобы развернуть контроллер ингресс, оно должно быть достаточно, чтобы сделать следующее:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress/master/examples/deployment/nginx/default-backend.yaml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress/master/examples/deployment/nginx/nginx-ingress-controller.yaml
Первая строка создает default-backend
, который используется для всех несогласованных втекает. Он в основном просто возвращает 404
Вторая строка создает Deployment
с 1 репликой по умолчанию. В среде prod вы можете изменить счетчик реплик либо путем масштабирования развертывания, либо с помощью локальной модифицированной копии файла nginx-ingress-controller.yaml
. Кроме того, я бы посоветовал использовать выделенные узлы (используя DaemonSet + NodeAffinity + Taints + Tolerations) для входного контроллера, если вы ожидаете большого количества трафика.
Входящий контроллер теперь работает, не подвергаясь воздействию. Я полагаю, что демонстрация контроллера не является частью примеров, поскольку это слишком сильно зависит от используемой инфраструктуры. В вашем случае, вы должны создать Kubernetes Service
, который выставляет ингресс-контроллер в качестве NodePort
путем развертывания этого ресурса:
apiVersion: v1
kind: Service
metadata:
name: nginx-ingres-controller-svc
labels:
name: nginx-ingres-controller-svc
namespace: kube-system
spec:
type: NodePort
ports:
- port: 80
nodePort: 30080
name: http
- port: 443
nodePort: 30443
name: https
selector:
k8s-app: nginx-ingress-controller
Пожалуйста, обратите внимание, что nodePort
явно указано здесь. Это облегчает жизнь при настройке внешнего балансировщика.
После этого вы можете создать ресурсы для прямого внешнего трафика в свои внутренние службы. Например:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: example.company.org
http:
paths:
- path:/
backend:
serviceName: example-service
servicePort: 8080
Если у вас есть настройка центров обработки данных DNS для разрешения example.company.org
к внешней балансировки нагрузки, называя это приведет вас прямо к example-service
Все это, вероятно, звучит сложнее, чем просто с помощью NodePort и изменение конфигурации внешнего loadbalancer для новых сервисов. Но если он настроен один раз, конфигурация и автоматизация упрощаются. Он также дает массу новых функций, которые в противном случае должны быть реализованы вручную. Например, nginx-ingress-controller изначально поддерживает базовый auth, просто добавляя аннотацию к ресурсу Ingress
. Он также поддерживает letencrypt при использовании в сочетании с kube-lego
. Как сказано в начале, вы должны прочитать документацию о проникновении, чтобы выяснить, что она принесет бесплатно.
Вы можете использовать DNS round robin, создать запись DNS с несколькими конечными точками и использовать службу сторожевого таймера, чтобы обновить запись DNS со списком живых узлов? Кажется, вам нужно будет создать решение балансировки нагрузки перед ним. –
Привет - вы просили балансировщик нагрузки L4, но смешивайте в таких продуктах, как Nginx или HAproxy, из вышеперечисленных уровней. Должен ли быть изменен вопрос, чтобы избежать путаницы в будущем? – pagid