У меня есть кластер Kubernetes на AWS, который установлен с использованием kops
(публичная топология). Одно из моих развертываний - это веб-сервер, который я хотел бы открыть через CloudFront, а другой - сервер API, который я хотел бы открыть через ALB.
В обоих случаях это будет означать, что о сертификатах позаботятся обо мне. В частности, для сервера API для меня важно иметь клиентские IP-адреса, поэтому мне нужна балансировка нагрузки HTTP, а не только TCP. Я также использую WebSockets, поэтому мне нужен ALB, а не ELB.
Создание «внешней службы» дает мне балансировщик нагрузки TCP ELB. Что касается веб-сервера, я мог бы просто указать CloudFront (стабильный ли эластичный IP-адрес?) Для TLS и кеширования. Для сервера API я мог бы указать на него ALB, но это кажется немного избыточным.
Согласно k8s документация, Я должен использовать контроллер входящего трафика nginx за ELB, но тогда я должен предоставить сертификаты для nginx (интегрировано ли решение с Let's Encrypt вообще?), И я потеряю IP-адрес клиента. К сожалению, примеры еще не написаны.
Какое в настоящее время правильное решение для того, что я хочу делать? Полагаю, это довольно частый случай.
Вам не нужны ELB и ALB.
Выделите некоторые из узлов вашего кластера в качестве узлов балансировки нагрузки. Поместите их в другую группу узлов, дайте им какой-нибудь ярлык: mynodelabel/ingress: nginx
, а затем в этой группе узлов размещается демон входящего трафика nginx.
Наиболее важные варианты:
spec:
restartPolicy: Always
dnsPolicy: ClusterFirst
hostNetwork: true
nodeSelector:
mynodelabel/ingress: nginx
и
ports:
- containerPort: 80
hostPort: 80
- containerPort: 443
hostPort: 443
Таким образом вы получаете чистый пользовательский трафик!
Контроллер входящего трафика Nginx отлично работает с kube-lego Let's Encrypt!
Назначьте эластичные IP-адреса своим узлам балансировки нагрузки k8s и просто укажите на них DNS-запись route53.
При желании вы можете испортить свои узлы балансировки нагрузки, чтобы обычные модули не работали с ними и замедляли работу nginx.