kubernetes - 在 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 公开,我已经验证了它:
但是,看起来 Ingress 不支持统一的 L4+L7 规范。到目前为止,我考虑过的其他一些选择:
- 创建另一个负载均衡器,它只转发 22 -> 22 作为 TCP(或 L4 入口)均衡器。问题是多个负载均衡器不能共享同一个静态 IP。这当然是有道理的。
- 基本上是做前面的事情,但是得到一个新的DNS和静态IP,大概调用它
ssh.git.mycompany.com
并用它来转发SSH流量。最大的问题是现在有很多开发人员在使用它,他们将不得不更改他们的.git/config
文件,这将是极具破坏性的(不是以硅谷的方式)。 - 设置一个 L4 平衡器(在任何 k8s 配置之外)并让它处理 SSL 并设置三个端口以转发到 80 和 22。这是可能最令人困惑的步骤..因为我不知道 Google LoadBalancer 试图做什么做。我无法将前端映射到后端,甚至无法选择自己的端口。显然,它必须来自预定义端口列表,我猜这很愚蠢?相比之下,我们目前托管在 AWS 上,这就是负载均衡器的外观:
解决这个问题的最佳方法是什么?
编辑:修改标题,因为答案有点特定于 GitLab,因此可能会帮助人们寻找确切的问题。
解决方案
所以,我不完全确定这是否可以作为答案,因为虽然它实现了我们想要做的一切;它不支持负载均衡器的 SSL 终止。
所以基本的妥协是这样的:
- 让 GitLab 使用捆绑的 nginx 控制器提供 SSL 连接。GitLab 的 NGINX 设置
- 设置 GitLab 以转发 HTTP -> HTTPS,标准的东西。文档涵盖了大部分内容。
- 当让 LoadBalancer 处理 SSL 时,您只需指向一个秘密,这将起作用(它恰好是带有密钥的特定格式
tls.crt
和tls.key
,两者都是 pem 格式)。您可以通过将这两个键安装为文件然后更改 nginx 设置(ssl_certificate
和ssl_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 终止,因为这就是我们所有其他服务的工作方式,并且非同质性有点让我恼火:(
推荐阅读
- xamarin - 是否有任何解决方案可以在 xamarin.forms 中连续使用多个图像的图像滑块?
- express - 如何在 Digitial Ocean/AWS/GCP 中运行 express 应用程序并使用 cpanel(webmail) 中的邮件服务
- c++ - 我也收到垃圾输出
- jsp - 如何在 Vue.js 中使用 Axios 从 jsp 页面获取 JSON?
- django - 在原始查询集中使用 ILIKE 不区分大小写以检查其中一个字段是否以预定义字母开头
- tensorflow - 使用估计作为特征的多任务学习
- c# - AutoMapper 使用方法从源映射值
- android - 如何为 2019 年 1 月后更新的 AutocompleteSupportFragment api 设置过滤器
- javascript - 文件名和 img 显示问题
- python-2.7 - 使用 :'s 格式化 MAC 地址字符串