在LoadBalancer上设置HTTP + HTTPs和TCP端口(希望转发GitLab SSH和Web)

时间:2018-07-06 08:21:48

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

我想要的设置非常简单。我将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终止,它使用了我的letencrypt证书。问题是(显然)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 :(得分:0)

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

所以基本的折衷办法是:

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

在您的交易量部分:

卷:      -名称:gitlab-cert        秘密:        secretName:          项目:            -键: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

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

我仍然希望使用SSL终止,因为这是我们所有其他服务的工作方式,而且非同质性有点让我烦恼:(