6

目前正在使用 Kubernetes(托管,DO)练习,我遇到了两天无法解决的问题。我有 nginx-ingress 设置以及 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
...

抱歉,如果这是一个愚蠢的问题,我认为我在这里混淆了一些基础知识。谢谢!

4

1 回答 1

5

所以我需要通过服务公开容器端口 22,然后通过入口

所以是与否:Ingress 专门用于虚拟主机,使用host:传入请求的标头(或 SNI)来了解要使用的后端。SSH 中没有这样的机制,或者至少没有我知道的 Ingress 控制器支持除 http 之外的协议来执行此操作。

但是,nginx 入口控制器支持TCP 和 UDP 服务,只要您可以为它们分配专用端口(在您的情况下,您可以)。您将创建一个ConfigMap条目,说明入口控制器 Service上的哪个端口映射到gitea 上 Service的端口,然后您需要在 Digital Ocean 中任何面向 Internet 的端口上公开端口 22,该端口将流量路由到入口控制器的Service.

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

您可以使用Digital Ocean 注释将某些端口切换到 TCP,但除了快速搜索之外,我没有进一步研究

我只是使用 nginx 入口控制器作为具体示例,但基于 haproxy 的入口控制器几乎肯定会这样做,并且其他控制器可能有类似的选项,因为您的问题是合理的

于 2019-10-12T03:16:49.090 回答