【问题标题】:Deploy Kong API Gateway in GKE via Helm and use Google managed certificates通过 Helm 在 GKE 中部署 Kong API Gateway 并使用 Google 托管的证书
【发布时间】:2020-11-17 18:00:05
【问题描述】:

我们目前正在尝试在 GKE 集群中部署 Kong,目标是将证书管理委托给 Google 的负载均衡器(应在此处进行 SSL 终止)。

我们面临的问题是,所有 Google 的文档都专注于部署一些服务并使用他们独有的负载均衡器直接连接到声明的 Ingress。

当前工作的配置(没有 Kong)如下:

# values.yml (from Service X inside GKE, using Helm)
...
ingress:
  enabled: true
  hostname: example.com
  annotations:
    kubernetes.io/ingress.class: gce
    kubernetes.io/ingress.allow-http: "false"
    kubernetes.io/ingress.global-static-ip-name: example-static-ip
    ingress.gcp.kubernetes.io/pre-shared-cert: example-cert
...

但是,当我们将 gce 更改为 kong 作为 ingress.class 时,所有其他注释都不会继续工作。这是意料之中的,因为现在 Kong 的代理是 Load Balancer,应该是告诉 Google 的 LB 如何生成自己的代理。

根据这个documentation,将这些注释添加到Kong代理服务应该相当简单。

基于这一系列事件:

  • K8s Ingress 创建 Kong 代理服务
  • Kong 代理服务生成 Google 的 LB

自定义LB的配置应该在Kong的服务中进行(据我了解):

# values.yml (Kong, using Helm)
...
proxy:
  type: LoadBalancer
  annotations: {} <-- Here
  http:
    ...
  tls:
    ...
...

但是,对于GCP来说,根据docs的只有几个,都没有想要的效果(不能设置要使用的证书,定义要创建哪种类型的LB等)

考虑到所有因素,有什么方法可以实现我们的主要目标:

“通过 GKE 内部的 Helm 部署 Kong API 网关,并将 SSL 终止委托给自定义 Google 的 LB。”

【问题讨论】:

    标签: kubernetes google-cloud-platform google-kubernetes-engine kong google-cloud-load-balancer


    【解决方案1】:

    TL;DR

    很遗憾,Kong Ingress 无法使用 Google 托管证书。

    确切地说,GKE 中的 Google 托管证书可用于:

    • 外部 HTTP(S) 负载平衡的入口

    文档指出:

    注意:此功能仅适用于外部 HTTP(S) 负载平衡的 Ingress。

    -- Cloud.google.com: Kubernetes Engine: Docs: How to: Managed certs



    说明

    根据文档(略有修改):

    当您使用以下类创建 Ingress 对象时:

    • kubernetes.io/ingress.class: gce

    GKE Ingress 控制器创建一个Google Cloud HTTP(S) Load Balancer 并根据 Ingress 及其关联服务中的信息对其进行配置。

    -- Cloud.google.com: Kubernetes Engine: Ingress: Ingress for external and internal traffic

    使用不同的 Ingress 控制器,如 (nginx-ingress, traefik, kong) 要求您使用 Service 类型的 LoadBalancer

    GKE 中使用上面的Service 将自动创建指向您的Ingress 控制器的External TCP/UDP Network Load Balancer (L4)。从此时起,流量将被重定向到基于 Ingress 资源和适当的 ingress.class 的特定服务。

    小费!

    您可以在 Kong 的 helm chart 中看到它使用相同的方式!

    • helm install kong/kong kong-ingress --dry-run --debug

    要在客户端和 kong 之间建立安全连接,您需要任一

    旁注:在这两种方式中,SSL 终止都将在 Ingress 控制器处发生。


    回答部分问题:

    自定义LB的配置应该在Kong的服务中进行(据我了解):

    # values.yml (Kong, using Helm)
    ...
    proxy:
      type: LoadBalancer
      annotations: {} <-- Here
    ...
    

    但是对于GCP来说,根据docs的只有几个,都没有想要的效果(不能设置要使用的证书,定义要创建哪种类型的LB等)

    如前所述,LoadBalancerGKE 中的 Service 类型将配置 L4 TCP/UDP LoadBalancer,它不负责处理 SSL 流量(SSL 终止)。


    其他资源:

    【讨论】:

    • 太好了,感谢您澄清了很多方面。我想知道的最后一个细节是,当您说“使用以其他方式提供的证书” 时,GCP 可能是一个选项。然而,正如我们意识到的那样,它们都不能被下载然后作为秘密注入(尽管它们有其他限制)。所以,总而言之,证书应该是由其他人签发的,对吗?
    • 是的,你是对的。选项之一可能是:letsencrypt.org。我添加了cert-manager 作为可行的解决方案。它可以使用lets-encrypt 来提供证书。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 2022-07-01
    • 2021-05-15
    相关资源
    最近更新 更多