Настройка HTTP + HTTP и TCP-портов на LoadBalancer (хотите пересылать GitLab SSH и Web) - PullRequest
0 голосов
/ 06 июля 2018

Настройка, которую я хочу, довольно проста. Я размещаю gitlab внутри кластера kubernetes, и вход для него определяется как:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: gitlab-public
  namespace: gitlab
  annotations:
    kubernetes.io/ingress.global-static-ip-name: git-public
spec:
  tls:
    - secretName: gitlab-cert
  backend:
    serviceName: gitlab
    servicePort: 80

Это все настраивает для меня - SSL-терминация включена, он использует мои сертификаты letsencrypt. Проблема в том, что (очевидно) SSH не работает для хранилища. Порты на 22 открыты модулями, и я проверил это:

Both SSH and HTTP ports are forwarded

Однако похоже, что Ingress не поддерживает унифицированную спецификацию L4 + L7. Несколько других вариантов, которые я рассмотрел до сих пор:

  1. Создайте еще один балансировщик нагрузки, который перенаправляет только 22 -> 22 в качестве балансировщика TCP (или входа L4). Проблема в том, что несколько балансировщиков нагрузки не могут использовать один и тот же статический IP-адрес ... что, конечно, имеет смысл.
  2. По сути, делайте предыдущее, но получите новый DNS и статический IP, возможно, назовите его ssh.git.mycompany.com и используйте его для пересылки трафика SSH. Огромная проблема заключается в том, что многие разработчики используют это прямо сейчас, и им придется изменить свои .git/config файлы, и это будет чрезвычайно разрушительным (не в Силиконовой долине).
  3. Установите балансировщик L4 (вне любой конфигурации k8s) и разрешите ему обрабатывать SSL и настройте три порта для переадресации на 80 и 22. Это самый запутанный шаг из возможных ... потому что я понятия не имею, что такое Google LoadBalancer пытается сделать. Я не могу отобразить интерфейсы на серверы или даже выбрать свой собственный порт. Очевидно, это должно быть из списка предопределенных портов, что довольно глупо, я думаю? Напротив, в настоящее время мы размещены на AWS, и вот как выглядит балансировщик нагрузки:

enter image description here

Какой лучший способ обойти это?

РЕДАКТИРОВАТЬ: Изменение заголовка, поскольку ответ немного зависит от GitLab, поэтому может помочь людям, которые ищут точную проблему.

1 Ответ

0 голосов
/ 07 июля 2018

Итак, я не совсем уверен, работает ли это как ответ, потому что пока он достигает всего, что мы хотели сделать; он не поддерживает завершение SSL для балансировщика нагрузки.

Итак, основной компромисс таков:

  1. Заставить GitLab обслуживать SSL-соединения с помощью встроенного контроллера nginx. Настройки NGINX для GitLab
  2. Настройка GitLab для пересылки HTTP -> HTTP, стандартные вещи. Документация охватывает большую часть этого.
  3. Когда вы позволяете LoadBalancer обрабатывать SSL, вам просто нужно указать на секрет, и он будет работать (это происходит в определенном формате с ключами tls.crt и tls.key, оба в формате pem). Вы можете перенести одну и ту же структуру, смонтировав эти два ключа в файл и изменив настройки nginx (ssl_certificate и ssl_certificate_key):

В вашем разделе томов:

Объемы: - название: гитлаб-церт секрет: secretName: Предметы: - ключ: tls.key путь: git.mycompany.com.key - ключ: tls.crt путь: git.mycompany.com.crt

И смонтировать его в любом удобном для вас месте:

volumeMounts: - название: гитлаб-керц mountPath: / etc / gitlab / ssl /

В приведенном выше случае это сделает ваш gitlab.rb похожим на:

nginx['ssl_certificate'] = "/etc/gitlab/ssl/git.mycompany.com.crt"
nginx['ssl_certificate_key'] = "/etc/gitlab/ssl/git.mycompany.com.key"

В случае, если ваш домен, на котором вы размещаете, фактически git.mycompany.com, вы можете пропустить этот шаг, потому что расположение, указанное выше, является тем, к которому оно по умолчанию относится.

И, наконец, вместо использования Ingress, просто представьте ваше развертывание:

apiVersion: v1
kind: Service
metadata:
  name: gitlab
  namespace: gitlab
spec:
  type: LoadBalancer
  loadBalancerIP: <your-static-ip>
  ports:
    - port: 80
      name: http
      targetPort: 80
      protocol: TCP
    - port: 443
      name: https
      targetPort: 443
      protocol: TCP
    - port: 22
      name: ssh
      targetPort: 22
      protocol: TCP
  selector:
    app: gitlab

Статический ip для loadBalancerIP - это то, что вам нужно получить из вашей консоли Google. Обратите внимание, что это не будет работать для глобального зарезервированного IP. Вы должны получить региональный IP в том же регионе, что и ваш кластер.

Я бы все же предпочел терминацию SSL, потому что так работают все остальные наши сервисы, и неоднородность меня немного раздражает: (

...