K8S: Как связаться с модулем SSH (Gitea) на том же хосте, который предоставляет ingress-nginx и HTTP? - PullRequest
1 голос
/ 11 октября 2019

В настоящее время я тренируюсь с Kubernetes (под управлением DO). Я столкнулся с проблемой, которую не мог решить в течение двух дней. У меня есть nginx-ingress setup вместе с cert-manager и доменом, где git.domain.com указывает на IP балансировщика нагрузки. Я могу получить доступ к своему развертыванию Gitea через Интернет, кажется, что все работает.

Теперь я хочу добиться того, чтобы я мог также использовать SSH, как

git clone git@git.domain.com:org/repo.git

Так что мне как-то нужнооткрыть контейнерный порт 22 через сервис, затем через вход. Я попробовал пару вещей, но ни одна из них, похоже, не сработала, вероятно, потому что я начинающий в K8S. Вот рабочая настройка, которую я использую.

Определение сервиса:

apiVersion: v1
kind: Service
metadata:
  name: gitea-service
spec:
  selector:
    app: gitea
  ports:
  - name: gitea-http
    port: 3000
    targetPort: gitea-http
  - name: gitea-ssh
    port: 22
    targetPort: gitea-ssh

Определение входа

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: echo-ingress
  annotations:  
    kubernetes.io/ingress.class: nginx
    certmanager.k8s.io/cluster-issuer: letsencrypt-prod
spec:
  tls:
  - hosts:
    - git.domain.com
    secretName: letsencrypt-prod
  rules:
  - host: git.domain.com
    http:
      paths:
      - backend:
          serviceName: gitea-service
          servicePort: gitea-http

И часть моего развертывания, просто чтобы убедиться:

...
ports:
        - containerPort: 3000
          name: gitea-http
        - containerPort: 22
          name: gitea-ssh
...

Извините, если это глупый вопрос, я думаю, что здесь есть некоторые основы, которые я путаю. Спасибо!

1 Ответ

2 голосов
/ 12 октября 2019

Так что мне как-то нужно выставить контейнерный порт 22 через сервис, затем через вход

Так что да и нет: Ingress предназначен специально для виртуального хостинга с использованием host: заголовок (или SNI) входящего запроса, чтобы узнать, какой бэкэнд использовать. В SSH такого механизма нет, или, по крайней мере, нет контроллера Ingress, о котором я знаю, который поддерживает протоколы, отличные от http, для этого.

Однако, контроллер nginx Ingress поддерживает службы TCP и UDP при условии, что вы можете назначить для них выделенный порт (что в вашем случае можно). Вы должны создать запись ConfigMap, сообщающую, какой порт на входном контроллере *1013* 1015 * подключен к порту на gitea Service, и тогда вам нужно будет предоставить порт22 на все, что обращено к Интернету в Digital Ocean, который направляет трафик на входной контроллер Service.

[Internet] -> :22[load balancer] --> :12345[controller Service] --> :22[gitea-service]

. Существуют аннотации Digital Ocean , которые можно использовать для переключения определенных портов черезк TCP, но я не изучал это дальше, чем быстрый поиск

Я просто использовал входной контроллер nginx в качестве конкретного примера, но входные контроллеры на основе haproxy почти наверняка сделают это, и другие контроллеры могут иметьаналогичные варианты, потому что ваш вопрос является разумным

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...