【问题标题】:Setting up HTTP+HTTPs and TCP ports on a LoadBalancer (Want to forward GitLab SSH and Web)在 LoadBalancer 上设置 HTTP+HTTPs 和 TCP 端口(想要转发 GitLab SSH 和 Web)
【发布时间】:2018-07-06 08:21:48
【问题描述】:

我想要的设置相当简单。我在 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 公开,我已验证:

但是,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,因此可能会帮助人们寻找确切的问题。

【问题讨论】:

    标签: kubernetes google-cloud-platform google-kubernetes-engine


    【解决方案1】:

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

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

    1. 让 GitLab 使用捆绑的 nginx 控制器提供 SSL 连接。 NGINX Settings for GitLab
    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

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

    体积安装: - 名称:gitlab-certs 挂载路径:/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
    

    loadBalancerIP 的静态 IP 是您需要从 Google 控制台获取的内容。请注意,这不适用于全局保留 IP。您必须获得与集群位于同一区域的区域 IP。

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

    【讨论】:

    • 您可以将 Nginx 配置为使用 SSL 作为与上游服务器的代理连接,但显然这实际上只是在进程中添加了一个额外的 SSL 终止,而不是消除了 Nginx 终止。不能用 Nginx 作为负载均衡器吗?
    • 我使用的 nginx 实例是与 gitlab 捆绑在一起的,因此它本质上是每个创建的 pod 的一个 nginx 实例。要将其用作负载均衡器,我必须在捆绑的控制器之外安装一个 nginx 控制器,然后使用它对创建的 pod 上的连接进行负载平衡。如果我没记错的话,这就是 nginx-ingress 组件的作用。然后出现的问题是它不能从同一配置混合 L4 和 L7 负载平衡。并且不均匀的问题仍然存在。
    猜你喜欢
    • 2021-03-14
    • 2015-05-23
    • 2013-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    相关资源
    最近更新 更多