K8S 网关 API(azure 实现)资源中的 TLS 终止?

问题描述 投票:0回答:1

我们正在为容器设置Azure 应用程序网关,它是 k8s 网关 API 的实现。

我已经能够在网关和多站点托管中设置具有 TLS 终止功能的工作 POC。

但是,我遇到的问题是我想使用用于应用程序部署的自定义 helm 图表来部署这些资源。

到目前为止,我的设置方法是在网关资源中添加多个 TLS 证书:

apiVersion: gateway.networking.k8s.io/v1
kind: Gateway
metadata:
  annotations:
    alb.networking.azure.io/alb-name: alb-test-spoke-2
    alb.networking.azure.io/alb-namespace:system
  name: alb-gw-tls
  namespace:system
spec:
  gatewayClassName: azure-alb-external
  listeners:
  - allowedRoutes:
      namespaces:
        from: All
    hostname: first-api.dev
    name: https-listener-first-api
    port: 443
    protocol: HTTPS
    tls:
      certificateRefs:
      - kind: Secret
        name: first-api-tls-certificate
      mode: Terminate
  - allowedRoutes:
      namespaces:
        from: All
    hostname: second-api.dev
    name: https-listener-second-api
    port: 443
    protocol: HTTPS
    tls:
      certificateRefs:
      - kind: Secret
        name: second-api-tls-certificate
      mode: Terminate

这可行,但据我所知,使用 Helm Chart 来实现此操作并不可行,因为这种方法需要我手动为每个新应用程序向网关添加新的路由/tls 证书引用,而我不想这样做。

我可以为每个应用程序创建一个新网关,但由于某种原因Azure 将连接到容器的 Azure 应用程序网关的网关(前端)数量限制为 5,这使得这种方法非常笨拙。

我尝试考虑终止 HttpRoute Resouce 中的 TLS,但这似乎不是受支持的功能。

是否有其他人建议我如何将这些资源创建为独立资源(文件),以便使用我们的 helm-chart 轻松部署?

azure kubernetes gateway
1个回答
0
投票

如上所述,Azure 应用程序网关容器的“限制”为每个网关五个前端,目前无法增加。要解决此限制,您可以使用通配符证书,允许单个网关资源处理多个子域的 TLS 终止。通过此设置,您只需管理每个新应用程序的 HTTPRoute 资源,从而消除了对主网关配置的频繁更新。 在集群上安装

Gateway API CRD

kubectl apply -k "github.com/kubernetes-sigs/gateway-api/config/crd/experimental?ref=v0.5.0"

如果您有通配符证书,请为其创建一个密钥,或者如果您为每个主机名使用单独的证书,请为每个证书创建密钥。

enter image description here enter image description here使用通配符或单独证书更新具有 TLS 终止功能的网关 yaml。

apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: annotations: alb.networking.azure.io/alb-name: alb-test-spoke-2 alb.networking.azure.io/alb-namespace: system name: alb-gw-tls namespace: system spec: gatewayClassName: azure-alb-external listeners: - name: https-listener-first-api port: 443 protocol: HTTPS hostname: "first-api.dev" tls: mode: Terminate certificateRefs: - kind: Secret name: first-api-tls-certificate namespace: system allowedRoutes: namespaces: from: All - name: https-listener-second-api port: 443 protocol: HTTPS hostname: "second-api.dev" tls: mode: Terminate certificateRefs: - kind: Secret name: second-api-tls-certificate namespace: system allowedRoutes: namespaces: from: All

enter image description here为网关创建 Helm Chart,以简化动态添加多个侦听器的过程。

enter image description here编辑以下值

values.yaml

listeners: - hostname: "first-api.dev" tlsSecretName: "first-api-tls-certificate" - hostname: "second-api.dev" tlsSecretName: "second-api-tls-certificate"

模板/gateway.yaml

apiVersion: gateway.networking.k8s.io/v1 kind: Gateway metadata: annotations: alb.networking.azure.io/alb-name: alb-test-spoke-2 alb.networking.azure.io/alb-namespace: system name: alb-gw-tls namespace: system spec: gatewayClassName: azure-alb-external listeners: {{- range .Values.listeners }} - name: https-listener-{{ .hostname | replace "." "-" }} port: 443 protocol: HTTPS hostname: {{ .hostname }} tls: mode: Terminate certificateRefs: - name: {{ .tlsSecretName }} kind: Secret namespace: system allowedRoutes: namespaces: from: All {{- end }}

部署网关图表

helm install alb-gateway ./gateway-chart -n system

此命令将创建带有 
first-api.dev

second-api.dev
监听器的网关。如果您将来需要添加其他侦听器,只需更新
values.yaml
对于每个应用程序,创建一个引用网关的单独的 

HTTPRoute

资源。此设置允许您将流量路由到新应用程序,而无需修改网关配置。 apiVersion: gateway.networking.k8s.io/v1alpha2 kind: HTTPRoute metadata: name: first-api-route namespace: app-namespace spec: parentRefs: - name: alb-gw-tls namespace: system hostnames: - "first-api.dev" rules: - matches: - path: type: Prefix value: / backendRefs: - name: first-api-service port: 80

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.