首页 > 解决方案 > 在 LoadBalancer 上设置 HTTP+HTTPs 和 TCP 端口(想要转发 GitLab SSH 和 Web)

问题描述

我想要的设置相当简单。我在 kubernetes 集群中托管 gitlab,它的入口定义为:

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 的端口由 pod 公开,我已经验证了它:

SSH 和 HTTP 端口都被转发

但是,看起来 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 上,这就是负载均衡器的外观:

在此处输入图像描述

解决这个问题的最佳方法是什么?

编辑:修改标题,因为答案有点特定于 GitLab,因此可能会帮助人们寻找确切的问题。

标签: kubernetesgoogle-cloud-platformgoogle-kubernetes-engine

解决方案


所以,我不完全确定这是否可以作为答案,因为虽然它实现了我们想要做的一切;它不支持负载均衡器的 SSL 终止。

所以基本的妥协是这样的:

  1. 让 GitLab 使用捆绑的 nginx 控制器提供 SSL 连接。GitLab 的 NGINX 设置
  2. 设置 GitLab 以转发 HTTP -> HTTPS,标准的东西。文档涵盖了大部分内容。
  3. 当让 LoadBalancer 处理 SSL 时,您只需指向一个秘密,这将起作用(它恰好是带有密钥的特定格式tls.crttls.key,两者都是 pem 格式)。您可以通过将这两个键安装为文件然后更改 nginx 设置(ssl_certificatessl_certificate_key)来继承相同的结构:

在您的卷部分:

卷:-名称:gitlab-cert 秘密:秘密名称:项目:-密钥:tls.key 路径:git.mycompany.com.key -密钥:tls.crt 路径:git.mycompany.com.crt

并将其安装在您想要的任何位置:

volumeMounts:-名称:gitlab-certs 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

静态 iploadBalancerIP是您需要从您的谷歌控制台获取的东西。请注意,这不适用于全局保留 IP。您必须在与集群相同的区域中获得区域 IP。

我仍然更喜欢 SSL 终止,因为这就是我们所有其他服务的工作方式,并且非同质性有点让我恼火:(


推荐阅读